From aaa74bf40e6508a5ca6a5fa45f290679c4b5ae6f Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 15:32:35 +0100 Subject: [PATCH 01/38] Add initial pass for fetching game listings with list & topic --- ClientCore/CnCNet5/CnCNetGame.cs | 2 + ClientCore/CnCNet5/GameCollection.cs | 5 +- ClientCore/Resources/ra2icon.png | Bin 0 -> 1769 bytes .../CnCNet/CnCNetGameLoadingLobby.cs | 2 +- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 232 ++++++++++-------- .../DXGUI/Multiplayer/GameInformationPanel.cs | 18 +- DXMainClient/DXGUI/Multiplayer/GameListBox.cs | 10 +- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 54 +++- .../Domain/Multiplayer/GenericHostedGame.cs | 3 + DXMainClient/Online/CnCNetManager.cs | 27 ++ DXMainClient/Online/Connection.cs | 46 +++- DXMainClient/Online/IConnectionManager.cs | 5 +- 12 files changed, 289 insertions(+), 115 deletions(-) create mode 100644 ClientCore/Resources/ra2icon.png diff --git a/ClientCore/CnCNet5/CnCNetGame.cs b/ClientCore/CnCNet5/CnCNetGame.cs index 24e7e6561..719f33961 100644 --- a/ClientCore/CnCNet5/CnCNetGame.cs +++ b/ClientCore/CnCNet5/CnCNetGame.cs @@ -34,6 +34,8 @@ public class CnCNetGame public Texture2D Texture { get; set; } + public Texture2D TextureSpecialGameMode { get; set; } + /// /// The location where to read the game's installation path from the registry. /// diff --git a/ClientCore/CnCNet5/GameCollection.cs b/ClientCore/CnCNet5/GameCollection.cs index b5b792438..d810a61a8 100644 --- a/ClientCore/CnCNet5/GameCollection.cs +++ b/ClientCore/CnCNet5/GameCollection.cs @@ -31,6 +31,7 @@ public void Initialize() using Stream tsIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.tsicon.png"); using Stream moIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.moicon.png"); using Stream yrIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.yricon.png"); + using Stream ra2IconStream = assembly.GetManifestResourceStream("ClientCore.Resources.ra2icon.png"); using Stream rrIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.rricon.png"); using Stream reIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.reicon.png"); using Stream cncrIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.cncricon.png"); @@ -44,6 +45,7 @@ public void Initialize() using var tiIcon = Image.Load(tiIconStream); using var tsIcon = Image.Load(tsIconStream); using var moIcon = Image.Load(moIconStream); + using var ra2Icon = Image.Load(ra2IconStream); using var yrIcon = Image.Load(yrIconStream); using var rrIcon = Image.Load(rrIconStream); using var reIcon = Image.Load(reIconStream); @@ -179,7 +181,8 @@ public void Initialize() InternalName = "yr", RegistryInstallPath = "HKLM\\Software\\Westwood\\Yuri's Revenge", UIName = "Yuri's Revenge", - Texture = AssetLoader.TextureFromImage(yrIcon) + Texture = AssetLoader.TextureFromImage(yrIcon), + TextureSpecialGameMode = AssetLoader.TextureFromImage(ra2Icon) }, new() diff --git a/ClientCore/Resources/ra2icon.png b/ClientCore/Resources/ra2icon.png new file mode 100644 index 0000000000000000000000000000000000000000..73013f9888dc7da69ec9e31717dcf5fe7ae4a9b4 GIT binary patch literal 1769 zcmaJ?X;2eq7!INWD#ZgVg1|OhijqwN1QG}s2uGv=3@PFWNJth4kliI&NVqKEL9jUD zQSbmov5Eq64k7}!oLUc#icSGR8KG)XwCGf@4c(w%f0XXb?sv@dJn!?q-}}vG2l#pG zE;Cw2AP{spK5QO7u2jF;OYyJSP66eWh4#EI)Sh=5qcByM-$ zlDVh{6fO2imO_EaetcnatdK4uy14=_3I;A9fiMA}ki@|}_R0nLt1a}sO@sAQ@=NVWsXG+PRV;Xq}O9e_^{ z5f3O8MKXA7uTSCd6_Xf^VJHIx<#IVmZbw3-Q6Pm*r-NiFNTu512wPbaj0qIBu*`f; zfep!oQZb5&5g1S_3L=mMj7h}Je#}CG&db8GPnE)J1}X$7NFkBcSPpWERWL$$`#tqS=ut6i+XfJB{t(?&)Oj zRiESM-_dz93iK4-yoQ%!Z`mL`dW%MI^v%(hTv!UYr)x`@|J3 z?1jD{7sSng>ZASFQO|AR{iB}F_b$Ge?|ulzTV9IywuN}w55F?O95#!u=szF06EXHQ zWY*LSg{GM7I?|so7*bGwY3q1h%)#>g-Mv9ElLVd(+rWms%`BJjrY+VojAgUhjbPBG zdDYs&eOr1aA5MB^$t^jW`!-MCTQWXf-8_Cp9+jWHQ)h_YI~94pCv|x0Uh1BFyWQvO zZW9*!?A_w79lCXWPxO~bZ`c#hANqF;k7gAW*r?hAcCB~(_WjA>5i}&fv(sX)PJ+j| zp8_gp3T3BjkY>w9tL$e`W9A1Zf2}+5&ZYGRi!QG?v-zBa>iN}B(-8~Ac<_};Y*1Pk z9Cv?5VlYE4X+N1qC|&ZW-r<$z&D?#hM{~>9c60;=tDH0Z!L_n=XC_)iUL36~-x9}D zMdggz-lci@nEuZZ@p;E9Ou61SW=5KR3673*Ugk0?^))=>v(2hXbI(|m`B5$8tUcJ$ z8`o`^f8F?Ij`sWK-o8J?#Eldmx=5<%66fqy+DZ-9EE)`bS=VI!q+*}X zT$6AVF?`0=er?uUH6woCsN2XduT@yzyX<>Y&aWPCt1^9ge==V9LRHZR3!8IPO~itD zy;sK!MJI|LezUEdqV2r#ul5*nWr15rT#DA6!At(pA(mGw^vh28%G#Cn4_wK|BD>|Z zs%gm@PU-&ER#*GA8P2DTT8e2#%YWQuF}ZViV8Xw@LFH4hDKV_rW_kT>{L9X&>8tHC_QhM>zu$F$MMU+5|`9C=|g%4?U-c6F1- zs?xJ)wUq>++?e?8g(gfK;1%_aZ%wLsg68WxrC8J+acz6C zHd8~R=66&3-EUfy&yHVv^*HQ$B_lstg(zdy!r$4t3ra7F+48==2R(Z%ldQPAfAX z^gml(a?tz0R3ERWsZG0kOn=ncXvMvY{05}9bC6PqjJ@-`nDC(J*Og|+z6&kOHMbDtZR7A&nGb;oA?KC?Un?mJ;n))g$@75G=0SXl qGt+AR&d55~$9dd9Qt7Eyg%ik!<23ZDEAFa)J{(U!_7(T=%zpqtWWQ7Z literal 0 HcmV?d00001 diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs index ab9a68a6f..f80a4dd18 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs @@ -235,7 +235,7 @@ public void OnJoined() if (IsHost) { connectionManager.SendCustomMessage(new QueuedMessage( - string.Format("MODE {0} +klnNs {1} {2}", channel.ChannelName, + string.Format("MODE {0} +klnN {1} {2}", channel.ChannelName, channel.Password, SGPlayers.Count), QueuedMessageType.SYSTEM_MESSAGE, 50)); diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 2a7ff5a8b..d9246e4d6 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -540,6 +540,7 @@ private void PostUIInit() connectionManager.WelcomeMessageReceived += ConnectionManager_WelcomeMessageReceived; connectionManager.Disconnected += ConnectionManager_Disconnected; connectionManager.PrivateCTCPReceived += ConnectionManager_PrivateCTCPReceived; + connectionManager.ChannelListReceived += ConnectionManager_ChannelListReceived; cncnetUserData.UserFriendToggled += RefreshPlayerList; cncnetUserData.UserIgnoreToggled += RefreshPlayerList; @@ -591,6 +592,137 @@ private void PostUIInit() GameProcessLogic.GameProcessExited += SharedUILogic_GameProcessExited; } + private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEventArgs e) + { + Logger.Log($"GameBroadcastChannel_ChannelListReceived ** {e.ChannelName}, {e.Topic}"); + + var cncnetManager = (CnCNetManager)sender; + + // Ensure the topic starts with "GAME " as expected + if (!e.Topic.StartsWith("GAME ")) + { + return; + } + + // Extract the game information from the topic string + string msg = e.Topic.Substring(5); // Cut out "GAME " part + string[] splitMessage = msg.Split(new char[] { ';' }); + + // Ensure the message has the expected number of parts + if (splitMessage.Length != 14) + { + Logger.Log("Ignoring game message because of an invalid number of parameters."); + return; + } + + try + { + string revision = splitMessage[0]; + if (revision != ProgramConstants.CNCNET_PROTOCOL_REVISION) + { + return; + } + + string gameVersion = splitMessage[1]; + int maxPlayers = Conversions.IntFromString(splitMessage[2], 0); + string gameRoomChannelName = splitMessage[3]; + string gameRoomDisplayName = splitMessage[4]; + bool locked = Conversions.BooleanFromString(splitMessage[5].Substring(0, 1), true); + bool isCustomPassword = Conversions.BooleanFromString(splitMessage[5].Substring(1, 1), false); + bool isClosed = Conversions.BooleanFromString(splitMessage[5].Substring(2, 1), true); + bool isLoadedGame = Conversions.BooleanFromString(splitMessage[5].Substring(3, 1), false); + bool isLadder = Conversions.BooleanFromString(splitMessage[5].Substring(4, 1), false); + string[] players = splitMessage[6].Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); + string hostName = players[0]; // Assume host is always first in the list + List playerNames = players.ToList(); + string mapName = splitMessage[7]; + string gameMode = splitMessage[8]; + + string[] tunnelAddressAndPort = splitMessage[9].Split(':'); + string tunnelAddress = tunnelAddressAndPort[0]; + int tunnelPort = int.Parse(tunnelAddressAndPort[1]); + + string loadedGameId = splitMessage[10]; + bool isSpecialGameMode = Conversions.BooleanFromString(splitMessage[11], false); + bool hasSupers = Conversions.BooleanFromString(splitMessage[12], false); + bool hasCrates = Conversions.BooleanFromString(splitMessage[13], false); + + // @TODO: Find the CnCNet game and tunnel information based on the channel name + CnCNetGame cncnetGame = gameCollection.GameList.Find(g => g.InternalName == "yr"); + CnCNetTunnel tunnel = tunnelHandler.Tunnels.Find(t => t.Address == tunnelAddress && t.Port == tunnelPort); + + if (tunnel == null || cncnetGame == null) + { + return; + } + + HostedCnCNetGame game = new HostedCnCNetGame( + gameRoomChannelName, + revision, + gameVersion, + maxPlayers, + gameRoomDisplayName, + isCustomPassword, + true, + players, + hostName, + mapName, + gameMode + ); + + game.IsLoadedGame = isLoadedGame; + game.MatchID = loadedGameId; + game.LastRefreshTime = DateTime.Now; + game.IsLadder = isLadder; + game.Game = cncnetGame; + game.Locked = locked || (game.IsLoadedGame && !game.Players.Contains(ProgramConstants.PLAYERNAME)); + game.Incompatible = cncnetGame == localGame && game.GameVersion != ProgramConstants.GAME_VERSION; + game.TunnelServer = tunnel; + game.HasSpecialGameMode = isSpecialGameMode; + game.HasCrates = hasCrates; + game.HasSupers = hasSupers; + + // If the game is closed, remove it from the list + if (isClosed) + { + int index = lbGameList.HostedGames.FindIndex(hg => ((HostedCnCNetGame)hg).HostName == hostName); + + if (index > -1) + { + lbGameList.RemoveGame(index); + + // Dismiss any outstanding invitations that are no longer valid + DismissInvalidInvitations(); + } + + return; + } + + int gameIndex = lbGameList.HostedGames.FindIndex(hg => ((HostedCnCNetGame)hg).HostName == hostName); + if (gameIndex > -1) + { + lbGameList.HostedGames[gameIndex] = game; + } + else + { + if (UserINISettings.Instance.PlaySoundOnGameHosted && + cncnetGame.InternalName == localGameID.ToLower() && + !ProgramConstants.IsInGame && !game.Locked) + { + SoundPlayer.Play(sndGameCreated); + } + + lbGameList.AddGame(game); + } + + SortAndRefreshHostedGames(); + } + catch (Exception ex) + { + Logger.Log("Game parsing error: " + ex.ToString()); + } + } + /// /// Displays a message when the IRC server has informed that the local user /// has been banned from a channel that they're attempting to join. @@ -1460,106 +1592,6 @@ private void GameBroadcastChannel_CTCPReceived(object sender, ChannelCTCPEventAr updateMessageBox.YesClickedAction = UpdateMessageBox_YesClicked; } } - - if (!e.Message.StartsWith("GAME ")) - return; - - string msg = e.Message.Substring(5); // Cut out GAME part - string[] splitMessage = msg.Split(new char[] { ';' }); - - if (splitMessage.Length != 11) - { - Logger.Log("Ignoring CTCP game message because of an invalid amount of parameters."); - return; - } - - try - { - string revision = splitMessage[0]; - if (revision != ProgramConstants.CNCNET_PROTOCOL_REVISION) - return; - string gameVersion = splitMessage[1]; - int maxPlayers = Conversions.IntFromString(splitMessage[2], 0); - string gameRoomChannelName = splitMessage[3]; - string gameRoomDisplayName = splitMessage[4]; - bool locked = Conversions.BooleanFromString(splitMessage[5].Substring(0, 1), true); - bool isCustomPassword = Conversions.BooleanFromString(splitMessage[5].Substring(1, 1), false); - bool isClosed = Conversions.BooleanFromString(splitMessage[5].Substring(2, 1), true); - bool isLoadedGame = Conversions.BooleanFromString(splitMessage[5].Substring(3, 1), false); - bool isLadder = Conversions.BooleanFromString(splitMessage[5].Substring(4, 1), false); - string[] players = splitMessage[6].Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); - List playerNames = players.ToList(); - string mapName = splitMessage[7]; - string gameMode = splitMessage[8]; - - string[] tunnelAddressAndPort = splitMessage[9].Split(':'); - string tunnelAddress = tunnelAddressAndPort[0]; - int tunnelPort = int.Parse(tunnelAddressAndPort[1]); - - string loadedGameId = splitMessage[10]; - - CnCNetGame cncnetGame = gameCollection.GameList.Find(g => g.GameBroadcastChannel == channel.ChannelName); - - CnCNetTunnel tunnel = tunnelHandler.Tunnels.Find(t => t.Address == tunnelAddress && t.Port == tunnelPort); - - if (tunnel == null) - return; - - if (cncnetGame == null) - return; - - HostedCnCNetGame game = new HostedCnCNetGame(gameRoomChannelName, revision, gameVersion, maxPlayers, - gameRoomDisplayName, isCustomPassword, true, players, - e.UserName, mapName, gameMode); - game.IsLoadedGame = isLoadedGame; - game.MatchID = loadedGameId; - game.LastRefreshTime = DateTime.Now; - game.IsLadder = isLadder; - game.Game = cncnetGame; - game.Locked = locked || (game.IsLoadedGame && !game.Players.Contains(ProgramConstants.PLAYERNAME)); - game.Incompatible = cncnetGame == localGame && game.GameVersion != ProgramConstants.GAME_VERSION; - game.TunnelServer = tunnel; - - if (isClosed) - { - int index = lbGameList.HostedGames.FindIndex(hg => hg.HostName == e.UserName); - - if (index > -1) - { - lbGameList.RemoveGame(index); - - // dismiss any outstanding invitations that are no longer valid - DismissInvalidInvitations(); - } - - return; - } - - // Seek for the game in the internal game list based on the name of its host; - // if found, then refresh that game's information, otherwise add as new game - int gameIndex = lbGameList.HostedGames.FindIndex(hg => hg.HostName == e.UserName); - - if (gameIndex > -1) - { - lbGameList.HostedGames[gameIndex] = game; - } - else - { - if (UserINISettings.Instance.PlaySoundOnGameHosted && - cncnetGame.InternalName == localGameID.ToLower() && - !ProgramConstants.IsInGame && !game.Locked) - { - SoundPlayer.Play(sndGameCreated); - } - - lbGameList.AddGame(game); - } - SortAndRefreshHostedGames(); - } - catch (Exception ex) - { - Logger.Log("Game parsing error: " + ex.ToString()); - } } private void UpdateMessageBox_YesClicked(XNAMessageBox messageBox) => diff --git a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs index 8a92876c8..54758df0b 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs @@ -29,6 +29,8 @@ public GameInformationPanel(WindowManager windowManager, MapLoader mapLoader) private XNALabel lblHost; private XNALabel lblPing; private XNALabel lblPlayers; + private XNALabel lblCrates; + private XNALabel lblSupers; private XNALabel[] lblPlayerNames; public override void Initialize() @@ -56,8 +58,14 @@ public override void Initialize() lblPing = new XNALabel(WindowManager); lblPing.ClientRectangle = new Rectangle(6, 126, 0, 0); + lblCrates = new XNALabel(WindowManager); + lblCrates.ClientRectangle = new Rectangle(6, 150, 0, 0); + + lblSupers = new XNALabel(WindowManager); + lblSupers.ClientRectangle = new Rectangle(6, 174, 0, 0); + lblPlayers = new XNALabel(WindowManager); - lblPlayers.ClientRectangle = new Rectangle(6, 150, 0, 0); + lblPlayers.ClientRectangle = new Rectangle(6, 198, 0, 0); lblPlayerNames = new XNALabel[MAX_PLAYERS]; for (int i = 0; i < lblPlayerNames.Length / 2; i++) @@ -83,6 +91,8 @@ public override void Initialize() AddChild(lblHost); AddChild(lblPing); AddChild(lblPlayers); + AddChild(lblCrates); + AddChild(lblSupers); AddChild(lblGameInformation); lblGameInformation.CenterOnParent(); @@ -132,6 +142,12 @@ public void SetInfo(GenericHostedGame game) { lblPlayerNames[i].Visible = false; } + + lblCrates.Text = "Crates:".L10N("Client:Main:GameInfoCrates") + " " + Renderer.GetSafeString(game.HasCrates ? "Yes" : "No", lblCrates.FontIndex); + lblCrates.Visible = true; + + lblSupers.Text = "Superweapons:".L10N("Client:Main:GameInfoSupers") + " " + Renderer.GetSafeString(game.HasSupers ? "Yes" : "No", lblSupers.FontIndex); + lblSupers.Visible = true; } public void ClearInfo() diff --git a/DXMainClient/DXGUI/Multiplayer/GameListBox.cs b/DXMainClient/DXGUI/Multiplayer/GameListBox.cs index c7a3d4c2a..e2fef5ddb 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameListBox.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameListBox.cs @@ -303,11 +303,13 @@ public override void Draw(GameTime gameTime) var hostedGame = (GenericHostedGame)lbItem.Tag; - DrawTexture(hostedGame.Game.Texture, - new Rectangle(x, height, - hostedGame.Game.Texture.Width, hostedGame.Game.Texture.Height), Color.White); + var hostedGameTexture = hostedGame.HasSpecialGameMode == true && hostedGame.Game.TextureSpecialGameMode != null ? + hostedGame.Game.TextureSpecialGameMode : + hostedGame.Game.Texture; - x += hostedGame.Game.Texture.Width + ICON_MARGIN; + DrawTexture(hostedGameTexture, new Rectangle(x, height, hostedGameTexture.Width, hostedGameTexture.Height), Color.White); + + x += hostedGameTexture.Width + ICON_MARGIN; if (hostedGame.Locked) { diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 6dd2e2fea..0b1feeb07 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -235,6 +235,9 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, RandomSeed = new Random().Next(); RefreshMapSelectionUI(); btnChangeTunnel.Enable(); + + StringBuilder topic = BuildGameBroadcastingString(); + connectionManager.SetChannelTopic(channel, topic.ToString()); } else { @@ -264,7 +267,7 @@ public void OnJoined() if (IsHost) { connectionManager.SendCustomMessage(new QueuedMessage( - string.Format("MODE {0} +klnNs {1} {2}", channel.ChannelName, + string.Format("MODE {0} +klnN {1} {2}", channel.ChannelName, channel.Password, playerLimit), QueuedMessageType.SYSTEM_MESSAGE, 50)); @@ -1893,6 +1896,43 @@ private void BroadcastGame() if (ProgramConstants.IsInGame && broadcastChannel.Users.Count > 500) return; + StringBuilder sb = BuildGameBroadcastingString(); + + // @TODO: Sending ctcp for broadcasting may not be needed now, if its only informing cncnet lobby + broadcastChannel.SendCTCPMessage(sb.ToString(), QueuedMessageType.SYSTEM_MESSAGE, 20); + + // @TODO: Perhaps we should only update the topic when something has changed? + connectionManager.SetChannelTopic(channel, sb.ToString()); + } + + private StringBuilder BuildGameBroadcastingString() + { + // @TODO: Do we need a way to allow games/mods to specify their additional game options they want to broadcast + // For now hardcoded bits + + bool isSpecialGameMode = false; + bool hasCrates = false; + bool hasSupers = false; + for (int i = 0; i < CheckBoxes.Count; i++) + { + var checkbox = CheckBoxes[i]; + if (checkbox.Name == "chkRA2Mode" && checkbox.Checked) + { + isSpecialGameMode = true; + continue; + } + if (checkbox.Name == "chkCrates" && checkbox.Checked) + { + hasCrates = true; + continue; + } + if (checkbox.Name == "chkSuperWeapons" && checkbox.Checked) + { + hasSupers = true; + continue; + } + } + StringBuilder sb = new StringBuilder("GAME "); sb.Append(ProgramConstants.CNCNET_PROTOCOL_REVISION); sb.Append(";"); @@ -1925,11 +1965,19 @@ private void BroadcastGame() sb.Append(";"); sb.Append(GameMode?.UntranslatedUIName ?? string.Empty); sb.Append(";"); - sb.Append(tunnelHandler.CurrentTunnel.Address + ":" + tunnelHandler.CurrentTunnel.Port); + sb.Append(tunnelHandler?.CurrentTunnel?.Address + ":" + tunnelHandler?.CurrentTunnel?.Port); sb.Append(";"); sb.Append(0); // LoadedGameId + sb.Append(";"); - broadcastChannel.SendCTCPMessage(sb.ToString(), QueuedMessageType.SYSTEM_MESSAGE, 20); + // Append additional game info (11 onwards) + sb.Append(isSpecialGameMode ? "1" : "0"); + sb.Append(";"); + sb.Append(hasSupers ? "1" : "0"); + sb.Append(";"); + sb.Append(hasCrates ? "1" : "0"); + + return sb; } #endregion diff --git a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs index 34c6b4848..b8ac2b2b1 100644 --- a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs +++ b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs @@ -20,6 +20,9 @@ public abstract class GenericHostedGame: IEquatable public string GameVersion { get; set; } public string HostName { get; set; } public string[] Players { get; set; } + public bool HasSpecialGameMode { get; set; } + public bool HasCrates { get; set; } + public bool HasSupers { get; set; } public int MaxPlayers { get; set; } = 8; diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index 1b3845952..43fa89a05 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -33,6 +33,7 @@ public class CnCNetManager : IConnectionManager public event EventHandler PrivateMessageReceived; public event EventHandler PrivateCTCPReceived; public event EventHandler BannedFromChannel; + public event EventHandler ChannelListReceived; public event EventHandler AttemptedServerChanged; public event EventHandler ConnectAttemptFailed; @@ -260,6 +261,27 @@ private void DoChannelModesChanged(string userName, string channelName, string m channel.OnChannelModesChanged(userName, modeString); } + public void OnChannelListReceived(List> channelList) + { + Logger.Log("OnChannelListReceived called"); + + foreach (var nameTopic in channelList) + { + string channelName = nameTopic.Item1; + string channelTopic = nameTopic.Item2; + Logger.Log($"OnChannelListReceived: channelName: {channelName} channelTopic: {channelTopic}"); + + Channel channel = FindChannel(channelName); + wm.AddCallback(new Action(DoChannelListReceived), channelName, channelTopic); + } + } + + private void DoChannelListReceived(string channelName, string channelTopic) + { + // Broadcast the channel list and topics to the UI + ChannelListReceived?.Invoke(this, new ChannelTopicEventArgs(channelName, channelTopic)); + } + private void ApplyChannelModes(Channel channel, string modeString, List modeParameters) { bool addMode = true; @@ -947,6 +969,11 @@ private void DoServerLatencyTested(int candidateCount, int closerCount) "Lobby servers: {0} available, {1} fast.".L10N("Client:Main:LobbyServerLatencyTestResult"), candidateCount, closerCount))); } + + public void SetChannelTopic(Channel channel, string topic) + { + connection.SetChannelTopic(channel.ChannelName, topic); + } } public class UserEventArgs : EventArgs diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 15ad88087..540ea7635 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -121,6 +121,7 @@ private bool disconnect private static bool idSet = false; private static string systemId; private static readonly object idLocker = new object(); + private readonly List> _channelList = []; public static void SetId(string id) { @@ -229,7 +230,8 @@ private void HandleComm() Register(); - Timer timer = new Timer(AutoPing, null, 30000, 120000); + Timer pingTimer = new Timer(AutoPing, null, 30000, 120000); + Timer gameChanneListTimer = new Timer(RequestChannelList, null, 30000, 30000); connectionCut = true; @@ -278,11 +280,14 @@ private void HandleComm() Logger.Log("Message received: " + msg); HandleMessage(msg); - timer.Change(30000, 30000); + pingTimer.Change(30000, 30000); } - timer.Change(Timeout.Infinite, Timeout.Infinite); - timer.Dispose(); + pingTimer.Change(Timeout.Infinite, Timeout.Infinite); + pingTimer.Dispose(); + + gameChanneListTimer.Change(Timeout.Infinite, Timeout.Infinite); + gameChanneListTimer.Dispose(); _isConnected = false; disconnect = false; @@ -600,6 +605,16 @@ private void PerformCommand(string message) string awayReason = parameters[2]; connectionManager.OnAwayMessageReceived(awayPlayer, awayReason); break; + case 322: // Channel information from LIST command + string listChannelName = parameters[1]; + string listChannelTopic = parameters[3]; + _channelList.Add(Tuple.Create(listChannelName, listChannelTopic)); + break; + case 323: // End of the LIST command + Logger.Log($"End of Channel LIST"); + connectionManager.OnChannelListReceived(_channelList); + _channelList.Clear(); + break; case 332: // Channel topic message string _target = parameters[0]; if (_target != ProgramConstants.PLAYERNAME) @@ -933,6 +948,29 @@ private void Register() SendMessage("NICK " + ProgramConstants.PLAYERNAME); } + private void RequestChannelList(object state) + { + if (IsConnected) + { + // @TODO + string pattern = "#cncnet-yr-game*"; + string listCommand = $"LIST {pattern}"; + Logger.Log($"RequestChannelList: {listCommand}"); + + QueueMessage(new QueuedMessage(listCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); + } + } + + public void SetChannelTopic(string channelName, string newTopic) + { + // Send the TOPIC command to the IRC server with the desired topic. + string topicCommand = $"TOPIC {channelName} :{newTopic}"; + Logger.Log($"Setting topic for {channelName}: {newTopic}"); + + // Queue the message to be sent to the server. + QueueMessage(new QueuedMessage(topicCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); + } + public void ChangeNickname() { SendMessage("NICK " + ProgramConstants.PLAYERNAME); diff --git a/DXMainClient/Online/IConnectionManager.cs b/DXMainClient/Online/IConnectionManager.cs index f283245ab..2487b597c 100644 --- a/DXMainClient/Online/IConnectionManager.cs +++ b/DXMainClient/Online/IConnectionManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace DTAClient.Online { @@ -27,6 +28,8 @@ public interface IConnectionManager void OnChannelInviteOnly(string channelName); + void OnChannelListReceived(List> channelList); + void OnIncorrectChannelPassword(string channelName); void OnCTCPParsed(string channelName, string userName, string message); From 031ae8d319cfe6896a4f2f33476d5eed0f8404f5 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 15:36:22 +0100 Subject: [PATCH 02/38] Consistency on naming --- DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 4 ++-- DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index d9246e4d6..502c7f0f5 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -643,7 +643,7 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv int tunnelPort = int.Parse(tunnelAddressAndPort[1]); string loadedGameId = splitMessage[10]; - bool isSpecialGameMode = Conversions.BooleanFromString(splitMessage[11], false); + bool hasSpecialGameMode = Conversions.BooleanFromString(splitMessage[11], false); bool hasSupers = Conversions.BooleanFromString(splitMessage[12], false); bool hasCrates = Conversions.BooleanFromString(splitMessage[13], false); @@ -678,7 +678,7 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv game.Locked = locked || (game.IsLoadedGame && !game.Players.Contains(ProgramConstants.PLAYERNAME)); game.Incompatible = cncnetGame == localGame && game.GameVersion != ProgramConstants.GAME_VERSION; game.TunnelServer = tunnel; - game.HasSpecialGameMode = isSpecialGameMode; + game.HasSpecialGameMode = hasSpecialGameMode; game.HasCrates = hasCrates; game.HasSupers = hasSupers; diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 0b1feeb07..c1b36ce99 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1910,7 +1910,7 @@ private StringBuilder BuildGameBroadcastingString() // @TODO: Do we need a way to allow games/mods to specify their additional game options they want to broadcast // For now hardcoded bits - bool isSpecialGameMode = false; + bool hasSpecialGameMode = false; bool hasCrates = false; bool hasSupers = false; for (int i = 0; i < CheckBoxes.Count; i++) @@ -1918,7 +1918,7 @@ private StringBuilder BuildGameBroadcastingString() var checkbox = CheckBoxes[i]; if (checkbox.Name == "chkRA2Mode" && checkbox.Checked) { - isSpecialGameMode = true; + hasSpecialGameMode = true; continue; } if (checkbox.Name == "chkCrates" && checkbox.Checked) @@ -1971,7 +1971,7 @@ private StringBuilder BuildGameBroadcastingString() sb.Append(";"); // Append additional game info (11 onwards) - sb.Append(isSpecialGameMode ? "1" : "0"); + sb.Append(hasSpecialGameMode ? "1" : "0"); sb.Append(";"); sb.Append(hasSupers ? "1" : "0"); sb.Append(";"); From 8780cf6897c52c14ac5e16fd4dc69b1400d1bd42 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 15:37:55 +0100 Subject: [PATCH 03/38] Tidy up of checkbox checks --- .../DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index c1b36ce99..b6d26ff27 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1916,20 +1916,18 @@ private StringBuilder BuildGameBroadcastingString() for (int i = 0; i < CheckBoxes.Count; i++) { var checkbox = CheckBoxes[i]; + if (checkbox.Name == "chkRA2Mode" && checkbox.Checked) { hasSpecialGameMode = true; - continue; } - if (checkbox.Name == "chkCrates" && checkbox.Checked) + else if (checkbox.Name == "chkCrates" && checkbox.Checked) { hasCrates = true; - continue; } - if (checkbox.Name == "chkSuperWeapons" && checkbox.Checked) + else if (checkbox.Name == "chkSuperWeapons" && checkbox.Checked) { hasSupers = true; - continue; } } From f39bcefaaa61e355621a52bdd05cae38535a597a Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 16:02:24 +0100 Subject: [PATCH 04/38] Upon MOTD received, request channel list --- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 1 + DXMainClient/Online/Connection.cs | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index b6d26ff27..a415c1fdd 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1913,6 +1913,7 @@ private StringBuilder BuildGameBroadcastingString() bool hasSpecialGameMode = false; bool hasCrates = false; bool hasSupers = false; + for (int i = 0; i < CheckBoxes.Count; i++) { var checkbox = CheckBoxes[i]; diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 540ea7635..95b0d3107 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -569,6 +569,10 @@ private void PerformCommand(string message) connectionManager.OnWelcomeMessageReceived(message); reconnectCount = 0; break; + case 376: // End of MOTD + case 422: // Server has no MOTD + RequestChannelList(null); + break; case 002: // "Your host is x, running version y" case 003: // "This server was created..." case 251: // There are users and invisible on servers @@ -950,15 +954,14 @@ private void Register() private void RequestChannelList(object state) { - if (IsConnected) - { - // @TODO - string pattern = "#cncnet-yr-game*"; - string listCommand = $"LIST {pattern}"; - Logger.Log($"RequestChannelList: {listCommand}"); + Logger.Log("RequestChannelList"); - QueueMessage(new QueuedMessage(listCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); - } + // @TODO + string pattern = "#cncnet-yr-game*"; + string listCommand = $"LIST {pattern}"; + Logger.Log($"RequestChannelList: {listCommand}"); + + QueueMessage(new QueuedMessage(listCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); } public void SetChannelTopic(string channelName, string newTopic) From 4dc36b0b4c8b6186dd89942912f22383fef08c1d Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 17:05:33 +0100 Subject: [PATCH 05/38] Add game list pattern to game collections --- ClientCore/CnCNet5/CnCNetGame.cs | 7 ++++++ ClientCore/CnCNet5/GameCollection.cs | 20 ++++++++++++++++ .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 23 +++++++++++++++++++ DXMainClient/Online/CnCNetManager.cs | 16 +++++++++++++ DXMainClient/Online/Connection.cs | 11 +++------ DXMainClient/Online/IConnectionManager.cs | 2 ++ 6 files changed, 71 insertions(+), 8 deletions(-) diff --git a/ClientCore/CnCNet5/CnCNetGame.cs b/ClientCore/CnCNet5/CnCNetGame.cs index 719f33961..bbe51fe8e 100644 --- a/ClientCore/CnCNet5/CnCNetGame.cs +++ b/ClientCore/CnCNet5/CnCNetGame.cs @@ -27,6 +27,13 @@ public class CnCNetGame /// public string GameBroadcastChannel { get; set; } + + /// + /// The IRC game pattern of a hosted game channels + /// + public string GameListPattern { get; set; } + + /// /// The executable name of the game's client. /// diff --git a/ClientCore/CnCNet5/GameCollection.cs b/ClientCore/CnCNet5/GameCollection.cs index d810a61a8..1c208b966 100644 --- a/ClientCore/CnCNet5/GameCollection.cs +++ b/ClientCore/CnCNet5/GameCollection.cs @@ -65,6 +65,7 @@ public void Initialize() ChatChannel = "#cncnet-dta", ClientExecutableName = "DTA.exe", GameBroadcastChannel = "#cncnet-dta-games", + GameListPattern = "#cncnet-dta-game*", InternalName = "dta", RegistryInstallPath = "HKCU\\Software\\TheDawnOfTheTiberiumAge", UIName = "Dawn of the Tiberium Age", @@ -76,6 +77,7 @@ public void Initialize() ChatChannel = "#cncnet-ti", ClientExecutableName = "TI_Launcher.exe", GameBroadcastChannel = "#cncnet-ti-games", + GameListPattern = "#cncnet-ti-game*", InternalName = "ti", RegistryInstallPath = "HKCU\\Software\\TwistedInsurrection", UIName = "Twisted Insurrection", @@ -87,6 +89,7 @@ public void Initialize() ChatChannel = "#cncnet-mo", ClientExecutableName = "MentalOmegaClient.exe", GameBroadcastChannel = "#cncnet-mo-games", + GameListPattern = "#cncnet-mo-game*", InternalName = "mo", RegistryInstallPath = "HKCU\\Software\\MentalOmega", UIName = "Mental Omega", @@ -98,6 +101,7 @@ public void Initialize() ChatChannel = "#redres-lobby", ClientExecutableName = "RRLauncher.exe", GameBroadcastChannel = "#redres-games", + GameListPattern = "#cncnet-rr-game*", InternalName = "rr", RegistryInstallPath = "HKLM\\Software\\RedResurrection", UIName = "YR Red-Resurrection", @@ -109,6 +113,7 @@ public void Initialize() ChatChannel = "#riseoftheeast", ClientExecutableName = "RELauncher.exe", GameBroadcastChannel = "#rote-games", + GameListPattern = "#cncnet-re-game*", InternalName = "re", RegistryInstallPath = "HKLM\\Software\\RiseoftheEast", UIName = "Rise of the East", @@ -120,6 +125,7 @@ public void Initialize() ChatChannel = "#cncreloaded", ClientExecutableName = "CnCReloadedClient.exe", GameBroadcastChannel = "#cncreloaded-games", + GameListPattern = "#cncnet-cncr-game*", InternalName = "cncr", RegistryInstallPath = "HKCU\\Software\\CnCReloaded", UIName = "C&C: Reloaded", @@ -131,6 +137,7 @@ public void Initialize() ChatChannel = "#cncnet-td", ClientExecutableName = "TiberianDawn.exe", GameBroadcastChannel = "#cncnet-td-games", + GameListPattern = "#cncnet-td-game*", InternalName = "td", RegistryInstallPath = "HKLM\\Software\\Westwood\\Tiberian Dawn", UIName = "Tiberian Dawn", @@ -143,6 +150,7 @@ public void Initialize() ChatChannel = "#cncnet-ra", ClientExecutableName = "RedAlert.exe", GameBroadcastChannel = "#cncnet-ra-games", + GameListPattern = "#cncnet-ra-game*", InternalName = "ra", RegistryInstallPath = "HKLM\\Software\\Westwood\\Red Alert", UIName = "Red Alert", @@ -155,6 +163,7 @@ public void Initialize() ChatChannel = "#cncnet-d2k", ClientExecutableName = "Dune2000.exe", GameBroadcastChannel = "#cncnet-d2k-games", + GameListPattern = "#cncnet-d2k-game*", InternalName = "d2k", RegistryInstallPath = "HKLM\\Software\\Westwood\\Dune 2000", UIName = "Dune 2000", @@ -167,6 +176,7 @@ public void Initialize() ChatChannel = "#cncnet-ts", ClientExecutableName = "TiberianSun.exe", GameBroadcastChannel = "#cncnet-ts-games", + GameListPattern = "#cncnet-ts-game*", InternalName = "ts", RegistryInstallPath = "HKLM\\Software\\Westwood\\Tiberian Sun", UIName = "Tiberian Sun", @@ -178,6 +188,7 @@ public void Initialize() ChatChannel = "#cncnet-yr", ClientExecutableName = "CnCNetClientYR.exe", GameBroadcastChannel = "#cncnet-yr-games", + GameListPattern = "#cncnet-yr-game*", InternalName = "yr", RegistryInstallPath = "HKLM\\Software\\Westwood\\Yuri's Revenge", UIName = "Yuri's Revenge", @@ -190,6 +201,7 @@ public void Initialize() ChatChannel = "#cncnet-ss", ClientExecutableName = "SoleSurvivor.exe", GameBroadcastChannel = "#cncnet-ss-games", + GameListPattern = "#cncnet-ss-game*", InternalName = "ss", RegistryInstallPath = "HKLM\\Software\\Westwood\\Sole Survivor", UIName = "Sole Survivor", @@ -353,6 +365,14 @@ public string GetGameBroadcastingChannelNameFromIdentifier(string gameIdentifier return game.GameBroadcastChannel; } + public string GetGameListPatternFromIdentifier(string gameIdentifier) + { + CnCNetGame game = GameList.Find(g => g.InternalName == gameIdentifier.ToLowerInvariant()); + if (game == null) + return null; + return game.GameListPattern; + } + public string GetGameChatChannelNameFromIdentifier(string gameIdentifier) { CnCNetGame game = GameList.Find(g => g.InternalName == gameIdentifier.ToLowerInvariant()); diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 502c7f0f5..0cfc1a6f8 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -139,6 +139,7 @@ public CnCNetLobby(WindowManager windowManager, CnCNetManager connectionManager, private InvitationIndex invitationIndex; private GameFiltersPanel panelGameFilters; + private Timer gameChanneListTimer; private void GameList_ClientRectangleUpdated(object sender, EventArgs e) { @@ -541,6 +542,7 @@ private void PostUIInit() connectionManager.Disconnected += ConnectionManager_Disconnected; connectionManager.PrivateCTCPReceived += ConnectionManager_PrivateCTCPReceived; connectionManager.ChannelListReceived += ConnectionManager_ChannelListReceived; + connectionManager.ChannelMOTDComplete += ConnectionManager_ChannelMOTDComplete; cncnetUserData.UserFriendToggled += RefreshPlayerList; cncnetUserData.UserIgnoreToggled += RefreshPlayerList; @@ -592,6 +594,27 @@ private void PostUIInit() GameProcessLogic.GameProcessExited += SharedUILogic_GameProcessExited; } + private void ConnectionManager_ChannelMOTDComplete(object sender, EventArgs e) + { + RequestChannelList(null); + gameChanneListTimer = new Timer(RequestChannelList, null, 30000, 30000); + } + + private void DisposeGameChannelListTimer() + { + if (gameChanneListTimer != null) + { + gameChanneListTimer.Dispose(); + gameChanneListTimer = null; + } + } + + private void RequestChannelList(object state) + { + string pattern = gameCollection.GetGameListPatternFromIdentifier(localGameID); + connectionManager.RequestChannelList(pattern); + } + private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEventArgs e) { Logger.Log($"GameBroadcastChannel_ChannelListReceived ** {e.ChannelName}, {e.Topic}"); diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index 43fa89a05..31aded4bb 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -28,6 +28,7 @@ public class CnCNetManager : IConnectionManager public delegate void UserListDelegate(string channelName, string[] userNames); public event EventHandler WelcomeMessageReceived; + public event EventHandler ChannelMOTDComplete; public event EventHandler AwayMessageReceived; public event EventHandler WhoReplyReceived; public event EventHandler PrivateMessageReceived; @@ -276,6 +277,16 @@ public void OnChannelListReceived(List> channelList) } } + public void OnMOTDComplete() + { + wm.AddCallback(new Action(DoMOTDComplete), null); + } + + private void DoMOTDComplete() + { + ChannelMOTDComplete?.Invoke(this, null); + } + private void DoChannelListReceived(string channelName, string channelTopic) { // Broadcast the channel list and topics to the UI @@ -974,6 +985,11 @@ public void SetChannelTopic(Channel channel, string topic) { connection.SetChannelTopic(channel.ChannelName, topic); } + + public void RequestChannelList(string pattern) + { + connection.RequestChannelList(pattern); + } } public class UserEventArgs : EventArgs diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 95b0d3107..20cb3c181 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -1,4 +1,5 @@ using ClientCore; +using ClientCore.CnCNet5; using ClientCore.Extensions; using Rampastring.Tools; using System; @@ -231,7 +232,6 @@ private void HandleComm() Register(); Timer pingTimer = new Timer(AutoPing, null, 30000, 120000); - Timer gameChanneListTimer = new Timer(RequestChannelList, null, 30000, 30000); connectionCut = true; @@ -286,9 +286,6 @@ private void HandleComm() pingTimer.Change(Timeout.Infinite, Timeout.Infinite); pingTimer.Dispose(); - gameChanneListTimer.Change(Timeout.Infinite, Timeout.Infinite); - gameChanneListTimer.Dispose(); - _isConnected = false; disconnect = false; @@ -571,7 +568,7 @@ private void PerformCommand(string message) break; case 376: // End of MOTD case 422: // Server has no MOTD - RequestChannelList(null); + connectionManager.OnMOTDComplete(); break; case 002: // "Your host is x, running version y" case 003: // "This server was created..." @@ -952,12 +949,10 @@ private void Register() SendMessage("NICK " + ProgramConstants.PLAYERNAME); } - private void RequestChannelList(object state) + public void RequestChannelList(string pattern) { Logger.Log("RequestChannelList"); - // @TODO - string pattern = "#cncnet-yr-game*"; string listCommand = $"LIST {pattern}"; Logger.Log($"RequestChannelList: {listCommand}"); diff --git a/DXMainClient/Online/IConnectionManager.cs b/DXMainClient/Online/IConnectionManager.cs index 2487b597c..a543cd828 100644 --- a/DXMainClient/Online/IConnectionManager.cs +++ b/DXMainClient/Online/IConnectionManager.cs @@ -12,6 +12,8 @@ public interface IConnectionManager void OnGenericServerMessageReceived(string message); + void OnMOTDComplete(); + void OnAwayMessageReceived(string userName, string reason); void OnChannelTopicReceived(string channelName, string topic); From 2617a2ded425f1f85802406076cf41fd38c21c14 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 17:32:05 +0100 Subject: [PATCH 06/38] Doesn't seem needed --- DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 0cfc1a6f8..f8a8e6f18 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -600,15 +600,6 @@ private void ConnectionManager_ChannelMOTDComplete(object sender, EventArgs e) gameChanneListTimer = new Timer(RequestChannelList, null, 30000, 30000); } - private void DisposeGameChannelListTimer() - { - if (gameChanneListTimer != null) - { - gameChanneListTimer.Dispose(); - gameChanneListTimer = null; - } - } - private void RequestChannelList(object state) { string pattern = gameCollection.GetGameListPatternFromIdentifier(localGameID); From c558641ef7919566ae21a0e7c7a31d8dea764bd7 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 20:35:57 +0100 Subject: [PATCH 07/38] Add way to find gamecollection by hosted channelname, e.g. #cncnet-yr-game3289552 --- ClientCore/CnCNet5/GameCollection.cs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/ClientCore/CnCNet5/GameCollection.cs b/ClientCore/CnCNet5/GameCollection.cs index 1c208b966..ef7b11192 100644 --- a/ClientCore/CnCNet5/GameCollection.cs +++ b/ClientCore/CnCNet5/GameCollection.cs @@ -125,7 +125,7 @@ public void Initialize() ChatChannel = "#cncreloaded", ClientExecutableName = "CnCReloadedClient.exe", GameBroadcastChannel = "#cncreloaded-games", - GameListPattern = "#cncnet-cncr-game*", + GameListPattern = "#cncreloaded-cncr-game*", InternalName = "cncr", RegistryInstallPath = "HKCU\\Software\\CnCReloaded", UIName = "C&C: Reloaded", @@ -380,6 +380,29 @@ public string GetGameChatChannelNameFromIdentifier(string gameIdentifier) return null; return game.ChatChannel; } + + public CnCNetGame GetGameFromHostedChannelName(string channelName) + { + // Remove the "#" at the beginning of the channel name, if present + string cleanedChannelName = channelName.StartsWith("#") ? channelName.Substring(1) : channelName; + + // Loop through the game list to find the first matching pattern + return GameList.Find(g => + { + if (g.GameListPattern != null) + { + // Remove the "#" from the GameListPattern as well + string cleanedGameListPattern = g.GameListPattern.StartsWith("#") ? g.GameListPattern.Substring(1) : g.GameListPattern; + + // Check if the channel name starts with the portion of the pattern before the wildcard '*' + string fixedPatternPart = cleanedGameListPattern.Split('*')[0]; + + // Use StartsWith to match the fixed part of the pattern + return cleanedChannelName.StartsWith(fixedPatternPart); + } + return false; + }); + } } /// From 9c2e6f4c7da4c90b9bebdf40cd760b8bee4b5ddd Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 20:36:22 +0100 Subject: [PATCH 08/38] PR feedback fixes --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 16 ++++++-------- .../DXGUI/Multiplayer/GameInformationPanel.cs | 2 +- DXMainClient/DXGUI/Multiplayer/GameListBox.cs | 2 +- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 21 ++++++++++--------- .../Domain/Multiplayer/GenericHostedGame.cs | 2 +- DXMainClient/Online/CnCNetManager.cs | 10 ++++----- DXMainClient/Online/Connection.cs | 2 +- DXMainClient/Online/IConnectionManager.cs | 2 +- 8 files changed, 27 insertions(+), 30 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index f8a8e6f18..91406826a 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -542,7 +542,7 @@ private void PostUIInit() connectionManager.Disconnected += ConnectionManager_Disconnected; connectionManager.PrivateCTCPReceived += ConnectionManager_PrivateCTCPReceived; connectionManager.ChannelListReceived += ConnectionManager_ChannelListReceived; - connectionManager.ChannelMOTDComplete += ConnectionManager_ChannelMOTDComplete; + connectionManager.ChannelMessageOfTheDayComplete += ConnectionManager_ChannelMessageOfTheDayComplete; cncnetUserData.UserFriendToggled += RefreshPlayerList; cncnetUserData.UserIgnoreToggled += RefreshPlayerList; @@ -594,7 +594,7 @@ private void PostUIInit() GameProcessLogic.GameProcessExited += SharedUILogic_GameProcessExited; } - private void ConnectionManager_ChannelMOTDComplete(object sender, EventArgs e) + private void ConnectionManager_ChannelMessageOfTheDayComplete(object sender, EventArgs e) { RequestChannelList(null); gameChanneListTimer = new Timer(RequestChannelList, null, 30000, 30000); @@ -614,9 +614,7 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv // Ensure the topic starts with "GAME " as expected if (!e.Topic.StartsWith("GAME ")) - { return; - } // Extract the game information from the topic string string msg = e.Topic.Substring(5); // Cut out "GAME " part @@ -633,9 +631,7 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv { string revision = splitMessage[0]; if (revision != ProgramConstants.CNCNET_PROTOCOL_REVISION) - { return; - } string gameVersion = splitMessage[1]; int maxPlayers = Conversions.IntFromString(splitMessage[2], 0); @@ -658,15 +654,15 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv string loadedGameId = splitMessage[10]; bool hasSpecialGameMode = Conversions.BooleanFromString(splitMessage[11], false); - bool hasSupers = Conversions.BooleanFromString(splitMessage[12], false); + bool hasSuperWeapons = Conversions.BooleanFromString(splitMessage[12], false); bool hasCrates = Conversions.BooleanFromString(splitMessage[13], false); - // @TODO: Find the CnCNet game and tunnel information based on the channel name - CnCNetGame cncnetGame = gameCollection.GameList.Find(g => g.InternalName == "yr"); + CnCNetGame cncnetGame = gameCollection.GetGameFromHostedChannelName(e.ChannelName); CnCNetTunnel tunnel = tunnelHandler.Tunnels.Find(t => t.Address == tunnelAddress && t.Port == tunnelPort); if (tunnel == null || cncnetGame == null) { + Logger.Log($"GameBroadcastChannel_ChannelListReceived ** Tunnel: {tunnel} // cncnetGame: {cncnetGame}"); return; } @@ -694,7 +690,7 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv game.TunnelServer = tunnel; game.HasSpecialGameMode = hasSpecialGameMode; game.HasCrates = hasCrates; - game.HasSupers = hasSupers; + game.HasSuperWeapons = hasSuperWeapons; // If the game is closed, remove it from the list if (isClosed) diff --git a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs index 54758df0b..7a88b0e26 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs @@ -146,7 +146,7 @@ public void SetInfo(GenericHostedGame game) lblCrates.Text = "Crates:".L10N("Client:Main:GameInfoCrates") + " " + Renderer.GetSafeString(game.HasCrates ? "Yes" : "No", lblCrates.FontIndex); lblCrates.Visible = true; - lblSupers.Text = "Superweapons:".L10N("Client:Main:GameInfoSupers") + " " + Renderer.GetSafeString(game.HasSupers ? "Yes" : "No", lblSupers.FontIndex); + lblSupers.Text = "Superweapons:".L10N("Client:Main:GameInfoSupers") + " " + Renderer.GetSafeString(game.HasSuperWeapons ? "Yes" : "No", lblSupers.FontIndex); lblSupers.Visible = true; } diff --git a/DXMainClient/DXGUI/Multiplayer/GameListBox.cs b/DXMainClient/DXGUI/Multiplayer/GameListBox.cs index e2fef5ddb..4fb0888b2 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameListBox.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameListBox.cs @@ -303,7 +303,7 @@ public override void Draw(GameTime gameTime) var hostedGame = (GenericHostedGame)lbItem.Tag; - var hostedGameTexture = hostedGame.HasSpecialGameMode == true && hostedGame.Game.TextureSpecialGameMode != null ? + var hostedGameTexture = hostedGame.HasSpecialGameMode && hostedGame.Game.TextureSpecialGameMode != null ? hostedGame.Game.TextureSpecialGameMode : hostedGame.Game.Texture; diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index a415c1fdd..cab7bae32 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -236,8 +236,8 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, RefreshMapSelectionUI(); btnChangeTunnel.Enable(); - StringBuilder topic = BuildGameBroadcastingString(); - connectionManager.SetChannelTopic(channel, topic.ToString()); + string topic = BuildGameBroadcastingString(); + connectionManager.SetChannelTopic(channel, topic); } else { @@ -1896,16 +1896,16 @@ private void BroadcastGame() if (ProgramConstants.IsInGame && broadcastChannel.Users.Count > 500) return; - StringBuilder sb = BuildGameBroadcastingString(); + string gameBroadcastingString = BuildGameBroadcastingString(); // @TODO: Sending ctcp for broadcasting may not be needed now, if its only informing cncnet lobby - broadcastChannel.SendCTCPMessage(sb.ToString(), QueuedMessageType.SYSTEM_MESSAGE, 20); + broadcastChannel.SendCTCPMessage(gameBroadcastingString, QueuedMessageType.SYSTEM_MESSAGE, 20); // @TODO: Perhaps we should only update the topic when something has changed? - connectionManager.SetChannelTopic(channel, sb.ToString()); + connectionManager.SetChannelTopic(channel, gameBroadcastingString); } - private StringBuilder BuildGameBroadcastingString() + private string BuildGameBroadcastingString() { // @TODO: Do we need a way to allow games/mods to specify their additional game options they want to broadcast // For now hardcoded bits @@ -1964,19 +1964,20 @@ private StringBuilder BuildGameBroadcastingString() sb.Append(";"); sb.Append(GameMode?.UntranslatedUIName ?? string.Empty); sb.Append(";"); - sb.Append(tunnelHandler?.CurrentTunnel?.Address + ":" + tunnelHandler?.CurrentTunnel?.Port); + sb.Append(tunnelHandler?.CurrentTunnel == null ? string.Empty : tunnelHandler.CurrentTunnel.Address + ":" + tunnelHandler.CurrentTunnel.Port); sb.Append(";"); sb.Append(0); // LoadedGameId sb.Append(";"); // Append additional game info (11 onwards) sb.Append(hasSpecialGameMode ? "1" : "0"); + sb.Append(Convert.ToInt32(hasSpecialGameMode)); sb.Append(";"); - sb.Append(hasSupers ? "1" : "0"); + sb.Append(Convert.ToInt32(hasSupers)); sb.Append(";"); - sb.Append(hasCrates ? "1" : "0"); + sb.Append(Convert.ToInt32(hasCrates)); - return sb; + return sb.ToString(); } #endregion diff --git a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs index b8ac2b2b1..a6a7bd0f0 100644 --- a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs +++ b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs @@ -22,7 +22,7 @@ public abstract class GenericHostedGame: IEquatable public string[] Players { get; set; } public bool HasSpecialGameMode { get; set; } public bool HasCrates { get; set; } - public bool HasSupers { get; set; } + public bool HasSuperWeapons { get; set; } public int MaxPlayers { get; set; } = 8; diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index 31aded4bb..45361489f 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -28,7 +28,7 @@ public class CnCNetManager : IConnectionManager public delegate void UserListDelegate(string channelName, string[] userNames); public event EventHandler WelcomeMessageReceived; - public event EventHandler ChannelMOTDComplete; + public event EventHandler ChannelMessageOfTheDayComplete; public event EventHandler AwayMessageReceived; public event EventHandler WhoReplyReceived; public event EventHandler PrivateMessageReceived; @@ -277,14 +277,14 @@ public void OnChannelListReceived(List> channelList) } } - public void OnMOTDComplete() + public void OnMessageOfTheDayComplete() { - wm.AddCallback(new Action(DoMOTDComplete), null); + wm.AddCallback(new Action(DoMessageOfTheDayComplete), null); } - private void DoMOTDComplete() + private void DoMessageOfTheDayComplete() { - ChannelMOTDComplete?.Invoke(this, null); + ChannelMessageOfTheDayComplete?.Invoke(this, null); } private void DoChannelListReceived(string channelName, string channelTopic) diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 20cb3c181..c6a5c32f8 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -568,7 +568,7 @@ private void PerformCommand(string message) break; case 376: // End of MOTD case 422: // Server has no MOTD - connectionManager.OnMOTDComplete(); + connectionManager.OnMessageOfTheDayComplete(); break; case 002: // "Your host is x, running version y" case 003: // "This server was created..." diff --git a/DXMainClient/Online/IConnectionManager.cs b/DXMainClient/Online/IConnectionManager.cs index a543cd828..d94e777c6 100644 --- a/DXMainClient/Online/IConnectionManager.cs +++ b/DXMainClient/Online/IConnectionManager.cs @@ -12,7 +12,7 @@ public interface IConnectionManager void OnGenericServerMessageReceived(string message); - void OnMOTDComplete(); + void OnMessageOfTheDayComplete(); void OnAwayMessageReceived(string userName, string reason); From a6e79aa0873af5e85be450dd06d7299557bb45af Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 20:37:36 +0100 Subject: [PATCH 09/38] lblSupers to lblSuperWeapons --- .../DXGUI/Multiplayer/GameInformationPanel.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs index 7a88b0e26..a8d93dbf7 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs @@ -30,7 +30,7 @@ public GameInformationPanel(WindowManager windowManager, MapLoader mapLoader) private XNALabel lblPing; private XNALabel lblPlayers; private XNALabel lblCrates; - private XNALabel lblSupers; + private XNALabel lblSuperWeapons; private XNALabel[] lblPlayerNames; public override void Initialize() @@ -61,8 +61,8 @@ public override void Initialize() lblCrates = new XNALabel(WindowManager); lblCrates.ClientRectangle = new Rectangle(6, 150, 0, 0); - lblSupers = new XNALabel(WindowManager); - lblSupers.ClientRectangle = new Rectangle(6, 174, 0, 0); + lblSuperWeapons = new XNALabel(WindowManager); + lblSuperWeapons.ClientRectangle = new Rectangle(6, 174, 0, 0); lblPlayers = new XNALabel(WindowManager); lblPlayers.ClientRectangle = new Rectangle(6, 198, 0, 0); @@ -92,7 +92,7 @@ public override void Initialize() AddChild(lblPing); AddChild(lblPlayers); AddChild(lblCrates); - AddChild(lblSupers); + AddChild(lblSuperWeapons); AddChild(lblGameInformation); lblGameInformation.CenterOnParent(); @@ -146,8 +146,8 @@ public void SetInfo(GenericHostedGame game) lblCrates.Text = "Crates:".L10N("Client:Main:GameInfoCrates") + " " + Renderer.GetSafeString(game.HasCrates ? "Yes" : "No", lblCrates.FontIndex); lblCrates.Visible = true; - lblSupers.Text = "Superweapons:".L10N("Client:Main:GameInfoSupers") + " " + Renderer.GetSafeString(game.HasSuperWeapons ? "Yes" : "No", lblSupers.FontIndex); - lblSupers.Visible = true; + lblSuperWeapons.Text = "Superweapons:".L10N("Client:Main:GameInfoSuperWeapons") + " " + Renderer.GetSafeString(game.HasSuperWeapons ? "Yes" : "No", lblSuperWeapons.FontIndex); + lblSuperWeapons.Visible = true; } public void ClearInfo() From 82ad89c17c02291168d69e1ec161c51e2e4ab16b Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 20:52:54 +0100 Subject: [PATCH 10/38] When the host closes a game, ensure we keep the ctcp capture to close the game quickly --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 91406826a..8262e9188 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -1602,6 +1602,48 @@ private void GameBroadcastChannel_CTCPReceived(object sender, ChannelCTCPEventAr updateMessageBox.YesClickedAction = UpdateMessageBox_YesClicked; } } + + // Ensure the topic starts with "GAME " as expected + if (!e.Message.StartsWith("GAME ")) + return; + + // Extract the game information from the topic string + string msg = e.Message.Substring(5); // Cut out "GAME " part + string[] splitMessage = msg.Split(new char[] { ';' }); + + // Ensure the message has the expected number of parts + if (splitMessage.Length != 14) + { + Logger.Log("Ignoring game message because of an invalid number of parameters."); + return; + } + + // We keep this here because this is the fastest way of removing a game + try + { + bool isClosed = Conversions.BooleanFromString(splitMessage[5].Substring(2, 1), true); + + // If the game is closed, remove it from the list + if (isClosed) + { + int index = lbGameList.HostedGames.FindIndex(hg => ((HostedCnCNetGame)hg).HostName == e.UserName); + + if (index > -1) + { + lbGameList.RemoveGame(index); + + // Dismiss any outstanding invitations that are no longer valid + DismissInvalidInvitations(); + } + + return; + } + } + catch (Exception ex) + { + Logger.Log("Game parsing error: " + ex.ToString()); + } + } private void UpdateMessageBox_YesClicked(XNAMessageBox messageBox) => From 4e06747a39b5e053a84701ba297df9d642895e69 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Wed, 9 Oct 2024 22:04:55 +0100 Subject: [PATCH 11/38] Remove duplicate --- DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index cab7bae32..a55a8049e 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1970,7 +1970,6 @@ private string BuildGameBroadcastingString() sb.Append(";"); // Append additional game info (11 onwards) - sb.Append(hasSpecialGameMode ? "1" : "0"); sb.Append(Convert.ToInt32(hasSpecialGameMode)); sb.Append(";"); sb.Append(Convert.ToInt32(hasSupers)); From 13e884ed77f2a570e3fde3373d42ec6a125ac72b Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Thu, 10 Oct 2024 16:07:10 +0100 Subject: [PATCH 12/38] Update tuple deconstructing --- DXMainClient/Online/CnCNetManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index 45361489f..e9869b2cf 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -268,8 +268,8 @@ public void OnChannelListReceived(List> channelList) foreach (var nameTopic in channelList) { - string channelName = nameTopic.Item1; - string channelTopic = nameTopic.Item2; + (string channelName, string channelTopic) = nameTopic; + Logger.Log($"OnChannelListReceived: channelName: {channelName} channelTopic: {channelTopic}"); Channel channel = FindChannel(channelName); From 3e6ce20e3994ad59925ab7a029e43ddfafcbeb06 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 11 Oct 2024 18:12:03 +0100 Subject: [PATCH 13/38] Remove special hacks, LIST updates and topic setting --- ClientCore/CnCNet5/CnCNetGame.cs | 1 - ClientCore/CnCNet5/GameCollection.cs | 3 - ClientCore/Resources/ra2icon.png | Bin 1769 -> 0 bytes .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 52 +------- .../DXGUI/Multiplayer/GameInformationPanel.cs | 18 +-- DXMainClient/DXGUI/Multiplayer/GameListBox.cs | 8 +- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 118 +++++------------- .../GameLobby/MultiplayerGameLobby.cs | 10 ++ .../Domain/Multiplayer/GenericHostedGame.cs | 4 - 9 files changed, 43 insertions(+), 171 deletions(-) delete mode 100644 ClientCore/Resources/ra2icon.png diff --git a/ClientCore/CnCNet5/CnCNetGame.cs b/ClientCore/CnCNet5/CnCNetGame.cs index bbe51fe8e..59d07cdf3 100644 --- a/ClientCore/CnCNet5/CnCNetGame.cs +++ b/ClientCore/CnCNet5/CnCNetGame.cs @@ -41,7 +41,6 @@ public class CnCNetGame public Texture2D Texture { get; set; } - public Texture2D TextureSpecialGameMode { get; set; } /// /// The location where to read the game's installation path from the registry. diff --git a/ClientCore/CnCNet5/GameCollection.cs b/ClientCore/CnCNet5/GameCollection.cs index ef7b11192..05b5d2235 100644 --- a/ClientCore/CnCNet5/GameCollection.cs +++ b/ClientCore/CnCNet5/GameCollection.cs @@ -31,7 +31,6 @@ public void Initialize() using Stream tsIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.tsicon.png"); using Stream moIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.moicon.png"); using Stream yrIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.yricon.png"); - using Stream ra2IconStream = assembly.GetManifestResourceStream("ClientCore.Resources.ra2icon.png"); using Stream rrIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.rricon.png"); using Stream reIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.reicon.png"); using Stream cncrIconStream = assembly.GetManifestResourceStream("ClientCore.Resources.cncricon.png"); @@ -45,7 +44,6 @@ public void Initialize() using var tiIcon = Image.Load(tiIconStream); using var tsIcon = Image.Load(tsIconStream); using var moIcon = Image.Load(moIconStream); - using var ra2Icon = Image.Load(ra2IconStream); using var yrIcon = Image.Load(yrIconStream); using var rrIcon = Image.Load(rrIconStream); using var reIcon = Image.Load(reIconStream); @@ -193,7 +191,6 @@ public void Initialize() RegistryInstallPath = "HKLM\\Software\\Westwood\\Yuri's Revenge", UIName = "Yuri's Revenge", Texture = AssetLoader.TextureFromImage(yrIcon), - TextureSpecialGameMode = AssetLoader.TextureFromImage(ra2Icon) }, new() diff --git a/ClientCore/Resources/ra2icon.png b/ClientCore/Resources/ra2icon.png deleted file mode 100644 index 73013f9888dc7da69ec9e31717dcf5fe7ae4a9b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1769 zcmaJ?X;2eq7!INWD#ZgVg1|OhijqwN1QG}s2uGv=3@PFWNJth4kliI&NVqKEL9jUD zQSbmov5Eq64k7}!oLUc#icSGR8KG)XwCGf@4c(w%f0XXb?sv@dJn!?q-}}vG2l#pG zE;Cw2AP{spK5QO7u2jF;OYyJSP66eWh4#EI)Sh=5qcByM-$ zlDVh{6fO2imO_EaetcnatdK4uy14=_3I;A9fiMA}ki@|}_R0nLt1a}sO@sAQ@=NVWsXG+PRV;Xq}O9e_^{ z5f3O8MKXA7uTSCd6_Xf^VJHIx<#IVmZbw3-Q6Pm*r-NiFNTu512wPbaj0qIBu*`f; zfep!oQZb5&5g1S_3L=mMj7h}Je#}CG&db8GPnE)J1}X$7NFkBcSPpWERWL$$`#tqS=ut6i+XfJB{t(?&)Oj zRiESM-_dz93iK4-yoQ%!Z`mL`dW%MI^v%(hTv!UYr)x`@|J3 z?1jD{7sSng>ZASFQO|AR{iB}F_b$Ge?|ulzTV9IywuN}w55F?O95#!u=szF06EXHQ zWY*LSg{GM7I?|so7*bGwY3q1h%)#>g-Mv9ElLVd(+rWms%`BJjrY+VojAgUhjbPBG zdDYs&eOr1aA5MB^$t^jW`!-MCTQWXf-8_Cp9+jWHQ)h_YI~94pCv|x0Uh1BFyWQvO zZW9*!?A_w79lCXWPxO~bZ`c#hANqF;k7gAW*r?hAcCB~(_WjA>5i}&fv(sX)PJ+j| zp8_gp3T3BjkY>w9tL$e`W9A1Zf2}+5&ZYGRi!QG?v-zBa>iN}B(-8~Ac<_};Y*1Pk z9Cv?5VlYE4X+N1qC|&ZW-r<$z&D?#hM{~>9c60;=tDH0Z!L_n=XC_)iUL36~-x9}D zMdggz-lci@nEuZZ@p;E9Ou61SW=5KR3673*Ugk0?^))=>v(2hXbI(|m`B5$8tUcJ$ z8`o`^f8F?Ij`sWK-o8J?#Eldmx=5<%66fqy+DZ-9EE)`bS=VI!q+*}X zT$6AVF?`0=er?uUH6woCsN2XduT@yzyX<>Y&aWPCt1^9ge==V9LRHZR3!8IPO~itD zy;sK!MJI|LezUEdqV2r#ul5*nWr15rT#DA6!At(pA(mGw^vh28%G#Cn4_wK|BD>|Z zs%gm@PU-&ER#*GA8P2DTT8e2#%YWQuF}ZViV8Xw@LFH4hDKV_rW_kT>{L9X&>8tHC_QhM>zu$F$MMU+5|`9C=|g%4?U-c6F1- zs?xJ)wUq>++?e?8g(gfK;1%_aZ%wLsg68WxrC8J+acz6C zHd8~R=66&3-EUfy&yHVv^*HQ$B_lstg(zdy!r$4t3ra7F+48==2R(Z%ldQPAfAX z^gml(a?tz0R3ERWsZG0kOn=ncXvMvY{05}9bC6PqjJ@-`nDC(J*Og|+z6&kOHMbDtZR7A&nGb;oA?KC?Un?mJ;n))g$@75G=0SXl qGt+AR&d55~$9dd9Qt7Eyg%ik!<23ZDEAFa)J{(U!_7(T=%zpqtWWQ7Z diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 8262e9188..4f748c85a 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -597,7 +597,7 @@ private void PostUIInit() private void ConnectionManager_ChannelMessageOfTheDayComplete(object sender, EventArgs e) { RequestChannelList(null); - gameChanneListTimer = new Timer(RequestChannelList, null, 30000, 30000); + gameChanneListTimer = new Timer(RequestChannelList, null, 8000, 8000); } private void RequestChannelList(object state) @@ -621,7 +621,7 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv string[] splitMessage = msg.Split(new char[] { ';' }); // Ensure the message has the expected number of parts - if (splitMessage.Length != 14) + if (splitMessage.Length != 11) { Logger.Log("Ignoring game message because of an invalid number of parameters."); return; @@ -653,9 +653,6 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv int tunnelPort = int.Parse(tunnelAddressAndPort[1]); string loadedGameId = splitMessage[10]; - bool hasSpecialGameMode = Conversions.BooleanFromString(splitMessage[11], false); - bool hasSuperWeapons = Conversions.BooleanFromString(splitMessage[12], false); - bool hasCrates = Conversions.BooleanFromString(splitMessage[13], false); CnCNetGame cncnetGame = gameCollection.GetGameFromHostedChannelName(e.ChannelName); CnCNetTunnel tunnel = tunnelHandler.Tunnels.Find(t => t.Address == tunnelAddress && t.Port == tunnelPort); @@ -688,9 +685,6 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv game.Locked = locked || (game.IsLoadedGame && !game.Players.Contains(ProgramConstants.PLAYERNAME)); game.Incompatible = cncnetGame == localGame && game.GameVersion != ProgramConstants.GAME_VERSION; game.TunnelServer = tunnel; - game.HasSpecialGameMode = hasSpecialGameMode; - game.HasCrates = hasCrates; - game.HasSuperWeapons = hasSuperWeapons; // If the game is closed, remove it from the list if (isClosed) @@ -1602,48 +1596,6 @@ private void GameBroadcastChannel_CTCPReceived(object sender, ChannelCTCPEventAr updateMessageBox.YesClickedAction = UpdateMessageBox_YesClicked; } } - - // Ensure the topic starts with "GAME " as expected - if (!e.Message.StartsWith("GAME ")) - return; - - // Extract the game information from the topic string - string msg = e.Message.Substring(5); // Cut out "GAME " part - string[] splitMessage = msg.Split(new char[] { ';' }); - - // Ensure the message has the expected number of parts - if (splitMessage.Length != 14) - { - Logger.Log("Ignoring game message because of an invalid number of parameters."); - return; - } - - // We keep this here because this is the fastest way of removing a game - try - { - bool isClosed = Conversions.BooleanFromString(splitMessage[5].Substring(2, 1), true); - - // If the game is closed, remove it from the list - if (isClosed) - { - int index = lbGameList.HostedGames.FindIndex(hg => ((HostedCnCNetGame)hg).HostName == e.UserName); - - if (index > -1) - { - lbGameList.RemoveGame(index); - - // Dismiss any outstanding invitations that are no longer valid - DismissInvalidInvitations(); - } - - return; - } - } - catch (Exception ex) - { - Logger.Log("Game parsing error: " + ex.ToString()); - } - } private void UpdateMessageBox_YesClicked(XNAMessageBox messageBox) => diff --git a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs index a8d93dbf7..8a92876c8 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs @@ -29,8 +29,6 @@ public GameInformationPanel(WindowManager windowManager, MapLoader mapLoader) private XNALabel lblHost; private XNALabel lblPing; private XNALabel lblPlayers; - private XNALabel lblCrates; - private XNALabel lblSuperWeapons; private XNALabel[] lblPlayerNames; public override void Initialize() @@ -58,14 +56,8 @@ public override void Initialize() lblPing = new XNALabel(WindowManager); lblPing.ClientRectangle = new Rectangle(6, 126, 0, 0); - lblCrates = new XNALabel(WindowManager); - lblCrates.ClientRectangle = new Rectangle(6, 150, 0, 0); - - lblSuperWeapons = new XNALabel(WindowManager); - lblSuperWeapons.ClientRectangle = new Rectangle(6, 174, 0, 0); - lblPlayers = new XNALabel(WindowManager); - lblPlayers.ClientRectangle = new Rectangle(6, 198, 0, 0); + lblPlayers.ClientRectangle = new Rectangle(6, 150, 0, 0); lblPlayerNames = new XNALabel[MAX_PLAYERS]; for (int i = 0; i < lblPlayerNames.Length / 2; i++) @@ -91,8 +83,6 @@ public override void Initialize() AddChild(lblHost); AddChild(lblPing); AddChild(lblPlayers); - AddChild(lblCrates); - AddChild(lblSuperWeapons); AddChild(lblGameInformation); lblGameInformation.CenterOnParent(); @@ -142,12 +132,6 @@ public void SetInfo(GenericHostedGame game) { lblPlayerNames[i].Visible = false; } - - lblCrates.Text = "Crates:".L10N("Client:Main:GameInfoCrates") + " " + Renderer.GetSafeString(game.HasCrates ? "Yes" : "No", lblCrates.FontIndex); - lblCrates.Visible = true; - - lblSuperWeapons.Text = "Superweapons:".L10N("Client:Main:GameInfoSuperWeapons") + " " + Renderer.GetSafeString(game.HasSuperWeapons ? "Yes" : "No", lblSuperWeapons.FontIndex); - lblSuperWeapons.Visible = true; } public void ClearInfo() diff --git a/DXMainClient/DXGUI/Multiplayer/GameListBox.cs b/DXMainClient/DXGUI/Multiplayer/GameListBox.cs index 4fb0888b2..f1bd0e379 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameListBox.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameListBox.cs @@ -303,13 +303,9 @@ public override void Draw(GameTime gameTime) var hostedGame = (GenericHostedGame)lbItem.Tag; - var hostedGameTexture = hostedGame.HasSpecialGameMode && hostedGame.Game.TextureSpecialGameMode != null ? - hostedGame.Game.TextureSpecialGameMode : - hostedGame.Game.Texture; + DrawTexture(hostedGame.Game.Texture, new Rectangle(x, height, hostedGame.Game.Texture.Width, hostedGame.Game.Texture.Height), Color.White); - DrawTexture(hostedGameTexture, new Rectangle(x, height, hostedGameTexture.Width, hostedGameTexture.Height), Color.White); - - x += hostedGameTexture.Width + ICON_MARGIN; + x += hostedGame.Game.Texture.Width + ICON_MARGIN; if (hostedGame.Locked) { diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index a55a8049e..0442b2d2e 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -27,10 +27,6 @@ public class CnCNetGameLobby : MultiplayerGameLobby private const int HUMAN_PLAYER_OPTIONS_LENGTH = 3; private const int AI_PLAYER_OPTIONS_LENGTH = 2; - private const double GAME_BROADCAST_INTERVAL = 30.0; - private const double GAME_BROADCAST_ACCELERATION = 10.0; - private const double INITIAL_GAME_BROADCAST_DELAY = 10.0; - private static readonly Color ERROR_MESSAGE_COLOR = Color.Yellow; private const string MAP_SHARING_FAIL_MESSAGE = "MAPFAIL"; @@ -125,8 +121,6 @@ DiscordHandler discordHandler private IRCColor chatColor; - private XNATimerControl gameBroadcastTimer; - private int playerLimit; private bool closed = false; @@ -163,6 +157,12 @@ DiscordHandler discordHandler /// private bool tunnelErrorMode; + /// + /// Cached topic, allows us to compare with a new topic to see if it has changed. + /// + private string cachedGameBroadcastString = string.Empty; + + public override void Initialize() { IniNameOverride = nameof(CnCNetGameLobby); @@ -171,12 +171,6 @@ public override void Initialize() btnChangeTunnel = FindChild(nameof(btnChangeTunnel)); btnChangeTunnel.LeftClick += BtnChangeTunnel_LeftClick; - gameBroadcastTimer = new XNATimerControl(WindowManager); - gameBroadcastTimer.AutoReset = true; - gameBroadcastTimer.Interval = TimeSpan.FromSeconds(GAME_BROADCAST_INTERVAL); - gameBroadcastTimer.Enabled = false; - gameBroadcastTimer.TimeElapsed += GameBroadcastTimer_TimeElapsed; - tunnelSelectionWindow = new TunnelSelectionWindow(WindowManager, tunnelHandler); tunnelSelectionWindow.Initialize(); tunnelSelectionWindow.DrawOrder = 1; @@ -190,8 +184,6 @@ public override void Initialize() MapPreviewBox.AddChild(mapSharingConfirmationPanel); mapSharingConfirmationPanel.MapDownloadConfirmed += MapSharingConfirmationPanel_MapDownloadConfirmed; - WindowManager.AddAndInitializeControl(gameBroadcastTimer); - globalContextMenu = new GlobalContextMenu(WindowManager, connectionManager, cncnetUserData, pmWindow); AddChild(globalContextMenu); @@ -211,7 +203,6 @@ private void MultiplayerName_RightClick(object sender, MultiplayerNameRightClick private void BtnChangeTunnel_LeftClick(object sender, EventArgs e) => ShowTunnelSelectionWindow("Select tunnel server:".L10N("Client:Main:SelectTunnelServer")); - private void GameBroadcastTimer_TimeElapsed(object sender, EventArgs e) => BroadcastGame(); public void SetUp(Channel channel, bool isHost, int playerLimit, CnCNetTunnel tunnel, string hostName, bool isCustomPassword) @@ -235,9 +226,6 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, RandomSeed = new Random().Next(); RefreshMapSelectionUI(); btnChangeTunnel.Enable(); - - string topic = BuildGameBroadcastingString(); - connectionManager.SetChannelTopic(channel, topic); } else { @@ -271,14 +259,7 @@ public void OnJoined() channel.Password, playerLimit), QueuedMessageType.SYSTEM_MESSAGE, 50)); - connectionManager.SendCustomMessage(new QueuedMessage( - string.Format("TOPIC {0} :{1}", channel.ChannelName, - ProgramConstants.CNCNET_PROTOCOL_REVISION + ";" + localGame.ToLower()), - QueuedMessageType.SYSTEM_MESSAGE, 50)); - - gameBroadcastTimer.Enabled = true; - gameBroadcastTimer.Start(); - gameBroadcastTimer.SetTime(TimeSpan.FromSeconds(INITIAL_GAME_BROADCAST_DELAY)); + OnShouldUpdateTopic(); } else { @@ -381,7 +362,6 @@ public override void Clear() connectionManager.ConnectionLost -= ConnectionManager_ConnectionLost; connectionManager.Disconnected -= ConnectionManager_Disconnected; - gameBroadcastTimer.Enabled = false; closed = false; tbChatInput.Text = string.Empty; @@ -400,7 +380,6 @@ public void LeaveGameLobby() if (IsHost) { closed = true; - BroadcastGame(); } Clear(); @@ -1513,7 +1492,8 @@ protected override void LockGame() Locked = true; btnLockGame.Text = "Unlock Game".L10N("Client:Main:UnlockGame"); - AccelerateGameBroadcasting(); + + OnShouldUpdateTopic(); } protected override void UnlockGame(bool announce) @@ -1525,7 +1505,8 @@ protected override void UnlockGame(bool announce) if (announce) AddNotice("The game room has been unlocked.".L10N("Client:Main:GameRoomUnlocked")); btnLockGame.Text = "Lock Game".L10N("Client:Main:LockGame"); - AccelerateGameBroadcasting(); + + OnShouldUpdateTopic(); } protected override void KickPlayer(int playerIndex) @@ -1555,6 +1536,8 @@ protected override void BanPlayer(int playerIndex) channel.SendKickMessage(user.Name, 8); } } + + private void HandleCheatDetectedMessage(string sender) => AddNotice(string.Format("{0} has modified game files during the client session. They are likely attempting to cheat!".L10N("Client:Main:PlayerModifyFileCheat"), sender), Color.Red); @@ -1875,63 +1858,11 @@ private void DownloadMapByIdCommand(string parameters) MapSharer.DownloadMap(sha1, localGame, safeMapName); } - #endregion #region Game broadcasting logic - - /// - /// Lowers the time until the next game broadcasting message. - /// - private void AccelerateGameBroadcasting() => - gameBroadcastTimer.Accelerate(TimeSpan.FromSeconds(GAME_BROADCAST_ACCELERATION)); - - private void BroadcastGame() - { - Channel broadcastChannel = connectionManager.FindChannel(gameCollection.GetGameBroadcastingChannelNameFromIdentifier(localGame)); - - if (broadcastChannel == null) - return; - - if (ProgramConstants.IsInGame && broadcastChannel.Users.Count > 500) - return; - - string gameBroadcastingString = BuildGameBroadcastingString(); - - // @TODO: Sending ctcp for broadcasting may not be needed now, if its only informing cncnet lobby - broadcastChannel.SendCTCPMessage(gameBroadcastingString, QueuedMessageType.SYSTEM_MESSAGE, 20); - - // @TODO: Perhaps we should only update the topic when something has changed? - connectionManager.SetChannelTopic(channel, gameBroadcastingString); - } - private string BuildGameBroadcastingString() { - // @TODO: Do we need a way to allow games/mods to specify their additional game options they want to broadcast - // For now hardcoded bits - - bool hasSpecialGameMode = false; - bool hasCrates = false; - bool hasSupers = false; - - for (int i = 0; i < CheckBoxes.Count; i++) - { - var checkbox = CheckBoxes[i]; - - if (checkbox.Name == "chkRA2Mode" && checkbox.Checked) - { - hasSpecialGameMode = true; - } - else if (checkbox.Name == "chkCrates" && checkbox.Checked) - { - hasCrates = true; - } - else if (checkbox.Name == "chkSuperWeapons" && checkbox.Checked) - { - hasSupers = true; - } - } - StringBuilder sb = new StringBuilder("GAME "); sb.Append(ProgramConstants.CNCNET_PROTOCOL_REVISION); sb.Append(";"); @@ -1967,18 +1898,25 @@ private string BuildGameBroadcastingString() sb.Append(tunnelHandler?.CurrentTunnel == null ? string.Empty : tunnelHandler.CurrentTunnel.Address + ":" + tunnelHandler.CurrentTunnel.Port); sb.Append(";"); sb.Append(0); // LoadedGameId - sb.Append(";"); - - // Append additional game info (11 onwards) - sb.Append(Convert.ToInt32(hasSpecialGameMode)); - sb.Append(";"); - sb.Append(Convert.ToInt32(hasSupers)); - sb.Append(";"); - sb.Append(Convert.ToInt32(hasCrates)); return sb.ToString(); } + /// + /// Only update the topic when something in the lobby has changed, but also only relevent to the CnCNetLobby. + /// + protected override void OnShouldUpdateTopic() + { + if (channel != null) + { + string newGameBroadcastString = BuildGameBroadcastingString(); + if (cachedGameBroadcastString != newGameBroadcastString) + { + connectionManager.SetChannelTopic(channel, newGameBroadcastString); + cachedGameBroadcastString = newGameBroadcastString; + } + } + } #endregion public override string GetSwitchName() => "Game Lobby".L10N("Client:Main:GameLobby"); diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs index cd0b6b8a7..87599accd 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs @@ -109,6 +109,9 @@ protected bool Locked private bool lastMapChangeWasInvalid = false; + public event EventHandler OnLobbyGameOptionChanged; + + /// /// Allows derived classes to add their own chat box commands. /// @@ -951,8 +954,15 @@ protected override void OnGameOptionChanged() ClearReadyStatuses(); CopyPlayerDataToUI(); + OnShouldUpdateTopic(); + } + + protected virtual void OnShouldUpdateTopic() + { + // Default behavior (if any) } + protected abstract void HostLaunchGame(); protected override void CopyPlayerDataFromUI(object sender, EventArgs e) diff --git a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs index a6a7bd0f0..0c863ed78 100644 --- a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs +++ b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs @@ -20,10 +20,6 @@ public abstract class GenericHostedGame: IEquatable public string GameVersion { get; set; } public string HostName { get; set; } public string[] Players { get; set; } - public bool HasSpecialGameMode { get; set; } - public bool HasCrates { get; set; } - public bool HasSuperWeapons { get; set; } - public int MaxPlayers { get; set; } = 8; public abstract int Ping { get; } From 4ac8f246754f69df2520b691bbde2bb433ed45c2 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 11 Oct 2024 18:13:48 +0100 Subject: [PATCH 14/38] Tidy --- DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs index 87599accd..711bda44b 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs @@ -109,7 +109,6 @@ protected bool Locked private bool lastMapChangeWasInvalid = false; - public event EventHandler OnLobbyGameOptionChanged; /// From 15b0cb4805e9b2d1f88cee7143c08effb41bf6c5 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 11 Oct 2024 18:14:39 +0100 Subject: [PATCH 15/38] Further tidy --- .../DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs index 711bda44b..136193c81 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs @@ -956,11 +956,7 @@ protected override void OnGameOptionChanged() OnShouldUpdateTopic(); } - protected virtual void OnShouldUpdateTopic() - { - // Default behavior (if any) - } - + protected virtual void OnShouldUpdateTopic() {} protected abstract void HostLaunchGame(); From b3199522a11991b8c39c475ed1367f8b20161afe Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 11 Oct 2024 18:18:51 +0100 Subject: [PATCH 16/38] Add example topic --- DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 4f748c85a..1f4ac253a 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -617,6 +617,8 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv return; // Extract the game information from the topic string + // Example Topic: GAME R10;N/A;8;#cncnet-yr-game7417533;neogrant's Game;00000;neogrant;[2] A Hill Between;Battle;198.244.177.26:50000;0 + string msg = e.Topic.Substring(5); // Cut out "GAME " part string[] splitMessage = msg.Split(new char[] { ';' }); From 95cecfa13a1bbb454bfade3cc7f7a0cc5f9acd3a Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Sun, 13 Oct 2024 11:05:11 +0100 Subject: [PATCH 17/38] Operators at start of lines --- DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 1f4ac253a..a799b459b 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -711,9 +711,10 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv } else { - if (UserINISettings.Instance.PlaySoundOnGameHosted && - cncnetGame.InternalName == localGameID.ToLower() && - !ProgramConstants.IsInGame && !game.Locked) + if (UserINISettings.Instance.PlaySoundOnGameHosted + && cncnetGame.InternalName == localGameID.ToLower() + && !ProgramConstants.IsInGame + && !game.Locked) { SoundPlayer.Play(sndGameCreated); } From 1011c7de8e7399aa303698e301e129f0008a55e1 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Sun, 13 Oct 2024 12:58:18 +0100 Subject: [PATCH 18/38] Have a clear GAME and DETAIL section in the broadcast topic --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 9 ++++++--- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 17 ++++++++++++++--- DXMainClient/Online/Channel.cs | 16 ++++++++++++---- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index a799b459b..9a24eae7b 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -616,11 +616,14 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv if (!e.Topic.StartsWith("GAME ")) return; + // Split the topic into GAME and DETAIL parts using '|' + string[] topicParts = e.Topic.Substring(5).Split('|'); + string gameInfo = topicParts[0]; // The part before '|', containing GAME data + string detailInfo = topicParts.Length > 1 ? topicParts[1] : null; // The part after '|', if present (DETAIL) + // Extract the game information from the topic string // Example Topic: GAME R10;N/A;8;#cncnet-yr-game7417533;neogrant's Game;00000;neogrant;[2] A Hill Between;Battle;198.244.177.26:50000;0 - - string msg = e.Topic.Substring(5); // Cut out "GAME " part - string[] splitMessage = msg.Split(new char[] { ';' }); + string[] splitMessage = gameInfo.Split(new char[] { ';' }); // Ensure the message has the expected number of parts if (splitMessage.Length != 11) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 0442b2d2e..3b559f301 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1902,6 +1902,14 @@ private string BuildGameBroadcastingString() return sb.ToString(); } + private string BuildGameDetailsBroadcastingString() + { + // | is the separator for the game details + StringBuilder sb = new StringBuilder("|DETAIL "); + + return sb.ToString(); + } + /// /// Only update the topic when something in the lobby has changed, but also only relevent to the CnCNetLobby. /// @@ -1910,10 +1918,13 @@ protected override void OnShouldUpdateTopic() if (channel != null) { string newGameBroadcastString = BuildGameBroadcastingString(); - if (cachedGameBroadcastString != newGameBroadcastString) + string newGameDetailsBroadcastString = BuildGameDetailsBroadcastingString(); + string gameBroadcastString = newGameBroadcastString += newGameDetailsBroadcastString; + + if (cachedGameBroadcastString != gameBroadcastString) { - connectionManager.SetChannelTopic(channel, newGameBroadcastString); - cachedGameBroadcastString = newGameBroadcastString; + connectionManager.SetChannelTopic(channel, gameBroadcastString); + cachedGameBroadcastString = gameBroadcastString; } } } diff --git a/DXMainClient/Online/Channel.cs b/DXMainClient/Online/Channel.cs index 26aa02607..959426a47 100644 --- a/DXMainClient/Online/Channel.cs +++ b/DXMainClient/Online/Channel.cs @@ -25,6 +25,7 @@ public class Channel : IMessageView public event EventHandler CTCPReceived; public event EventHandler InvalidPasswordEntered; public event EventHandler InviteOnlyErrorOnJoin; + public event EventHandler TopicChanged; /// /// Raised when the server informs the client that it's is unable to @@ -80,10 +81,17 @@ public string Topic get { return _topic; } set { - _topic = value; - if (Persistent) - AddMessage(new ChatMessage( - string.Format("Topic for {0} is: {1}".L10N("Client:Main:ChannelTopic"), UIName, _topic))); + if (_topic != value) // Only trigger the event if the topic actually changes + { + _topic = value; + + // Raise the TopicChanged event + TopicChanged?.Invoke(this, new MessageEventArgs(_topic)); + + if (Persistent) + AddMessage(new ChatMessage( + string.Format("Topic for {0} is: {1}".L10N("Client:Main:ChannelTopic"), UIName, _topic))); + } } } From ef5c6ead9f57e60d5800f3bbc049f2aa36d19cbd Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Sun, 13 Oct 2024 18:42:27 +0100 Subject: [PATCH 19/38] Hybrid ctcp/topic --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 14 +- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 159 +++++++++++++++--- .../Multiplayer/GameLobby/GameLobbyBase.cs | 2 +- .../Multiplayer/GameLobby/LANGameLobby.cs | 2 +- .../Domain/Multiplayer/PlayerExtraOptions.cs | 2 +- DXMainClient/Online/CnCNetManager.cs | 4 +- DXMainClient/Online/Connection.cs | 4 +- DXMainClient/Online/QueuedMessageType.cs | 1 + DXMainClient/Program.cs | 2 +- 9 files changed, 151 insertions(+), 39 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 9a24eae7b..e8d66160b 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -613,17 +613,15 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv var cncnetManager = (CnCNetManager)sender; // Ensure the topic starts with "GAME " as expected - if (!e.Topic.StartsWith("GAME ")) + if (!e.Topic.StartsWith("GL ")) return; - // Split the topic into GAME and DETAIL parts using '|' - string[] topicParts = e.Topic.Substring(5).Split('|'); - string gameInfo = topicParts[0]; // The part before '|', containing GAME data - string detailInfo = topicParts.Length > 1 ? topicParts[1] : null; // The part after '|', if present (DETAIL) + // Split the topic into GAME, DETAIL, PO parts using '|' + string[] topicParts = e.Topic.Substring(3).Split('|'); + string gameListingInfo = topicParts[0]; // The part before '|', containing GL data - // Extract the game information from the topic string - // Example Topic: GAME R10;N/A;8;#cncnet-yr-game7417533;neogrant's Game;00000;neogrant;[2] A Hill Between;Battle;198.244.177.26:50000;0 - string[] splitMessage = gameInfo.Split(new char[] { ';' }); + // Example Topic: GL R10;N/A;8;#cncnet-yr-game7417533;neogrant's Game;00000;neogrant;[2] A Hill Between;Battle;198.244.177.26:50000;0 + string[] splitMessage = gameListingInfo.Split(new char[] { ';' }); // Ensure the message has the expected number of parts if (splitMessage.Length != 11) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 3b559f301..27576aab3 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -59,9 +59,9 @@ DiscordHandler discordHandler { new IntCommandHandler("OR", HandleOptionsRequest), new IntCommandHandler("R", HandleReadyRequest), - new StringCommandHandler("PO", ApplyPlayerOptions), - new StringCommandHandler(PlayerExtraOptions.CNCNET_MESSAGE_KEY, ApplyPlayerExtraOptions), - new StringCommandHandler("GO", ApplyGameOptions), + //new StringCommandHandler("PO", ApplyPlayerOptions), + //new StringCommandHandler(PlayerExtraOptions.CNCNET_MESSAGE_KEY, ApplyPlayerExtraOptions), + //new StringCommandHandler("GO", ApplyGameOptions), new StringCommandHandler("START", NonHostLaunchGame), new NotificationHandler("AISPECS", HandleNotification, AISpectatorsNotification), new NotificationHandler("GETREADY", HandleNotification, GetReadyNotification), @@ -160,7 +160,7 @@ DiscordHandler discordHandler /// /// Cached topic, allows us to compare with a new topic to see if it has changed. /// - private string cachedGameBroadcastString = string.Empty; + private string cachedGameTopic = string.Empty; public override void Initialize() @@ -216,6 +216,7 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, channel.UserAdded += Channel_UserAdded; channel.UserNameChanged += Channel_UserNameChanged; channel.UserListReceived += Channel_UserListReceived; + channel.TopicChanged += Channel_TopicChanged; this.hostName = hostName; this.playerLimit = playerLimit; @@ -258,12 +259,11 @@ public void OnJoined() string.Format("MODE {0} +klnN {1} {2}", channel.ChannelName, channel.Password, playerLimit), QueuedMessageType.SYSTEM_MESSAGE, 50)); - - OnShouldUpdateTopic(); } else { channel.SendCTCPMessage("FHSH " + gameFilesHash, QueuedMessageType.SYSTEM_MESSAGE, 10); + Logger.Log("PLAYER TOPIC: " + channel.Topic); } TopBar.AddPrimarySwitchable(this); @@ -272,6 +272,8 @@ public void OnJoined() ResetAutoReadyCheckbox(); UpdatePing(); UpdateDiscordPresence(true); + + OnShouldUpdateTopic(); } private void UpdatePing() @@ -347,6 +349,7 @@ public override void Clear() channel.UserAdded -= Channel_UserAdded; channel.UserNameChanged -= Channel_UserNameChanged; channel.UserListReceived -= Channel_UserListReceived; + channel.TopicChanged -= Channel_TopicChanged; if (!IsHost) { @@ -375,6 +378,13 @@ public override void Clear() ResetDiscordPresence(); } + private void Channel_TopicChanged(object sender, MessageEventArgs e) + { + Logger.Log("CnCNetGameLobby ** Channel_TopicChanged " + e.Message); + if (!IsHost) + ParseGameTopic(e.Message); + } + public void LeaveGameLobby() { if (IsHost) @@ -844,9 +854,9 @@ protected override void BroadcastPlayerExtraOptions() /// /// Handles player option messages received from the game host. /// - private void ApplyPlayerOptions(string sender, string message) + private void ApplyPlayerOptions(string message) { - if (sender != hostName) + if (IsHost) return; Players.Clear(); @@ -994,11 +1004,8 @@ protected override void OnGameOptionChanged() /// /// Handles game option messages received from the game host. /// - private void ApplyGameOptions(string sender, string message) + private void ApplyGameOptions(string message) { - if (sender != hostName) - return; - string[] parts = message.Split(';'); int checkBoxIntegerCount = (CheckBoxes.Count / 32) + 1; @@ -1861,9 +1868,28 @@ private void DownloadMapByIdCommand(string parameters) #endregion #region Game broadcasting logic + private void ParseGameTopic(string topic) + { + // GL | GO | PO | PEO + // Ensure the topic starts with "GL " as expected + if (!topic.StartsWith("GL ")) + return; + + // Split the topic into GAME and DETAIL parts using '|' + string[] topicParts = topic.Substring(5).Split('|'); + string gameListing = topicParts[0]; + string gameOptionMessage = topicParts.Length > 1 ? topicParts[1] : null; + string playerOptionsMessage = topicParts.Length > 2 ? topicParts[2] : null; + string playerExtraOptionMessage = topicParts.Length > 3 ? topicParts[3] : null; + + ApplyGameOptions(gameOptionMessage.Substring(3)); // Remove the "GO " prefix + ApplyPlayerOptions(playerOptionsMessage.Substring(3)); // Remove the "PO " prefix + ApplyPlayerExtraOptions(playerExtraOptionMessage.Substring(4)); // Remove the "PEO " prefix + } + private string BuildGameBroadcastingString() { - StringBuilder sb = new StringBuilder("GAME "); + StringBuilder sb = new StringBuilder("GL "); // Short for Game Listings sb.Append(ProgramConstants.CNCNET_PROTOCOL_REVISION); sb.Append(";"); sb.Append(ProgramConstants.GAME_VERSION); @@ -1891,7 +1917,7 @@ private string BuildGameBroadcastingString() sb.Remove(sb.Length - 1, 1); sb.Append(";"); - sb.Append(Map?.UntranslatedName ?? string.Empty); + sb.Append("Map TODO"); sb.Append(";"); sb.Append(GameMode?.UntranslatedUIName ?? string.Empty); sb.Append(";"); @@ -1902,30 +1928,117 @@ private string BuildGameBroadcastingString() return sb.ToString(); } - private string BuildGameDetailsBroadcastingString() + private string BuildGameOptionsBroadcastString() + { + ExtendedStringBuilder sb = new ExtendedStringBuilder("|GO ", true, ';'); + + bool[] optionValues = new bool[CheckBoxes.Count]; + for (int i = 0; i < CheckBoxes.Count; i++) + optionValues[i] = CheckBoxes[i].Checked; + + // Let's pack the booleans into bytes + List byteList = Conversions.BoolArrayIntoBytes(optionValues).ToList(); + + while (byteList.Count % 4 != 0) + byteList.Add(0); + + int integerCount = byteList.Count / 4; + byte[] byteArray = byteList.ToArray(); + + + for (int i = 0; i < integerCount; i++) + sb.Append(BitConverter.ToInt32(byteArray, i * 4)); + + // We don't gain much in most cases by packing the drop-down values + // (because they're bytes to begin with, and usually non-zero), + // so let's just transfer them as usual + + foreach (GameLobbyDropDown dd in DropDowns) + sb.Append(dd.SelectedIndex); + + sb.Append(Convert.ToInt32(Map?.Official ?? false)); + sb.Append(Map?.SHA1 ?? string.Empty); + sb.Append(GameMode?.Name ?? string.Empty); + sb.Append(FrameSendRate); + sb.Append(MaxAhead); + sb.Append(ProtocolVersion); + sb.Append(RandomSeed); + sb.Append(Convert.ToInt32(RemoveStartingLocations)); + sb.Append(Map?.UntranslatedName ?? string.Empty); + + return sb.ToString(); + } + + private string BuildAdditionalPlayerOptionsBroadcastString() + { + // "|PEO " is the separator for the player extra options + var playerExtraOptions = GetPlayerExtraOptions(); + return playerExtraOptions.ToCncnetMessage(); + } + + private string BuildPlayerOptionsBroadcastngString() { - // | is the separator for the game details - StringBuilder sb = new StringBuilder("|DETAIL "); + StringBuilder sb = new StringBuilder("|PO "); + foreach (PlayerInfo pInfo in Players.Concat(AIPlayers)) + { + if (pInfo.IsAI) + sb.Append(pInfo.AILevel); + else + sb.Append(pInfo.Name); + sb.Append(";"); + // Combine the options into one integer to save bandwidth in + // cases where the player uses default options (this is common for AI players) + // Will hopefully make GameSurge kicking people a bit less common + byte[] byteArray = new byte[] + { + (byte)pInfo.TeamId, + (byte)pInfo.StartingLocation, + (byte)pInfo.ColorId, + (byte)pInfo.SideId, + }; + + int value = BitConverter.ToInt32(byteArray, 0); + sb.Append(value); + sb.Append(";"); + if (!pInfo.IsAI) + { + if (pInfo.AutoReady && !pInfo.IsInGame) + sb.Append(2); + else + sb.Append(Convert.ToInt32(pInfo.Ready)); + sb.Append(';'); + } + } return sb.ToString(); } + /// /// Only update the topic when something in the lobby has changed, but also only relevent to the CnCNetLobby. /// protected override void OnShouldUpdateTopic() { - if (channel != null) + if (channel != null && IsHost) { string newGameBroadcastString = BuildGameBroadcastingString(); - string newGameDetailsBroadcastString = BuildGameDetailsBroadcastingString(); - string gameBroadcastString = newGameBroadcastString += newGameDetailsBroadcastString; + string newGameOptionsBroadcastString = BuildGameOptionsBroadcastString(); + string newPlayerOptionsBroadcastString = BuildPlayerOptionsBroadcastngString(); + string newPlayerExtraOptionsBroadcastString = BuildAdditionalPlayerOptionsBroadcastString(); + + string newGameTopic = newGameBroadcastString += newGameOptionsBroadcastString += newPlayerOptionsBroadcastString += newPlayerExtraOptionsBroadcastString; - if (cachedGameBroadcastString != gameBroadcastString) + if (cachedGameTopic != newGameTopic) { - connectionManager.SetChannelTopic(channel, gameBroadcastString); - cachedGameBroadcastString = gameBroadcastString; + connectionManager.SetChannelTopic(channel, newGameTopic, 10); + cachedGameTopic = newGameTopic; } + + channel.Topic = cachedGameTopic; + } + else if (channel != null && !IsHost) + { + SendChatMessage("PLAYER IS NEEDING THE HOST TO UPDATE THE TOPIC"); } } #endregion diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/GameLobbyBase.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/GameLobbyBase.cs index 61666c817..e34443279 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/GameLobbyBase.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/GameLobbyBase.cs @@ -464,7 +464,7 @@ protected void BtnPlayerExtraOptions_LeftClick(object sender, EventArgs e) PlayerExtraOptionsPanel.Enable(); } - protected void ApplyPlayerExtraOptions(string sender, string message) + protected void ApplyPlayerExtraOptions(string message) { var playerExtraOptions = PlayerExtraOptions.FromMessage(message); diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/LANGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/LANGameLobby.cs index 5e04d43af..8f0422ed6 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/LANGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/LANGameLobby.cs @@ -864,7 +864,7 @@ private void HandlePlayerOptionsRequest(string sender, string data) BroadcastPlayerOptions(); } - private void HandlePlayerExtraOptionsBroadcast(string data) => ApplyPlayerExtraOptions(null, data); + private void HandlePlayerExtraOptionsBroadcast(string data) => ApplyPlayerExtraOptions(data); private void HandlePlayerOptionsBroadcast(string data) { diff --git a/DXMainClient/Domain/Multiplayer/PlayerExtraOptions.cs b/DXMainClient/Domain/Multiplayer/PlayerExtraOptions.cs index e3a34d210..26547dc86 100644 --- a/DXMainClient/Domain/Multiplayer/PlayerExtraOptions.cs +++ b/DXMainClient/Domain/Multiplayer/PlayerExtraOptions.cs @@ -41,7 +41,7 @@ public string GetTeamMappingsError() return null; } - public string ToCncnetMessage() => $"{CNCNET_MESSAGE_KEY} {ToString()}"; + public string ToCncnetMessage() => $"|{CNCNET_MESSAGE_KEY} {ToString()}"; public string ToLanMessage() => $"{LAN_MESSAGE_KEY} {ToString()}"; diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index e9869b2cf..ee55bcebb 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -981,9 +981,9 @@ private void DoServerLatencyTested(int candidateCount, int closerCount) candidateCount, closerCount))); } - public void SetChannelTopic(Channel channel, string topic) + public void SetChannelTopic(Channel channel, string topic, int priority = 10) { - connection.SetChannelTopic(channel.ChannelName, topic); + connection.SetChannelTopic(channel.ChannelName, topic, priority); } public void RequestChannelList(string pattern) diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index c6a5c32f8..0cc804f65 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -959,14 +959,14 @@ public void RequestChannelList(string pattern) QueueMessage(new QueuedMessage(listCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); } - public void SetChannelTopic(string channelName, string newTopic) + public void SetChannelTopic(string channelName, string newTopic, int priority = 10) { // Send the TOPIC command to the IRC server with the desired topic. string topicCommand = $"TOPIC {channelName} :{newTopic}"; Logger.Log($"Setting topic for {channelName}: {newTopic}"); // Queue the message to be sent to the server. - QueueMessage(new QueuedMessage(topicCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); + QueueMessage(new QueuedMessage(topicCommand, QueuedMessageType.GAME_TOPIC_CHANGED_MESSAGE, priority)); } public void ChangeNickname() diff --git a/DXMainClient/Online/QueuedMessageType.cs b/DXMainClient/Online/QueuedMessageType.cs index a0c5cb2aa..74b6e4069 100644 --- a/DXMainClient/Online/QueuedMessageType.cs +++ b/DXMainClient/Online/QueuedMessageType.cs @@ -20,5 +20,6 @@ public enum QueuedMessageType WHOIS_MESSAGE, INSTANT_MESSAGE, GAME_PLAYERS_EXTRA_MESSAGE, + GAME_TOPIC_CHANGED_MESSAGE, } } diff --git a/DXMainClient/Program.cs b/DXMainClient/Program.cs index 2b2ccd668..c02a3f619 100644 --- a/DXMainClient/Program.cs +++ b/DXMainClient/Program.cs @@ -99,7 +99,7 @@ static void Main(string[] args) InitializeApplicationConfiguration(); bool noAudio = false; - bool multipleInstanceMode = false; + bool multipleInstanceMode = true; List unknownStartupParams = new List(); for (int arg = 0; arg < args.Length; arg++) From d103b5095d43283d1424692b003127c227509939 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Sun, 13 Oct 2024 19:44:44 +0100 Subject: [PATCH 20/38] Special topic irc message type --- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 62 +++++-------------- .../GameLobby/MultiplayerGameLobby.cs | 4 +- DXMainClient/Online/Connection.cs | 1 + 3 files changed, 20 insertions(+), 47 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 27576aab3..ed3157bd3 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -273,7 +273,7 @@ public void OnJoined() UpdatePing(); UpdateDiscordPresence(true); - OnShouldUpdateTopic(); + OnHostShouldUpdateTopic(); } private void UpdatePing() @@ -381,8 +381,7 @@ public override void Clear() private void Channel_TopicChanged(object sender, MessageEventArgs e) { Logger.Log("CnCNetGameLobby ** Channel_TopicChanged " + e.Message); - if (!IsHost) - ParseGameTopic(e.Message); + ParseGameTopic(e.Message); } public void LeaveGameLobby() @@ -710,9 +709,13 @@ protected override void RequestReadyStatus() /// /// Handles player option requests received from non-host players. + /// E.g. I've received this message from a normal player (as a host) to update the TOPIC with the player's options. /// private void HandleOptionsRequest(string playerName, int options) { + Logger.Log($"HandleOptionsRequest: Received options from {playerName}."); + + if (!IsHost) return; @@ -770,7 +773,8 @@ private void HandleOptionsRequest(string playerName, int options) pInfo.TeamId = team; CopyPlayerDataToUI(); - BroadcastPlayerOptions(); + //BroadcastPlayerOptions(); + OnHostShouldUpdateTopic(); } /// @@ -963,42 +967,8 @@ protected override void OnGameOptionChanged() if (!IsHost) return; - bool[] optionValues = new bool[CheckBoxes.Count]; - for (int i = 0; i < CheckBoxes.Count; i++) - optionValues[i] = CheckBoxes[i].Checked; - - // Let's pack the booleans into bytes - List byteList = Conversions.BoolArrayIntoBytes(optionValues).ToList(); - - while (byteList.Count % 4 != 0) - byteList.Add(0); - - int integerCount = byteList.Count / 4; - byte[] byteArray = byteList.ToArray(); - - ExtendedStringBuilder sb = new ExtendedStringBuilder("GO ", true, ';'); - - for (int i = 0; i < integerCount; i++) - sb.Append(BitConverter.ToInt32(byteArray, i * 4)); - - // We don't gain much in most cases by packing the drop-down values - // (because they're bytes to begin with, and usually non-zero), - // so let's just transfer them as usual - - foreach (GameLobbyDropDown dd in DropDowns) - sb.Append(dd.SelectedIndex); - - sb.Append(Convert.ToInt32(Map?.Official ?? false)); - sb.Append(Map?.SHA1 ?? string.Empty); - sb.Append(GameMode?.Name ?? string.Empty); - sb.Append(FrameSendRate); - sb.Append(MaxAhead); - sb.Append(ProtocolVersion); - sb.Append(RandomSeed); - sb.Append(Convert.ToInt32(RemoveStartingLocations)); - sb.Append(Map?.UntranslatedName ?? string.Empty); - - channel.SendCTCPMessage(sb.ToString(), QueuedMessageType.GAME_SETTINGS_MESSAGE, 11); + //channel.SendCTCPMessage(sb.ToString(), QueuedMessageType.GAME_SETTINGS_MESSAGE, 11); + OnHostShouldUpdateTopic(); } /// @@ -1500,7 +1470,7 @@ protected override void LockGame() Locked = true; btnLockGame.Text = "Unlock Game".L10N("Client:Main:UnlockGame"); - OnShouldUpdateTopic(); + OnHostShouldUpdateTopic(); } protected override void UnlockGame(bool announce) @@ -1513,7 +1483,7 @@ protected override void UnlockGame(bool announce) AddNotice("The game room has been unlocked.".L10N("Client:Main:GameRoomUnlocked")); btnLockGame.Text = "Lock Game".L10N("Client:Main:LockGame"); - OnShouldUpdateTopic(); + OnHostShouldUpdateTopic(); } protected override void KickPlayer(int playerIndex) @@ -2017,7 +1987,7 @@ private string BuildPlayerOptionsBroadcastngString() /// /// Only update the topic when something in the lobby has changed, but also only relevent to the CnCNetLobby. /// - protected override void OnShouldUpdateTopic() + protected override void OnHostShouldUpdateTopic() { if (channel != null && IsHost) { @@ -2028,13 +1998,15 @@ protected override void OnShouldUpdateTopic() string newGameTopic = newGameBroadcastString += newGameOptionsBroadcastString += newPlayerOptionsBroadcastString += newPlayerExtraOptionsBroadcastString; + if (cachedGameTopic != newGameTopic) { - connectionManager.SetChannelTopic(channel, newGameTopic, 10); + Logger.Log($"Comparing cached topic: '{cachedGameTopic}' with new topic: '{newGameTopic}'"); + connectionManager.SetChannelTopic(channel, newGameTopic, 50); cachedGameTopic = newGameTopic; } - channel.Topic = cachedGameTopic; + //channel.Topic = cachedGameTopic; } else if (channel != null && !IsHost) { diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs index 136193c81..4d73dd360 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs @@ -953,10 +953,10 @@ protected override void OnGameOptionChanged() ClearReadyStatuses(); CopyPlayerDataToUI(); - OnShouldUpdateTopic(); + OnHostShouldUpdateTopic(); } - protected virtual void OnShouldUpdateTopic() {} + protected virtual void OnHostShouldUpdateTopic() {} protected abstract void HostLaunchGame(); diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 0cc804f65..f9e1b574d 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -1055,6 +1055,7 @@ public void QueueMessage(QueuedMessage qm) case QueuedMessageType.GAME_BROADCASTING_MESSAGE: case QueuedMessageType.GAME_PLAYERS_MESSAGE: case QueuedMessageType.GAME_SETTINGS_MESSAGE: + case QueuedMessageType.GAME_TOPIC_CHANGED_MESSAGE: case QueuedMessageType.GAME_PLAYERS_READY_STATUS_MESSAGE: case QueuedMessageType.GAME_LOCKED_MESSAGE: case QueuedMessageType.GAME_GET_READY_MESSAGE: From 90c8c840307066dd6f954448d9ab4f8e8fe00f74 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Sun, 13 Oct 2024 20:14:21 +0100 Subject: [PATCH 21/38] wip --- DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 3 ++- .../DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs | 2 +- DXMainClient/Online/Connection.cs | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index ed3157bd3..211741933 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1855,6 +1855,7 @@ private void ParseGameTopic(string topic) ApplyGameOptions(gameOptionMessage.Substring(3)); // Remove the "GO " prefix ApplyPlayerOptions(playerOptionsMessage.Substring(3)); // Remove the "PO " prefix ApplyPlayerExtraOptions(playerExtraOptionMessage.Substring(4)); // Remove the "PEO " prefix + CopyPlayerDataToUI(); } private string BuildGameBroadcastingString() @@ -1998,7 +1999,6 @@ protected override void OnHostShouldUpdateTopic() string newGameTopic = newGameBroadcastString += newGameOptionsBroadcastString += newPlayerOptionsBroadcastString += newPlayerExtraOptionsBroadcastString; - if (cachedGameTopic != newGameTopic) { Logger.Log($"Comparing cached topic: '{cachedGameTopic}' with new topic: '{newGameTopic}'"); @@ -2007,6 +2007,7 @@ protected override void OnHostShouldUpdateTopic() } //channel.Topic = cachedGameTopic; + } else if (channel != null && !IsHost) { diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs index 4d73dd360..39292cc01 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs @@ -968,7 +968,7 @@ protected override void CopyPlayerDataFromUI(object sender, EventArgs e) if (IsHost) { base.CopyPlayerDataFromUI(sender, e); - BroadcastPlayerOptions(); + OnHostShouldUpdateTopic(); return; } diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index f9e1b574d..74da32e0e 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -277,7 +277,7 @@ private void HandleComm() // A message has been succesfully received string msg = encoding.GetString(message, 0, bytesRead); - Logger.Log("Message received: " + msg); + //Logger.Log("Message received: " + msg); HandleMessage(msg); pingTimer.Change(30000, 30000); @@ -544,7 +544,7 @@ private void PerformCommand(string message) ParseIrcMessage(message, out prefix, out command, out parameters); string paramString = String.Empty; foreach (string param in parameters) { paramString = paramString + param + ","; } - Logger.Log("RMP: " + prefix + " " + command + " " + paramString); + //Logger.Log("RMP: " + prefix + " " + command + " " + paramString); try { From da7888eeb65f2a4f4cddf1a2d3b2b3f0fe0d0631 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Mon, 14 Oct 2024 19:29:55 +0100 Subject: [PATCH 22/38] wip --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 199 +++++++--- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 343 ++++++++++-------- .../Multiplayer/CnCNet/HostedCnCNetGame.cs | 11 +- DXMainClient/Online/CnCNetManager.cs | 4 +- DXMainClient/Online/Connection.cs | 4 +- 5 files changed, 348 insertions(+), 213 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index e8d66160b..e85d14a7a 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -606,58 +606,142 @@ private void RequestChannelList(object state) connectionManager.RequestChannelList(pattern); } - private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEventArgs e) + private void OnParseGameTopic(string topic, string channelName) { - Logger.Log($"GameBroadcastChannel_ChannelListReceived ** {e.ChannelName}, {e.Topic}"); - - var cncnetManager = (CnCNetManager)sender; - - // Ensure the topic starts with "GAME " as expected - if (!e.Topic.StartsWith("GL ")) + // GD | GO | PO | PEO + // Ensure the topic starts with "GD " as expected + if (!topic.StartsWith("GD ")) return; - // Split the topic into GAME, DETAIL, PO parts using '|' - string[] topicParts = e.Topic.Substring(3).Split('|'); - string gameListingInfo = topicParts[0]; // The part before '|', containing GL data - - // Example Topic: GL R10;N/A;8;#cncnet-yr-game7417533;neogrant's Game;00000;neogrant;[2] A Hill Between;Battle;198.244.177.26:50000;0 - string[] splitMessage = gameListingInfo.Split(new char[] { ';' }); - - // Ensure the message has the expected number of parts - if (splitMessage.Length != 11) - { - Logger.Log("Ignoring game message because of an invalid number of parameters."); - return; - } + // Split the topic into GAME and DETAIL parts using '|' + string[] topicParts = topic.Split('|'); + string gameDetails = topicParts[0]; + //string gameOptions = topicParts.Length > 1 ? topicParts[1] : null; + string playerOptions = topicParts.Length > 2 ? topicParts[2] : null; + //string extraPlayerOptions = topicParts.Length > 3 ? topicParts[3] : null; + + ApplyGameDetails( + gameDetails.Substring(3), // Remove the "GD " prefix + playerOptions.Substring(3), // Remove the "PO " prefix + channelName + ); + } + + ///// + ///// Return playerInfo from game options message + ///// Should be in a helper somewhere. + ///// + ///// + ///// + //private List GetPlayerInfoFromPlayerOptionsMessage(string playerOptionsMessage) + //{ + // List players = new List(); + // string[] playerOptionsArray = playerOptionsMessage.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + + // for (int i = 0; i < playerOptionsArray.Length; i += 3) // Each player has 3 segments: Name/AILevel, Options, ReadyStatus + // { + // PlayerInfo playerInfo = new PlayerInfo(); + + // // Parse AI or player name + // string playerOrAI = playerOptionsArray[i]; + // if (int.TryParse(playerOrAI, out int aiLevel)) + // { + // // This is an AI player + // playerInfo.IsAI = true; + // playerInfo.AILevel = aiLevel; + // } + // else + // { + // // This is a real player + // playerInfo.IsAI = false; + // playerInfo.Name = playerOrAI; + // } + + // // Parse the packed integer options + // int packedOptions = int.Parse(playerOptionsArray[i + 1]); + // byte[] byteArray = BitConverter.GetBytes(packedOptions); + + // playerInfo.TeamId = byteArray[0]; + // playerInfo.StartingLocation = byteArray[1]; + // playerInfo.ColorId = byteArray[2]; + // playerInfo.SideId = byteArray[3]; + + // // Parse the ready status + // if (!playerInfo.IsAI) + // { + // playerInfo.Ready = playerOptionsArray[i + 2] == "1"; + // playerInfo.AutoReady = playerOptionsArray[i + 2] == "2"; + // } + + // players.Add(playerInfo); + // } + + // return players; + //} + + private void ApplyGameDetails(string gameDetailsMessage, string playerOptionsMessage, string channelName) + { try { - string revision = splitMessage[0]; + //List players = GetPlayerInfoFromPlayerOptionsMessage(playerOptionsMessage); + + string[] splitGameDettailsMessage = gameDetailsMessage.Split(new char[] { ';' }); + // 0. Protocol version + // 1. Game Version + // 2. Player Limit + // 3. Channel UI Name + // 4. Locked + // 5. Is Custom Password + // 6. Closed + // 7. IsLoadedGame + // 8. IsLadder + // 9. LoadedGameId + // 10. Map Is Official + // 11. Map Untranslated Name + // 12. Map SHA1 + // 13. Game Mode Name + // 14. Tunnel address: Port + // 15. FrameSendRate @TODO: We can remove? + // 16. MaxAhead @TODO: We can remove? + // 17. ProtocolVersion @TODO: We can remove? + // 18. RandomSeed + // 19. RemoveStartingLocations + // 20. Players + + string revision = splitGameDettailsMessage[0]; if (revision != ProgramConstants.CNCNET_PROTOCOL_REVISION) return; - string gameVersion = splitMessage[1]; - int maxPlayers = Conversions.IntFromString(splitMessage[2], 0); - string gameRoomChannelName = splitMessage[3]; - string gameRoomDisplayName = splitMessage[4]; - bool locked = Conversions.BooleanFromString(splitMessage[5].Substring(0, 1), true); - bool isCustomPassword = Conversions.BooleanFromString(splitMessage[5].Substring(1, 1), false); - bool isClosed = Conversions.BooleanFromString(splitMessage[5].Substring(2, 1), true); - bool isLoadedGame = Conversions.BooleanFromString(splitMessage[5].Substring(3, 1), false); - bool isLadder = Conversions.BooleanFromString(splitMessage[5].Substring(4, 1), false); - string[] players = splitMessage[6].Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); - string hostName = players[0]; // Assume host is always first in the list - List playerNames = players.ToList(); - string mapName = splitMessage[7]; - string gameMode = splitMessage[8]; - - string[] tunnelAddressAndPort = splitMessage[9].Split(':'); + string gameVersion = splitGameDettailsMessage[1]; + int maxPlayers = Conversions.IntFromString(splitGameDettailsMessage[2], 0); + string channelUIName = splitGameDettailsMessage[3]; + bool isLocked = Conversions.BooleanFromString(splitGameDettailsMessage[4], true); + bool isCustomPassword = Conversions.BooleanFromString(splitGameDettailsMessage[5], true); + bool isClosed = Conversions.BooleanFromString(splitGameDettailsMessage[6], true); + bool isLoadedGame = Conversions.BooleanFromString(splitGameDettailsMessage[7], true); + bool isLadderGame = Conversions.BooleanFromString(splitGameDettailsMessage[8], true); + string loadedGameId = splitGameDettailsMessage[9]; + string mapOfficial = splitGameDettailsMessage[10]; + string mapName = splitGameDettailsMessage[11]; + string mapSHA1 = splitGameDettailsMessage[12]; + string gameMode = splitGameDettailsMessage[13]; + string[] tunnelAddressAndPort = splitGameDettailsMessage[14].Split(':'); + string messageFrameSendRate = splitGameDettailsMessage[15]; + string messageMaxAhead = splitGameDettailsMessage[16]; + string messageGameProtocolVersion = splitGameDettailsMessage[17]; + string messagePlayers = splitGameDettailsMessage[20]; + + + // Now do stuff + // Pluck out playernames from players + + string[] playersList = messagePlayers.Split(','); + string hostName = playersList[0]; // Host is the first in the list string tunnelAddress = tunnelAddressAndPort[0]; int tunnelPort = int.Parse(tunnelAddressAndPort[1]); - string loadedGameId = splitMessage[10]; - - CnCNetGame cncnetGame = gameCollection.GetGameFromHostedChannelName(e.ChannelName); + CnCNetGame cncnetGame = gameCollection.GetGameFromHostedChannelName(channelName); CnCNetTunnel tunnel = tunnelHandler.Tunnels.Find(t => t.Address == tunnelAddress && t.Port == tunnelPort); if (tunnel == null || cncnetGame == null) @@ -667,14 +751,14 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv } HostedCnCNetGame game = new HostedCnCNetGame( - gameRoomChannelName, + channelName, revision, gameVersion, maxPlayers, - gameRoomDisplayName, + channelUIName, isCustomPassword, true, - players, + playersList, hostName, mapName, gameMode @@ -683,9 +767,9 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv game.IsLoadedGame = isLoadedGame; game.MatchID = loadedGameId; game.LastRefreshTime = DateTime.Now; - game.IsLadder = isLadder; + game.IsLadder = isLadderGame; game.Game = cncnetGame; - game.Locked = locked || (game.IsLoadedGame && !game.Players.Contains(ProgramConstants.PLAYERNAME)); + game.Locked = isLocked || (game.IsLoadedGame && !game.Players.Contains(ProgramConstants.PLAYERNAME)); game.Incompatible = cncnetGame == localGame && game.GameVersion != ProgramConstants.GAME_VERSION; game.TunnelServer = tunnel; @@ -712,9 +796,9 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv } else { - if (UserINISettings.Instance.PlaySoundOnGameHosted - && cncnetGame.InternalName == localGameID.ToLower() - && !ProgramConstants.IsInGame + if (UserINISettings.Instance.PlaySoundOnGameHosted + && cncnetGame.InternalName == localGameID.ToLower() + && !ProgramConstants.IsInGame && !game.Locked) { SoundPlayer.Play(sndGameCreated); @@ -724,15 +808,22 @@ private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEv } SortAndRefreshHostedGames(); + } catch (Exception ex) { - Logger.Log("Game parsing error: " + ex.ToString()); + Logger.Log("Error applying game details: " + ex.Message); } } + private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEventArgs e) + { + Logger.Log($"GameBroadcastChannel_ChannelListReceived ** {e.ChannelName}, {e.Topic}"); + OnParseGameTopic(e.Topic, e.ChannelName); + } + /// - /// Displays a message when the IRC server has informed that the local user + /// Displays a gameDetailsMessage when the IRC server has informed that the local user /// has been banned from a channel that they're attempting to join. /// private void ConnectionManager_BannedFromChannel(object sender, ChannelEventArgs e) @@ -919,7 +1010,7 @@ private string GetJoinGameErrorBase() } /// /// Checks if the user can join a game. - /// Returns null if the user can, otherwise returns an error message + /// Returns null if the user can, otherwise returns an error gameDetailsMessage /// that tells the reason why the user cannot join the game. /// /// The index of the game in the game list box. @@ -932,7 +1023,7 @@ private string GetJoinGameErrorByIndex(int gameIndex) } /// - /// Returns an error message if game is not join-able, otherwise null. + /// Returns an error gameDetailsMessage if game is not join-able, otherwise null. /// /// /// @@ -979,7 +1070,7 @@ private bool JoinGameByIndex(int gameIndex, string password) /// /// The game to join. /// The password to join with. - /// The message view/list to write error messages to. + /// The gameDetailsMessage view/list to write error messages to. /// private bool JoinGame(HostedCnCNetGame hg, string password, IMessageView messageView) { @@ -1727,7 +1818,7 @@ private HostedCnCNetGame GetHostedGameForUser(IRCUser user) /// they are currently in one. /// /// The user to join. - /// The message view/list to write error messages to. + /// The gameDetailsMessage view/list to write error messages to. private void JoinUser(IRCUser user, IMessageView messageView) { if (user == null) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 211741933..866f4b93f 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -59,7 +59,7 @@ DiscordHandler discordHandler { new IntCommandHandler("OR", HandleOptionsRequest), new IntCommandHandler("R", HandleReadyRequest), - //new StringCommandHandler("PO", ApplyPlayerOptions), + new StringCommandHandler("PO", ApplyPlayerOptions), //new StringCommandHandler(PlayerExtraOptions.CNCNET_MESSAGE_KEY, ApplyPlayerExtraOptions), //new StringCommandHandler("GO", ApplyGameOptions), new StringCommandHandler("START", NonHostLaunchGame), @@ -529,8 +529,9 @@ private void Channel_UserAdded(object sender, ChannelUserEventArgs e) // new player, and it also sends an options broadcast message //CopyPlayerDataToUI(); This is also called by ChangeMap() ChangeMap(GameModeMap); + BroadcastPlayerOptions(); - BroadcastPlayerExtraOptions(); + OnHostShouldUpdateTopic(); UpdateDiscordPresence(); } else @@ -556,7 +557,8 @@ private void RemovePlayer(string playerName) CopyPlayerDataToUI(); - // This might not be necessary + OnHostShouldUpdateTopic(); + if (IsHost) BroadcastPlayerOptions(); } @@ -773,7 +775,6 @@ private void HandleOptionsRequest(string playerName, int options) pInfo.TeamId = team; CopyPlayerDataToUI(); - //BroadcastPlayerOptions(); OnHostShouldUpdateTopic(); } @@ -794,6 +795,7 @@ private void HandleReadyRequest(string playerName, int readyStatus) pInfo.AutoReady = readyStatus > 1; CopyPlayerDataToUI(); + OnHostShouldUpdateTopic(); BroadcastPlayerOptions(); } @@ -842,25 +844,25 @@ protected override void BroadcastPlayerOptions() protected override void PlayerExtraOptions_OptionsChanged(object sender, EventArgs e) { base.PlayerExtraOptions_OptionsChanged(sender, e); + BroadcastPlayerExtraOptions(); } protected override void BroadcastPlayerExtraOptions() { if (!IsHost) - return; - + return; + var playerExtraOptions = GetPlayerExtraOptions(); - channel.SendCTCPMessage(playerExtraOptions.ToCncnetMessage(), QueuedMessageType.GAME_PLAYERS_EXTRA_MESSAGE, 11, true); } /// /// Handles player option messages received from the game host. /// - private void ApplyPlayerOptions(string message) + private void ApplyPlayerOptions(string sender, string message) { - if (IsHost) + if (sender != hostName) return; Players.Clear(); @@ -963,83 +965,133 @@ private void ApplyPlayerOptions(string message) protected override void OnGameOptionChanged() { base.OnGameOptionChanged(); + } - if (!IsHost) - return; + private void ApplyGameDetails(string message) + { + string[] splitMessage = message.Split(new char[] { ';' }); + + try + { + // 0. Protocol version + // 1. Game Version + // 2. Player Limit + // 3. Channel UI Name + // 4. Locked + // 5. Is Custom Password + // 6. Closed + // 7. IsLoadedGame + // 8. IsLadder + // 9. LoadedGameId + // 10. Map Is Official + // 11. Map Untranslated Name + // 12. Map SHA1 + // 13. Game Mode Name + // 14. Tunnel address: Port + // 15. FrameSendRate @TODO: We can remove? + // 16. MaxAhead @TODO: We can remove? + // 17. ProtocolVersion @TODO: We can remove? + // 18. RandomSeed + // 19. RemoveStartingLocations + + string mapOfficial = splitMessage[10]; + string mapName = splitMessage[11]; + string mapSHA1 = splitMessage[12]; + string gameMode = splitMessage[13]; + string messageFrameSendRate = splitMessage[15]; + string messageMaxAhead = splitMessage[16]; + string messageGameProtocolVersion = splitMessage[17]; + string messageRandomSeed = splitMessage[18]; + string messageRemoveStartingLocations = splitMessage[19]; + + + // Do stuff with it. + // Seed + int randomSeed; + bool parseSuccess = int.TryParse(messageRandomSeed, out randomSeed); + + if (!parseSuccess) + { + AddNotice(("Failed to parse random seed from game options message! " + + "The game host's game version might be different from yours.").L10N("Client:Main:HostRandomSeedError"), Color.Red); + } - //channel.SendCTCPMessage(sb.ToString(), QueuedMessageType.GAME_SETTINGS_MESSAGE, 11); - OnHostShouldUpdateTopic(); - } + RandomSeed = randomSeed; - /// - /// Handles game option messages received from the game host. - /// - private void ApplyGameOptions(string message) - { - string[] parts = message.Split(';'); + bool removeStartingLocations = Convert.ToBoolean(Conversions.IntFromString(messageRemoveStartingLocations,Convert.ToInt32(RemoveStartingLocations))); + SetRandomStartingLocations(removeStartingLocations); - int checkBoxIntegerCount = (CheckBoxes.Count / 32) + 1; - int partIndex = checkBoxIntegerCount + DropDowns.Count; + // Map things + GameModeMap currentGameModeMap = GameModeMap; + bool isMapOfficial = Conversions.BooleanFromString(mapOfficial, true); - if (parts.Length < partIndex + 6) - { - AddNotice(("The game host has sent an invalid game options message! " + - "The game host's game version might be different from yours.").L10N("Client:Main:HostGameOptionInvalid"), Color.Red); - return; - } + GameModeMap = GameModeMaps.Find(gmm => gmm.GameMode.Name == gameMode && gmm.Map.SHA1 == mapSHA1); + if (GameModeMap == null) + { + ChangeMap(null); - string mapOfficial = parts[partIndex]; - bool isMapOfficial = Conversions.BooleanFromString(mapOfficial, true); + if (!string.IsNullOrEmpty(mapSHA1)) + { + if (!isMapOfficial) + RequestMap(mapSHA1); + else + ShowOfficialMapMissingMessage(mapSHA1); + } + } + else if (GameModeMap != currentGameModeMap) + { + ChangeMap(GameModeMap); + } - string mapSHA1 = parts[partIndex + 1]; + lastMapName = mapName; + lastGameMode = gameMode; + lastMapSHA1 = mapSHA1; - string gameMode = parts[partIndex + 2]; + int frameSendRate = Conversions.IntFromString(messageFrameSendRate, FrameSendRate); + if (frameSendRate != FrameSendRate) + { + FrameSendRate = frameSendRate; + AddNotice(string.Format("The game host has changed FrameSendRate (order lag) to {0}".L10N("Client:Main:HostChangeFrameSendRate"), frameSendRate)); + } - int frameSendRate = Conversions.IntFromString(parts[partIndex + 3], FrameSendRate); - if (frameSendRate != FrameSendRate) - { - FrameSendRate = frameSendRate; - AddNotice(string.Format("The game host has changed FrameSendRate (order lag) to {0}".L10N("Client:Main:HostChangeFrameSendRate"), frameSendRate)); - } + int maxAhead = Conversions.IntFromString(messageMaxAhead, MaxAhead); + if (maxAhead != MaxAhead) + { + MaxAhead = maxAhead; + AddNotice(string.Format("The game host has changed MaxAhead to {0}".L10N("Client:Main:HostChangeMaxAhead"), maxAhead)); + } - int maxAhead = Conversions.IntFromString(parts[partIndex + 4], MaxAhead); - if (maxAhead != MaxAhead) - { - MaxAhead = maxAhead; - AddNotice(string.Format("The game host has changed MaxAhead to {0}".L10N("Client:Main:HostChangeMaxAhead"), maxAhead)); + int protocolVersion = Conversions.IntFromString(messageGameProtocolVersion, ProtocolVersion); + if (protocolVersion != ProtocolVersion) + { + ProtocolVersion = protocolVersion; + AddNotice(string.Format("The game host has changed ProtocolVersion to {0}".L10N("Client:Main:HostChangeProtocolVersion"), protocolVersion)); + } } - - int protocolVersion = Conversions.IntFromString(parts[partIndex + 5], ProtocolVersion); - if (protocolVersion != ProtocolVersion) + catch (Exception ex) { - ProtocolVersion = protocolVersion; - AddNotice(string.Format("The game host has changed ProtocolVersion to {0}".L10N("Client:Main:HostChangeProtocolVersion"), protocolVersion)); + Logger.Log("Error applying game details: " + ex.Message); } + } - string mapName = parts[partIndex + 8]; - GameModeMap currentGameModeMap = GameModeMap; - lastGameMode = gameMode; - lastMapSHA1 = mapSHA1; - lastMapName = mapName; + /// + /// Handles game option messages received from the game host. + /// + private void ApplyGameOptions(string message) + { + string[] parts = message.Split(';'); - GameModeMap = GameModeMaps.Find(gmm => gmm.GameMode.Name == gameMode && gmm.Map.SHA1 == mapSHA1); - if (GameModeMap == null) - { - ChangeMap(null); + int checkBoxIntegerCount = (CheckBoxes.Count / 32) + 1; - if (!string.IsNullOrEmpty(mapSHA1)) - { - if (!isMapOfficial) - RequestMap(mapSHA1); - else - ShowOfficialMapMissingMessage(mapSHA1); - } - } - else if (GameModeMap != currentGameModeMap) + int partIndex = checkBoxIntegerCount + DropDowns.Count; + + if (parts.Length < partIndex) { - ChangeMap(GameModeMap); + AddNotice(("The game host has sent an invalid game options message! " + + "The game host's game version might be different from yours.").L10N("Client:Main:HostGameOptionInvalid"), Color.Red); + return; } // By changing the game options after changing the map, we know which @@ -1124,21 +1176,6 @@ private void ApplyGameOptions(string message) DropDowns[i - checkBoxIntegerCount].SelectedIndex = ddSelectedIndex; } - - int randomSeed; - bool parseSuccess = int.TryParse(parts[partIndex + 6], out randomSeed); - - if (!parseSuccess) - { - AddNotice(("Failed to parse random seed from game options message! " + - "The game host's game version might be different from yours.").L10N("Client:Main:HostRandomSeedError"), Color.Red); - } - - bool removeStartingLocations = Convert.ToBoolean(Conversions.IntFromString(parts[partIndex + 7], - Convert.ToInt32(RemoveStartingLocations))); - SetRandomStartingLocations(removeStartingLocations); - - RandomSeed = randomSeed; } private void RequestMap(string mapSHA1) @@ -1193,11 +1230,10 @@ protected override void GameProcessExited() if (IsHost) { RandomSeed = new Random().Next(); - OnGameOptionChanged(); + OnGameOptionChanged(); // This eventually calls OnHostShouldUpdateTopic() ClearReadyStatuses(); CopyPlayerDataToUI(); BroadcastPlayerOptions(); - BroadcastPlayerExtraOptions(); if (Players.Count < playerLimit) UnlockGame(true); @@ -1840,63 +1876,92 @@ private void DownloadMapByIdCommand(string parameters) #region Game broadcasting logic private void ParseGameTopic(string topic) { - // GL | GO | PO | PEO - // Ensure the topic starts with "GL " as expected - if (!topic.StartsWith("GL ")) + // GD | GO | PO | PEO + // Ensure the topic starts with "GD " as expected + if (!topic.StartsWith("GD ")) return; // Split the topic into GAME and DETAIL parts using '|' - string[] topicParts = topic.Substring(5).Split('|'); - string gameListing = topicParts[0]; - string gameOptionMessage = topicParts.Length > 1 ? topicParts[1] : null; - string playerOptionsMessage = topicParts.Length > 2 ? topicParts[2] : null; - string playerExtraOptionMessage = topicParts.Length > 3 ? topicParts[3] : null; - - ApplyGameOptions(gameOptionMessage.Substring(3)); // Remove the "GO " prefix - ApplyPlayerOptions(playerOptionsMessage.Substring(3)); // Remove the "PO " prefix - ApplyPlayerExtraOptions(playerExtraOptionMessage.Substring(4)); // Remove the "PEO " prefix + string[] topicParts = topic.Split('|'); + string gameDetails = topicParts[0]; + string gameOptions = topicParts.Length > 1 ? topicParts[1] : null; + string playerOptions = topicParts.Length > 2 ? topicParts[2] : null; + string extraPlayerOptions = topicParts.Length > 3 ? topicParts[3] : null; + + ApplyGameDetails(gameDetails.Substring(3)); // Remove the "GD " prefix + ApplyGameOptions(gameOptions.Substring(3)); // Remove the "GO " prefix + + // Player options is just too big to include in topic + // ApplyPlayerOptions(playerOptions.Substring(3)); // Remove the "PO " prefix + + ApplyPlayerExtraOptions(extraPlayerOptions.Substring(4)); // Remove the "PEO " prefix + CopyPlayerDataToUI(); } - private string BuildGameBroadcastingString() - { - StringBuilder sb = new StringBuilder("GL "); // Short for Game Listings + private string BuildGameDetailsBroadcastString() + { + // 0. Protocol version + // 1. Game Version + // 2. Player Limit + // 3. Channel UI Name + // 4. Locked + // 5. Is Custom Password + // 6. Closed + // 7. IsLoadedGame + // 8. IsLadder + // 9. LoadedGameId + // 10. Map Is Official + // 11. Map Untranslated Name + // 12. Map SHA1 + // 13. Game Mode Name + // 14. Tunnel address: Port + // 15. FrameSendRate @TODO: We can remove? + // 16. MaxAhead @TODO: We can remove? + // 17. ProtocolVersion @TODO: We can remove? + // 18. RandomSeed + // 19. RemoveStartingLocations + // 20. Players + + ExtendedStringBuilder sb = new ExtendedStringBuilder("GD ", true, ';'); + sb.Append(ProgramConstants.CNCNET_PROTOCOL_REVISION); - sb.Append(";"); sb.Append(ProgramConstants.GAME_VERSION); - sb.Append(";"); sb.Append(playerLimit); - sb.Append(";"); - sb.Append(channel.ChannelName); - sb.Append(";"); sb.Append(channel.UIName); - sb.Append(";"); - if (Locked) - sb.Append("1"); - else - sb.Append("0"); + sb.Append(Convert.ToInt32(Locked)); sb.Append(Convert.ToInt32(isCustomPassword)); sb.Append(Convert.ToInt32(closed)); sb.Append("0"); // IsLoadedGame sb.Append("0"); // IsLadder - sb.Append(";"); + sb.Append("0"); // LoadedGameId + + sb.Append(Convert.ToInt32(Map?.Official ?? false)); + sb.Append(Map.UntranslatedName ?? string.Empty); + sb.Append(Map?.SHA1 ?? string.Empty); + sb.Append(GameMode?.Name ?? string.Empty); + sb.Append(tunnelHandler?.CurrentTunnel == null ? string.Empty : tunnelHandler.CurrentTunnel.Address + ":" + tunnelHandler.CurrentTunnel.Port); + sb.Append(FrameSendRate); + sb.Append(MaxAhead); + sb.Append(ProtocolVersion); + sb.Append(RandomSeed); + sb.Append(Convert.ToInt32(RemoveStartingLocations)); + + string gameDetails = sb.ToString(); + StringBuilder playersSb = new StringBuilder(""); foreach (PlayerInfo pInfo in Players) { - sb.Append(pInfo.Name); - sb.Append(","); + playersSb.Append(pInfo.Name); + playersSb.Append(","); } - sb.Remove(sb.Length - 1, 1); - sb.Append(";"); - sb.Append("Map TODO"); - sb.Append(";"); - sb.Append(GameMode?.UntranslatedUIName ?? string.Empty); - sb.Append(";"); - sb.Append(tunnelHandler?.CurrentTunnel == null ? string.Empty : tunnelHandler.CurrentTunnel.Address + ":" + tunnelHandler.CurrentTunnel.Port); - sb.Append(";"); - sb.Append(0); // LoadedGameId + if (playersSb.Length > 0) + playersSb.Remove(playersSb.Length - 1, 1); - return sb.ToString(); + playersSb.Append(";"); + + gameDetails += playersSb.ToString(); + return gameDetails; } private string BuildGameOptionsBroadcastString() @@ -1916,27 +1981,15 @@ private string BuildGameOptionsBroadcastString() int integerCount = byteList.Count / 4; byte[] byteArray = byteList.ToArray(); - for (int i = 0; i < integerCount; i++) sb.Append(BitConverter.ToInt32(byteArray, i * 4)); // We don't gain much in most cases by packing the drop-down values // (because they're bytes to begin with, and usually non-zero), // so let's just transfer them as usual - foreach (GameLobbyDropDown dd in DropDowns) sb.Append(dd.SelectedIndex); - sb.Append(Convert.ToInt32(Map?.Official ?? false)); - sb.Append(Map?.SHA1 ?? string.Empty); - sb.Append(GameMode?.Name ?? string.Empty); - sb.Append(FrameSendRate); - sb.Append(MaxAhead); - sb.Append(ProtocolVersion); - sb.Append(RandomSeed); - sb.Append(Convert.ToInt32(RemoveStartingLocations)); - sb.Append(Map?.UntranslatedName ?? string.Empty); - return sb.ToString(); } @@ -1947,7 +2000,7 @@ private string BuildAdditionalPlayerOptionsBroadcastString() return playerExtraOptions.ToCncnetMessage(); } - private string BuildPlayerOptionsBroadcastngString() + private string BuildPlayerOptionsBroadcastString() { StringBuilder sb = new StringBuilder("|PO "); foreach (PlayerInfo pInfo in Players.Concat(AIPlayers)) @@ -1992,26 +2045,18 @@ protected override void OnHostShouldUpdateTopic() { if (channel != null && IsHost) { - string newGameBroadcastString = BuildGameBroadcastingString(); - string newGameOptionsBroadcastString = BuildGameOptionsBroadcastString(); - string newPlayerOptionsBroadcastString = BuildPlayerOptionsBroadcastngString(); - string newPlayerExtraOptionsBroadcastString = BuildAdditionalPlayerOptionsBroadcastString(); + string gameDetails = BuildGameDetailsBroadcastString(); + string gameOptions = BuildGameOptionsBroadcastString(); + string playerOptions = BuildPlayerOptionsBroadcastString(); + string extraPlayerOptions = BuildAdditionalPlayerOptionsBroadcastString(); - string newGameTopic = newGameBroadcastString += newGameOptionsBroadcastString += newPlayerOptionsBroadcastString += newPlayerExtraOptionsBroadcastString; + string newGameTopic = gameDetails += gameOptions += playerOptions += extraPlayerOptions; if (cachedGameTopic != newGameTopic) { - Logger.Log($"Comparing cached topic: '{cachedGameTopic}' with new topic: '{newGameTopic}'"); - connectionManager.SetChannelTopic(channel, newGameTopic, 50); + connectionManager.SetChannelTopic(channel, newGameTopic); cachedGameTopic = newGameTopic; } - - //channel.Topic = cachedGameTopic; - - } - else if (channel != null && !IsHost) - { - SendChatMessage("PLAYER IS NEEDING THE HOST TO UPDATE THE TOPIC"); } } #endregion diff --git a/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs b/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs index f97aff68d..eb8ab02a4 100644 --- a/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs +++ b/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs @@ -6,20 +6,19 @@ public class HostedCnCNetGame : GenericHostedGame { public HostedCnCNetGame() { } - public HostedCnCNetGame(string channelName, string revision, string gamever, int maxPlayers, - string roomName, bool passworded, - bool tunneled, - string[] players, string adminName, string mapName, string gameMode) + public HostedCnCNetGame(string channelName, string revision, string gameVersion, int maxPlayers, + string roomName, bool passworded, bool tunneled, string[] players, + string hostName, string mapName, string gameMode) { ChannelName = channelName; Revision = revision; - GameVersion = gamever; + GameVersion = gameVersion; MaxPlayers = maxPlayers; RoomName = roomName; Passworded = passworded; Tunneled = tunneled; Players = players; - HostName = adminName; + HostName = hostName; Map = mapName; GameMode = gameMode; } diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index ee55bcebb..e9869b2cf 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -981,9 +981,9 @@ private void DoServerLatencyTested(int candidateCount, int closerCount) candidateCount, closerCount))); } - public void SetChannelTopic(Channel channel, string topic, int priority = 10) + public void SetChannelTopic(Channel channel, string topic) { - connection.SetChannelTopic(channel.ChannelName, topic, priority); + connection.SetChannelTopic(channel.ChannelName, topic); } public void RequestChannelList(string pattern) diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 74da32e0e..6de1b8eb5 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -959,14 +959,14 @@ public void RequestChannelList(string pattern) QueueMessage(new QueuedMessage(listCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); } - public void SetChannelTopic(string channelName, string newTopic, int priority = 10) + public void SetChannelTopic(string channelName, string newTopic) { // Send the TOPIC command to the IRC server with the desired topic. string topicCommand = $"TOPIC {channelName} :{newTopic}"; Logger.Log($"Setting topic for {channelName}: {newTopic}"); // Queue the message to be sent to the server. - QueueMessage(new QueuedMessage(topicCommand, QueuedMessageType.GAME_TOPIC_CHANGED_MESSAGE, priority)); + QueueMessage(new QueuedMessage(topicCommand, QueuedMessageType.GAME_TOPIC_CHANGED_MESSAGE, 20)); } public void ChangeNickname() From aed6566c799d5cd8a53236500d6e4f21dbf88497 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 15 Oct 2024 12:00:01 +0100 Subject: [PATCH 23/38] hybrid ctcp/topic handling --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 8 +- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 149 +++++++++--------- .../GameLobby/MultiplayerGameLobby.cs | 2 +- 3 files changed, 78 insertions(+), 81 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index e85d14a7a..0e1d50c0f 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -616,13 +616,11 @@ private void OnParseGameTopic(string topic, string channelName) // Split the topic into GAME and DETAIL parts using '|' string[] topicParts = topic.Split('|'); string gameDetails = topicParts[0]; - //string gameOptions = topicParts.Length > 1 ? topicParts[1] : null; - string playerOptions = topicParts.Length > 2 ? topicParts[2] : null; - //string extraPlayerOptions = topicParts.Length > 3 ? topicParts[3] : null; + string gameOptions = topicParts.Length > 1 ? topicParts[1] : null; + string extraPlayerOptions = topicParts.Length > 2 ? topicParts[2] : null; ApplyGameDetails( gameDetails.Substring(3), // Remove the "GD " prefix - playerOptions.Substring(3), // Remove the "PO " prefix channelName ); } @@ -679,7 +677,7 @@ private void OnParseGameTopic(string topic, string channelName) // return players; //} - private void ApplyGameDetails(string gameDetailsMessage, string playerOptionsMessage, string channelName) + private void ApplyGameDetails(string gameDetailsMessage, string channelName) { try diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 866f4b93f..d2cf8d730 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -59,9 +59,9 @@ DiscordHandler discordHandler { new IntCommandHandler("OR", HandleOptionsRequest), new IntCommandHandler("R", HandleReadyRequest), - new StringCommandHandler("PO", ApplyPlayerOptions), + new StringCommandHandler("PO", ApplyPlayerOptionsFromCTCP), //new StringCommandHandler(PlayerExtraOptions.CNCNET_MESSAGE_KEY, ApplyPlayerExtraOptions), - //new StringCommandHandler("GO", ApplyGameOptions), + //new StringCommandHandler("GO", ApplyGameOptionsFromTopic), new StringCommandHandler("START", NonHostLaunchGame), new NotificationHandler("AISPECS", HandleNotification, AISpectatorsNotification), new NotificationHandler("GETREADY", HandleNotification, GetReadyNotification), @@ -273,6 +273,7 @@ public void OnJoined() UpdatePing(); UpdateDiscordPresence(true); + BroadcastPlayerOptions(); OnHostShouldUpdateTopic(); } @@ -711,13 +712,11 @@ protected override void RequestReadyStatus() /// /// Handles player option requests received from non-host players. - /// E.g. I've received this message from a normal player (as a host) to update the TOPIC with the player's options. /// private void HandleOptionsRequest(string playerName, int options) { Logger.Log($"HandleOptionsRequest: Received options from {playerName}."); - if (!IsHost) return; @@ -775,7 +774,8 @@ private void HandleOptionsRequest(string playerName, int options) pInfo.TeamId = team; CopyPlayerDataToUI(); - OnHostShouldUpdateTopic(); + //OnHostShouldUpdateTopic(); + BroadcastPlayerOptions(); } /// @@ -804,41 +804,7 @@ private void HandleReadyRequest(string playerName, int readyStatus) /// protected override void BroadcastPlayerOptions() { - // Broadcast player options - StringBuilder sb = new StringBuilder("PO "); - foreach (PlayerInfo pInfo in Players.Concat(AIPlayers)) - { - if (pInfo.IsAI) - sb.Append(pInfo.AILevel); - else - sb.Append(pInfo.Name); - sb.Append(";"); - - // Combine the options into one integer to save bandwidth in - // cases where the player uses default options (this is common for AI players) - // Will hopefully make GameSurge kicking people a bit less common - byte[] byteArray = new byte[] - { - (byte)pInfo.TeamId, - (byte)pInfo.StartingLocation, - (byte)pInfo.ColorId, - (byte)pInfo.SideId, - }; - - int value = BitConverter.ToInt32(byteArray, 0); - sb.Append(value); - sb.Append(";"); - if (!pInfo.IsAI) - { - if (pInfo.AutoReady && !pInfo.IsInGame) - sb.Append(2); - else - sb.Append(Convert.ToInt32(pInfo.Ready)); - sb.Append(';'); - } - } - - channel.SendCTCPMessage(sb.ToString(), QueuedMessageType.GAME_PLAYERS_MESSAGE, 11); + channel.SendCTCPMessage(BuildPlayerOptionsCTCPString(), QueuedMessageType.GAME_PLAYERS_MESSAGE, 11); } protected override void PlayerExtraOptions_OptionsChanged(object sender, EventArgs e) @@ -858,9 +824,9 @@ protected override void BroadcastPlayerExtraOptions() } /// - /// Handles player option messages received from the game host. + /// Handles player option messages received from the game host as CTCP. /// - private void ApplyPlayerOptions(string sender, string message) + private void ApplyPlayerOptionsFromCTCP(string sender, string message) { if (sender != hostName) return; @@ -959,15 +925,49 @@ private void ApplyPlayerOptions(string sender, string message) } /// - /// Broadcasts game options to non-host players - /// when the host has changed an option. + /// Broadcasts game options to non-host players when the host has changed an option. + /// @TODO: This should be using the topic instead of sending a message? /// protected override void OnGameOptionChanged() { base.OnGameOptionChanged(); + + if (!IsHost) + return; + + bool[] optionValues = new bool[CheckBoxes.Count]; + for (int i = 0; i < CheckBoxes.Count; i++) + optionValues[i] = CheckBoxes[i].Checked; + + // Let's pack the booleans into bytes + List byteList = Conversions.BoolArrayIntoBytes(optionValues).ToList(); + + while (byteList.Count % 4 != 0) + byteList.Add(0); + + int integerCount = byteList.Count / 4; + byte[] byteArray = byteList.ToArray(); + + ExtendedStringBuilder sb = new ExtendedStringBuilder("GO ", true, ';'); + + for (int i = 0; i < integerCount; i++) + sb.Append(BitConverter.ToInt32(byteArray, i * 4)); + + // We don't gain much in most cases by packing the drop-down values + // (because they're bytes to begin with, and usually non-zero), + // so let's just transfer them as usual + + foreach (GameLobbyDropDown dd in DropDowns) + sb.Append(dd.SelectedIndex); + + channel.SendCTCPMessage(sb.ToString(), QueuedMessageType.GAME_SETTINGS_MESSAGE, 11); } - private void ApplyGameDetails(string message) + /// + /// Handles game details messages from the channel topic + /// + /// + private void ApplyGameDetailsFromTopic(string message) { string[] splitMessage = message.Split(new char[] { ';' }); @@ -1077,9 +1077,9 @@ private void ApplyGameDetails(string message) /// - /// Handles game option messages received from the game host. + /// Handles game option messages received from the channel topic. /// - private void ApplyGameOptions(string message) + private void ApplyGameOptionsFromTopic(string message) { string[] parts = message.Split(';'); @@ -1178,6 +1178,7 @@ private void ApplyGameOptions(string message) } } + #region Map Sharing private void RequestMap(string mapSHA1) { if (UserINISettings.Instance.EnableMapSharing) @@ -1215,6 +1216,7 @@ protected override void ChangeMap(GameModeMap gameModeMap) mapSharingConfirmationPanel.Disable(); base.ChangeMap(gameModeMap); } + #endregion /// /// Signals other players that the local player has returned from the game, @@ -1549,12 +1551,17 @@ protected override void BanPlayer(int playerIndex) channel.SendKickMessage(user.Name, 8); } } - + protected override bool UpdateLaunchGameButtonStatus() + { + btnLaunchGame.Enabled = base.UpdateLaunchGameButtonStatus() && !tunnelErrorMode; + return btnLaunchGame.Enabled; + } private void HandleCheatDetectedMessage(string sender) => AddNotice(string.Format("{0} has modified game files during the client session. They are likely attempting to cheat!".L10N("Client:Main:PlayerModifyFileCheat"), sender), Color.Red); + #region Tunnel Handling private void HandleTunnelServerChangeMessage(string sender, string tunnelAddressAndPort) { if (sender != hostName) @@ -1591,12 +1598,7 @@ private void HandleTunnelServerChange(CnCNetTunnel tunnel) AddNotice(string.Format("The game host has changed the tunnel server to: {0}".L10N("Client:Main:HostChangeTunnel"), tunnel.Name)); UpdatePing(); } - - protected override bool UpdateLaunchGameButtonStatus() - { - btnLaunchGame.Enabled = base.UpdateLaunchGameButtonStatus() && !tunnelErrorMode; - return btnLaunchGame.Enabled; - } + #endregion #region CnCNet map sharing @@ -1885,21 +1887,16 @@ private void ParseGameTopic(string topic) string[] topicParts = topic.Split('|'); string gameDetails = topicParts[0]; string gameOptions = topicParts.Length > 1 ? topicParts[1] : null; - string playerOptions = topicParts.Length > 2 ? topicParts[2] : null; - string extraPlayerOptions = topicParts.Length > 3 ? topicParts[3] : null; - - ApplyGameDetails(gameDetails.Substring(3)); // Remove the "GD " prefix - ApplyGameOptions(gameOptions.Substring(3)); // Remove the "GO " prefix - - // Player options is just too big to include in topic - // ApplyPlayerOptions(playerOptions.Substring(3)); // Remove the "PO " prefix + string extraPlayerOptions = topicParts.Length > 2 ? topicParts[2] : null; + ApplyGameDetailsFromTopic(gameDetails.Substring(3)); // Remove the "GD " prefix + ApplyGameOptionsFromTopic(gameOptions.Substring(3)); // Remove the "GO " prefix ApplyPlayerExtraOptions(extraPlayerOptions.Substring(4)); // Remove the "PEO " prefix CopyPlayerDataToUI(); } - private string BuildGameDetailsBroadcastString() + private string BuildGameDetailsTopicString() { // 0. Protocol version // 1. Game Version @@ -1937,7 +1934,7 @@ private string BuildGameDetailsBroadcastString() sb.Append("0"); // LoadedGameId sb.Append(Convert.ToInt32(Map?.Official ?? false)); - sb.Append(Map.UntranslatedName ?? string.Empty); + sb.Append(Map?.UntranslatedName ?? string.Empty); sb.Append(Map?.SHA1 ?? string.Empty); sb.Append(GameMode?.Name ?? string.Empty); sb.Append(tunnelHandler?.CurrentTunnel == null ? string.Empty : tunnelHandler.CurrentTunnel.Address + ":" + tunnelHandler.CurrentTunnel.Port); @@ -1948,7 +1945,7 @@ private string BuildGameDetailsBroadcastString() sb.Append(Convert.ToInt32(RemoveStartingLocations)); string gameDetails = sb.ToString(); - StringBuilder playersSb = new StringBuilder(""); + StringBuilder playersSb = new StringBuilder(";"); foreach (PlayerInfo pInfo in Players) { playersSb.Append(pInfo.Name); @@ -1964,7 +1961,7 @@ private string BuildGameDetailsBroadcastString() return gameDetails; } - private string BuildGameOptionsBroadcastString() + private string BuildGameOptionsTopicString() { ExtendedStringBuilder sb = new ExtendedStringBuilder("|GO ", true, ';'); @@ -1993,16 +1990,16 @@ private string BuildGameOptionsBroadcastString() return sb.ToString(); } - private string BuildAdditionalPlayerOptionsBroadcastString() + private string BuildExtraPlayerOptionsString() { // "|PEO " is the separator for the player extra options var playerExtraOptions = GetPlayerExtraOptions(); return playerExtraOptions.ToCncnetMessage(); } - private string BuildPlayerOptionsBroadcastString() + private string BuildPlayerOptionsCTCPString() { - StringBuilder sb = new StringBuilder("|PO "); + StringBuilder sb = new StringBuilder("PO "); foreach (PlayerInfo pInfo in Players.Concat(AIPlayers)) { if (pInfo.IsAI) @@ -2039,19 +2036,21 @@ private string BuildPlayerOptionsBroadcastString() /// - /// Only update the topic when something in the lobby has changed, but also only relevent to the CnCNetLobby. + /// Only update the topic when something in the lobby has changed + /// Updates Game details for the CnCNet lobby & Game Lobby /// protected override void OnHostShouldUpdateTopic() { if (channel != null && IsHost) { - string gameDetails = BuildGameDetailsBroadcastString(); - string gameOptions = BuildGameOptionsBroadcastString(); - string playerOptions = BuildPlayerOptionsBroadcastString(); - string extraPlayerOptions = BuildAdditionalPlayerOptionsBroadcastString(); + // Player options are not included in the topic as it would exceed 300 chars + // Instead player options are sent and received via CTCP - string newGameTopic = gameDetails += gameOptions += playerOptions += extraPlayerOptions; + string gameDetails = BuildGameDetailsTopicString(); + string gameOptions = BuildGameOptionsTopicString(); + string extraPlayerOptions = BuildExtraPlayerOptionsString(); + string newGameTopic = $"{gameDetails}{gameOptions}{extraPlayerOptions}"; if (cachedGameTopic != newGameTopic) { connectionManager.SetChannelTopic(channel, newGameTopic); diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs index 39292cc01..4d73dd360 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs @@ -968,7 +968,7 @@ protected override void CopyPlayerDataFromUI(object sender, EventArgs e) if (IsHost) { base.CopyPlayerDataFromUI(sender, e); - OnHostShouldUpdateTopic(); + BroadcastPlayerOptions(); return; } From 8ce1a681ec0653291f06b6bba9e7ac88afb04363 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 15 Oct 2024 14:24:06 +0100 Subject: [PATCH 24/38] Make sure we show the players in the room upon joining and not wait until ctcp arrives --- .../CnCNet/CnCNetGameLoadingLobby.cs | 3 +- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 10 +++-- .../CnCNet/GameCreationEventArgs.cs | 5 ++- .../Multiplayer/CnCNet/GameCreationWindow.cs | 5 ++- .../DXGUI/Multiplayer/GameInformationPanel.cs | 6 +-- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 44 +++++++++++++++---- .../Multiplayer/CnCNet/HostedCnCNetGame.cs | 3 +- .../Domain/Multiplayer/GenericHostedGame.cs | 3 +- .../Domain/Multiplayer/LAN/HostedLANGame.cs | 6 ++- 9 files changed, 60 insertions(+), 25 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs index f80a4dd18..f134bc4d1 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs @@ -153,8 +153,7 @@ public override void Initialize() /// /// Sets up events and information before joining the channel. /// - public void SetUp(bool isHost, CnCNetTunnel tunnel, Channel channel, - string hostName) + public void SetUp(bool isHost, CnCNetTunnel tunnel, Channel channel, string hostName) { this.channel = channel; this.hostName = hostName; diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 0e1d50c0f..bc341a92f 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -734,8 +734,10 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) // Now do stuff // Pluck out playernames from players - string[] playersList = messagePlayers.Split(','); - string hostName = playersList[0]; // Host is the first in the list + List playersList = messagePlayers.Split(',').ToList(); + string hostName = string.Empty; + if (playersList.Count>0) + hostName = playersList[0]; // Host is the first in the list string tunnelAddress = tunnelAddressAndPort[0]; int tunnelPort = int.Parse(tunnelAddressAndPort[1]); @@ -1137,7 +1139,7 @@ private void _JoinGame(HostedCnCNetGame hg, string password) } else { - gameLobby.SetUp(gameChannel, false, hg.MaxPlayers, hg.TunnelServer, hg.HostName, hg.Passworded); + gameLobby.SetUp(gameChannel, false, hg.MaxPlayers, hg.TunnelServer, hg.HostName, hg.Passworded, hg.Players); gameChannel.UserAdded += GameChannel_UserAdded; gameChannel.InvalidPasswordEntered += GameChannel_InvalidPasswordEntered_NewGame; gameChannel.InviteOnlyErrorOnJoin += GameChannel_InviteOnlyErrorOnJoin; @@ -1249,7 +1251,7 @@ private void Gcw_GameCreated(object sender, GameCreationEventArgs e) Channel gameChannel = connectionManager.CreateChannel(e.GameRoomName, channelName, false, true, password); connectionManager.AddChannel(gameChannel); - gameLobby.SetUp(gameChannel, true, e.MaxPlayers, e.Tunnel, ProgramConstants.PLAYERNAME, isCustomPassword); + gameLobby.SetUp(gameChannel, true, e.MaxPlayers, e.Tunnel, ProgramConstants.PLAYERNAME, isCustomPassword, e.Players); gameChannel.UserAdded += GameChannel_UserAdded; //gameChannel.MessageAdded += GameChannel_MessageAdded; connectionManager.SendCustomMessage(new QueuedMessage("JOIN " + channelName + " " + password, diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationEventArgs.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationEventArgs.cs index c64bd7710..a6db1560a 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationEventArgs.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationEventArgs.cs @@ -1,21 +1,24 @@ using DTAClient.Domain.Multiplayer.CnCNet; using System; +using System.Collections.Generic; namespace DTAClient.DXGUI.Multiplayer.CnCNet { class GameCreationEventArgs : EventArgs { public GameCreationEventArgs(string roomName, int maxPlayers, - string password, CnCNetTunnel tunnel) + string password, CnCNetTunnel tunnel, List players) { GameRoomName = roomName; MaxPlayers = maxPlayers; Password = password; Tunnel = tunnel; + Players = players; } public string GameRoomName { get; private set; } public int MaxPlayers { get; private set; } + public List Players { get; private set; } public string Password { get; private set; } public CnCNetTunnel Tunnel { get; private set; } } diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationWindow.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationWindow.cs index 2a5a95917..282ff909e 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationWindow.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationWindow.cs @@ -43,6 +43,7 @@ public GameCreationWindow(WindowManager windowManager, TunnelHandler tunnelHandl private XNAClientButton btnDisplayAdvancedOptions; private TunnelHandler tunnelHandler; + private string[] players; public override void Initialize() { @@ -203,7 +204,7 @@ private void BtnLoadMPGame_LeftClick(object sender, EventArgs e) GameCreationEventArgs ea = new GameCreationEventArgs(gameName, spawnSGIni.GetIntValue("Settings", "PlayerCount", 2), password, - tunnelHandler.Tunnels[lbTunnelList.SelectedIndex]); + tunnelHandler.Tunnels[lbTunnelList.SelectedIndex], []); LoadedGameCreated?.Invoke(this, ea); } @@ -231,7 +232,7 @@ private void BtnCreateGame_LeftClick(object sender, EventArgs e) GameCreated?.Invoke(this, new GameCreationEventArgs(gameName, int.Parse(ddMaxPlayers.SelectedItem.Text), tbPassword.Text, - tunnelHandler.Tunnels[lbTunnelList.SelectedIndex])); + tunnelHandler.Tunnels[lbTunnelList.SelectedIndex], [])); } private void BtnDisplayAdvancedOptions_LeftClick(object sender, EventArgs e) diff --git a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs index 8a92876c8..476e91691 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs @@ -120,15 +120,15 @@ public void SetInfo(GenericHostedGame game) lblPing.Visible = true; lblPlayers.Visible = true; - lblPlayers.Text = "Players".L10N("Client:Main:GameInfoPlayers") + " (" + game.Players.Length + " / " + game.MaxPlayers + "):"; + lblPlayers.Text = "Players".L10N("Client:Main:GameInfoPlayers") + " (" + game.Players.Count + " / " + game.MaxPlayers + "):"; - for (int i = 0; i < game.Players.Length && i < MAX_PLAYERS; i++) + for (int i = 0; i < game.Players.Count && i < MAX_PLAYERS; i++) { lblPlayerNames[i].Visible = true; lblPlayerNames[i].Text = Renderer.GetSafeString(game.Players[i], lblPlayerNames[i].FontIndex); } - for (int i = game.Players.Length; i < MAX_PLAYERS; i++) + for (int i = game.Players.Count; i < MAX_PLAYERS; i++) { lblPlayerNames[i].Visible = false; } diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index d2cf8d730..34f0584f6 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -19,6 +19,8 @@ using System.Text; using DTAClient.Domain.Multiplayer.CnCNet; using ClientCore.Extensions; +using SharpDX.Direct2D1; +using Microsoft.VisualBasic; namespace DTAClient.DXGUI.Multiplayer.GameLobby { @@ -205,7 +207,8 @@ private void MultiplayerName_RightClick(object sender, MultiplayerNameRightClick public void SetUp(Channel channel, bool isHost, int playerLimit, - CnCNetTunnel tunnel, string hostName, bool isCustomPassword) + CnCNetTunnel tunnel, string hostName, bool isCustomPassword, + List players) { this.channel = channel; channel.MessageAdded += Channel_MessageAdded; @@ -235,6 +238,11 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, btnChangeTunnel.Disable(); } + if (players.Count > 0) + { + LoadInitialPlayerNamesIntoUI(players); + } + tunnelHandler.CurrentTunnel = tunnel; tunnelHandler.CurrentTunnelPinged += TunnelHandler_CurrentTunnelPinged; @@ -269,10 +277,10 @@ public void OnJoined() TopBar.AddPrimarySwitchable(this); TopBar.SwitchToPrimary(); WindowManager.SelectedControl = tbChatInput; + ResetAutoReadyCheckbox(); UpdatePing(); UpdateDiscordPresence(true); - BroadcastPlayerOptions(); OnHostShouldUpdateTopic(); } @@ -530,7 +538,6 @@ private void Channel_UserAdded(object sender, ChannelUserEventArgs e) // new player, and it also sends an options broadcast message //CopyPlayerDataToUI(); This is also called by ChangeMap() ChangeMap(GameModeMap); - BroadcastPlayerOptions(); OnHostShouldUpdateTopic(); UpdateDiscordPresence(); @@ -823,6 +830,23 @@ protected override void BroadcastPlayerExtraOptions() channel.SendCTCPMessage(playerExtraOptions.ToCncnetMessage(), QueuedMessageType.GAME_PLAYERS_EXTRA_MESSAGE, 11, true); } + /// + /// Show the player names in the UI upon joining the game. (So its not not initially blank). + /// + /// + private void LoadInitialPlayerNamesIntoUI(List playerNames) + { + Players.Clear(); + + for (int i = 0; i < playerNames.Count; i++) + { + PlayerInfo pInfo = new() { Name = playerNames[i] }; + Players.Add(pInfo); + } + + CopyPlayerDataToUI(); + } + /// /// Handles player option messages received from the game host as CTCP. /// @@ -988,11 +1012,12 @@ private void ApplyGameDetailsFromTopic(string message) // 12. Map SHA1 // 13. Game Mode Name // 14. Tunnel address: Port - // 15. FrameSendRate @TODO: We can remove? - // 16. MaxAhead @TODO: We can remove? - // 17. ProtocolVersion @TODO: We can remove? + // 15. FrameSendRate + // 16. MaxAhead + // 17. ProtocolVersion // 18. RandomSeed // 19. RemoveStartingLocations + // 20. Players string mapOfficial = splitMessage[10]; string mapName = splitMessage[11]; @@ -1003,6 +1028,7 @@ private void ApplyGameDetailsFromTopic(string message) string messageGameProtocolVersion = splitMessage[17]; string messageRandomSeed = splitMessage[18]; string messageRemoveStartingLocations = splitMessage[19]; + string messagePlayers = splitMessage[20]; // Do stuff with it. @@ -1913,9 +1939,9 @@ private string BuildGameDetailsTopicString() // 12. Map SHA1 // 13. Game Mode Name // 14. Tunnel address: Port - // 15. FrameSendRate @TODO: We can remove? - // 16. MaxAhead @TODO: We can remove? - // 17. ProtocolVersion @TODO: We can remove? + // 15. FrameSendRate + // 16. MaxAhead + // 17. ProtocolVersion // 18. RandomSeed // 19. RemoveStartingLocations // 20. Players diff --git a/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs b/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs index eb8ab02a4..9f6d5a357 100644 --- a/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs +++ b/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace DTAClient.Domain.Multiplayer.CnCNet { @@ -7,7 +8,7 @@ public class HostedCnCNetGame : GenericHostedGame public HostedCnCNetGame() { } public HostedCnCNetGame(string channelName, string revision, string gameVersion, int maxPlayers, - string roomName, bool passworded, bool tunneled, string[] players, + string roomName, bool passworded, bool tunneled, List players, string hostName, string mapName, string gameMode) { ChannelName = channelName; diff --git a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs index 0c863ed78..fc0aa8a85 100644 --- a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs +++ b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs @@ -1,5 +1,6 @@ using ClientCore.CnCNet5; using System; +using System.Collections.Generic; namespace DTAClient.Domain.Multiplayer { @@ -19,7 +20,7 @@ public abstract class GenericHostedGame: IEquatable public string Map { get; set; } public string GameVersion { get; set; } public string HostName { get; set; } - public string[] Players { get; set; } + public ListPlayers { get; set; } public int MaxPlayers { get; set; } = 8; public abstract int Ping { get; } diff --git a/DXMainClient/Domain/Multiplayer/LAN/HostedLANGame.cs b/DXMainClient/Domain/Multiplayer/LAN/HostedLANGame.cs index 47bac03d9..5483fbf3b 100644 --- a/DXMainClient/Domain/Multiplayer/LAN/HostedLANGame.cs +++ b/DXMainClient/Domain/Multiplayer/LAN/HostedLANGame.cs @@ -3,6 +3,8 @@ using DTAClient.Domain.Multiplayer; using Rampastring.Tools; using System; +using System.Collections.Generic; +using System.Linq; using System.Net; namespace DTAClient.Domain.LAN @@ -41,9 +43,9 @@ public bool SetDataFromStringArray(GameCollection gc, string[] parameters) Map = parameters[3]; GameMode = parameters[4]; LoadedGameID = parameters[5]; - string[] players = parameters[6].Split(','); + List players = parameters[6].Split(',').ToList(); Players = players; - if (players.Length == 0) + if (players.Count == 0) return false; HostName = players[0]; Locked = Conversions.IntFromString(parameters[7], 1) > 0; From 3981ea1c5de5fd33a82daf0e91f410469503d616 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 15 Oct 2024 14:55:13 +0100 Subject: [PATCH 25/38] Remove mapname from broadcasting topic --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 98 +++++-------------- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 58 +++++------ 2 files changed, 49 insertions(+), 107 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index bc341a92f..133ac3a65 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -62,6 +62,7 @@ public CnCNetLobby(WindowManager windowManager, CnCNetManager connectionManager, } private MapLoader mapLoader; + private GameModeMapCollection GameModeMaps => mapLoader.GameModeMaps; private CnCNetManager connectionManager; private CnCNetUserData cncnetUserData; @@ -625,66 +626,13 @@ private void OnParseGameTopic(string topic, string channelName) ); } - ///// - ///// Return playerInfo from game options message - ///// Should be in a helper somewhere. - ///// - ///// - ///// - //private List GetPlayerInfoFromPlayerOptionsMessage(string playerOptionsMessage) - //{ - // List players = new List(); - // string[] playerOptionsArray = playerOptionsMessage.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - - // for (int i = 0; i < playerOptionsArray.Length; i += 3) // Each player has 3 segments: Name/AILevel, Options, ReadyStatus - // { - // PlayerInfo playerInfo = new PlayerInfo(); - - // // Parse AI or player name - // string playerOrAI = playerOptionsArray[i]; - // if (int.TryParse(playerOrAI, out int aiLevel)) - // { - // // This is an AI player - // playerInfo.IsAI = true; - // playerInfo.AILevel = aiLevel; - // } - // else - // { - // // This is a real player - // playerInfo.IsAI = false; - // playerInfo.Name = playerOrAI; - // } - - // // Parse the packed integer options - // int packedOptions = int.Parse(playerOptionsArray[i + 1]); - // byte[] byteArray = BitConverter.GetBytes(packedOptions); - - // playerInfo.TeamId = byteArray[0]; - // playerInfo.StartingLocation = byteArray[1]; - // playerInfo.ColorId = byteArray[2]; - // playerInfo.SideId = byteArray[3]; - - // // Parse the ready status - // if (!playerInfo.IsAI) - // { - // playerInfo.Ready = playerOptionsArray[i + 2] == "1"; - // playerInfo.AutoReady = playerOptionsArray[i + 2] == "2"; - // } - - // players.Add(playerInfo); - // } - - // return players; - //} - private void ApplyGameDetails(string gameDetailsMessage, string channelName) { try { - //List players = GetPlayerInfoFromPlayerOptionsMessage(playerOptionsMessage); - string[] splitGameDettailsMessage = gameDetailsMessage.Split(new char[] { ';' }); + // 0. Protocol version // 1. Game Version // 2. Player Limit @@ -696,16 +644,15 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) // 8. IsLadder // 9. LoadedGameId // 10. Map Is Official - // 11. Map Untranslated Name - // 12. Map SHA1 - // 13. Game Mode Name - // 14. Tunnel address: Port - // 15. FrameSendRate @TODO: We can remove? - // 16. MaxAhead @TODO: We can remove? - // 17. ProtocolVersion @TODO: We can remove? - // 18. RandomSeed - // 19. RemoveStartingLocations - // 20. Players + // 11. Map SHA1 + // 12. Game Mode Name + // 13. Tunnel address: Port + // 14. FrameSendRate + // 15. MaxAhead + // 16. ProtocolVersion + // 17. RandomSeed + // 18. RemoveStartingLocations + // 19. Players string revision = splitGameDettailsMessage[0]; if (revision != ProgramConstants.CNCNET_PROTOCOL_REVISION) @@ -721,22 +668,19 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) bool isLadderGame = Conversions.BooleanFromString(splitGameDettailsMessage[8], true); string loadedGameId = splitGameDettailsMessage[9]; string mapOfficial = splitGameDettailsMessage[10]; - string mapName = splitGameDettailsMessage[11]; - string mapSHA1 = splitGameDettailsMessage[12]; - string gameMode = splitGameDettailsMessage[13]; - string[] tunnelAddressAndPort = splitGameDettailsMessage[14].Split(':'); - string messageFrameSendRate = splitGameDettailsMessage[15]; - string messageMaxAhead = splitGameDettailsMessage[16]; - string messageGameProtocolVersion = splitGameDettailsMessage[17]; - string messagePlayers = splitGameDettailsMessage[20]; + string mapSHA1 = splitGameDettailsMessage[11]; + string gameMode = splitGameDettailsMessage[12]; + string[] tunnelAddressAndPort = splitGameDettailsMessage[13].Split(':'); + string messageFrameSendRate = splitGameDettailsMessage[14]; + string messageMaxAhead = splitGameDettailsMessage[15]; + string messageGameProtocolVersion = splitGameDettailsMessage[16]; + string messagePlayers = splitGameDettailsMessage[19]; - // Now do stuff // Pluck out playernames from players - List playersList = messagePlayers.Split(',').ToList(); string hostName = string.Empty; - if (playersList.Count>0) + if (playersList.Count > 0) hostName = playersList[0]; // Host is the first in the list string tunnelAddress = tunnelAddressAndPort[0]; int tunnelPort = int.Parse(tunnelAddressAndPort[1]); @@ -750,6 +694,8 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) return; } + GameModeMap gameModeMap = GameModeMaps.Find(gmm => gmm.Map.SHA1 == mapSHA1); + HostedCnCNetGame game = new HostedCnCNetGame( channelName, revision, @@ -760,7 +706,7 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) true, playersList, hostName, - mapName, + gameModeMap?.Map.Name ?? string.Empty, gameMode ); diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 34f0584f6..cf886c2ca 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -1008,27 +1008,25 @@ private void ApplyGameDetailsFromTopic(string message) // 8. IsLadder // 9. LoadedGameId // 10. Map Is Official - // 11. Map Untranslated Name - // 12. Map SHA1 - // 13. Game Mode Name - // 14. Tunnel address: Port - // 15. FrameSendRate - // 16. MaxAhead - // 17. ProtocolVersion - // 18. RandomSeed - // 19. RemoveStartingLocations - // 20. Players + // 11. Map SHA1 + // 12. Game Mode Name + // 13. Tunnel address: Port + // 14. FrameSendRate + // 15. MaxAhead + // 16. ProtocolVersion + // 17. RandomSeed + // 18. RemoveStartingLocations + // 19. Players string mapOfficial = splitMessage[10]; - string mapName = splitMessage[11]; - string mapSHA1 = splitMessage[12]; - string gameMode = splitMessage[13]; - string messageFrameSendRate = splitMessage[15]; - string messageMaxAhead = splitMessage[16]; - string messageGameProtocolVersion = splitMessage[17]; - string messageRandomSeed = splitMessage[18]; - string messageRemoveStartingLocations = splitMessage[19]; - string messagePlayers = splitMessage[20]; + string mapSHA1 = splitMessage[11]; + string gameMode = splitMessage[12]; + string messageFrameSendRate = splitMessage[14]; + string messageMaxAhead = splitMessage[15]; + string messageGameProtocolVersion = splitMessage[16]; + string messageRandomSeed = splitMessage[17]; + string messageRemoveStartingLocations = splitMessage[18]; + string messagePlayers = splitMessage[19]; // Do stuff with it. @@ -1070,7 +1068,7 @@ private void ApplyGameDetailsFromTopic(string message) ChangeMap(GameModeMap); } - lastMapName = mapName; + lastMapName = GameModeMap.Map?.Name ?? string.Empty; lastGameMode = gameMode; lastMapSHA1 = mapSHA1; @@ -1935,16 +1933,15 @@ private string BuildGameDetailsTopicString() // 8. IsLadder // 9. LoadedGameId // 10. Map Is Official - // 11. Map Untranslated Name - // 12. Map SHA1 - // 13. Game Mode Name - // 14. Tunnel address: Port - // 15. FrameSendRate - // 16. MaxAhead - // 17. ProtocolVersion - // 18. RandomSeed - // 19. RemoveStartingLocations - // 20. Players + // 11. Map SHA1 + // 12. Game Mode Name + // 13. Tunnel address: Port + // 14. FrameSendRate + // 15. MaxAhead + // 16. ProtocolVersion + // 17. RandomSeed + // 18. RemoveStartingLocations + // 19. Players ExtendedStringBuilder sb = new ExtendedStringBuilder("GD ", true, ';'); @@ -1960,7 +1957,6 @@ private string BuildGameDetailsTopicString() sb.Append("0"); // LoadedGameId sb.Append(Convert.ToInt32(Map?.Official ?? false)); - sb.Append(Map?.UntranslatedName ?? string.Empty); sb.Append(Map?.SHA1 ?? string.Empty); sb.Append(GameMode?.Name ?? string.Empty); sb.Append(tunnelHandler?.CurrentTunnel == null ? string.Empty : tunnelHandler.CurrentTunnel.Address + ":" + tunnelHandler.CurrentTunnel.Port); From 0e9acfa80f13ec1c35945508ecc205afe7fa2cff Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Tue, 15 Oct 2024 23:59:06 +0100 Subject: [PATCH 26/38] Wip updates to ui processing --- CnCNetGame.sln | 1393 +++++++++++++++++ .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 6 +- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 183 +-- .../Multiplayer/GameLobby/GameLobbyBase.cs | 2 +- .../Multiplayer/GameLobby/LANGameLobby.cs | 2 +- .../GameLobby/MultiplayerGameLobby.cs | 7 +- DXMainClient/Online/Channel.cs | 5 +- DXMainClient/Online/CnCNetManager.cs | 4 - DXMainClient/Online/Connection.cs | 11 +- 9 files changed, 1492 insertions(+), 121 deletions(-) create mode 100644 CnCNetGame.sln diff --git a/CnCNetGame.sln b/CnCNetGame.sln new file mode 100644 index 000000000..348c78541 --- /dev/null +++ b/CnCNetGame.sln @@ -0,0 +1,1393 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32408.312 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DXMainClient", "DXMainClient\DXMainClient.csproj", "{97458C1E-2E6C-4C5C-93C7-16A6712802E9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientCore", "ClientCore\ClientCore.csproj", "{DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientGUI", "ClientGUI\ClientGUI.csproj", "{4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DTAConfig", "DTAConfig\DTAConfig.csproj", "{D517317D-8EA8-4225-AF9E-5385D8A7F047}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0F60E4A3-55C8-4C3F-BFC0-27C597433E8A}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitattributes = .gitattributes + .gitignore = .gitignore + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets + Directory.Packages.props = Directory.Packages.props + GitVersion.yml = GitVersion.yml + global.json = global.json + NuGet.config = NuGet.config + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TranslationNotifierGenerator", "TranslationNotifierGenerator\TranslationNotifierGenerator.csproj", "{E0412313-0A6F-400B-9EC8-B162DA8AAA0E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SecondStageUpdater", "SecondStageUpdater\SecondStageUpdater.csproj", "{039DE2BC-4691-4EDA-84D1-59A1D98AC836}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientUpdater", "ClientUpdater\ClientUpdater.csproj", "{551D080B-5624-4793-AC31-69D77C62F6B1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + AresUniversalGLDebug|Any CPU = AresUniversalGLDebug|Any CPU + AresUniversalGLDebug|ARM64 = AresUniversalGLDebug|ARM64 + AresUniversalGLDebug|x64 = AresUniversalGLDebug|x64 + AresUniversalGLDebug|x86 = AresUniversalGLDebug|x86 + AresUniversalGLRelease|Any CPU = AresUniversalGLRelease|Any CPU + AresUniversalGLRelease|ARM64 = AresUniversalGLRelease|ARM64 + AresUniversalGLRelease|x64 = AresUniversalGLRelease|x64 + AresUniversalGLRelease|x86 = AresUniversalGLRelease|x86 + AresWindowsDXDebug|Any CPU = AresWindowsDXDebug|Any CPU + AresWindowsDXDebug|ARM64 = AresWindowsDXDebug|ARM64 + AresWindowsDXDebug|x64 = AresWindowsDXDebug|x64 + AresWindowsDXDebug|x86 = AresWindowsDXDebug|x86 + AresWindowsDXRelease|Any CPU = AresWindowsDXRelease|Any CPU + AresWindowsDXRelease|ARM64 = AresWindowsDXRelease|ARM64 + AresWindowsDXRelease|x64 = AresWindowsDXRelease|x64 + AresWindowsDXRelease|x86 = AresWindowsDXRelease|x86 + AresWindowsGLDebug|Any CPU = AresWindowsGLDebug|Any CPU + AresWindowsGLDebug|ARM64 = AresWindowsGLDebug|ARM64 + AresWindowsGLDebug|x64 = AresWindowsGLDebug|x64 + AresWindowsGLDebug|x86 = AresWindowsGLDebug|x86 + AresWindowsGLRelease|Any CPU = AresWindowsGLRelease|Any CPU + AresWindowsGLRelease|ARM64 = AresWindowsGLRelease|ARM64 + AresWindowsGLRelease|x64 = AresWindowsGLRelease|x64 + AresWindowsGLRelease|x86 = AresWindowsGLRelease|x86 + AresWindowsXNADebug|Any CPU = AresWindowsXNADebug|Any CPU + AresWindowsXNADebug|ARM64 = AresWindowsXNADebug|ARM64 + AresWindowsXNADebug|x64 = AresWindowsXNADebug|x64 + AresWindowsXNADebug|x86 = AresWindowsXNADebug|x86 + AresWindowsXNARelease|Any CPU = AresWindowsXNARelease|Any CPU + AresWindowsXNARelease|ARM64 = AresWindowsXNARelease|ARM64 + AresWindowsXNARelease|x64 = AresWindowsXNARelease|x64 + AresWindowsXNARelease|x86 = AresWindowsXNARelease|x86 + TSUniversalGLDebug|Any CPU = TSUniversalGLDebug|Any CPU + TSUniversalGLDebug|ARM64 = TSUniversalGLDebug|ARM64 + TSUniversalGLDebug|x64 = TSUniversalGLDebug|x64 + TSUniversalGLDebug|x86 = TSUniversalGLDebug|x86 + TSUniversalGLRelease|Any CPU = TSUniversalGLRelease|Any CPU + TSUniversalGLRelease|ARM64 = TSUniversalGLRelease|ARM64 + TSUniversalGLRelease|x64 = TSUniversalGLRelease|x64 + TSUniversalGLRelease|x86 = TSUniversalGLRelease|x86 + TSWindowsDXDebug|Any CPU = TSWindowsDXDebug|Any CPU + TSWindowsDXDebug|ARM64 = TSWindowsDXDebug|ARM64 + TSWindowsDXDebug|x64 = TSWindowsDXDebug|x64 + TSWindowsDXDebug|x86 = TSWindowsDXDebug|x86 + TSWindowsDXRelease|Any CPU = TSWindowsDXRelease|Any CPU + TSWindowsDXRelease|ARM64 = TSWindowsDXRelease|ARM64 + TSWindowsDXRelease|x64 = TSWindowsDXRelease|x64 + TSWindowsDXRelease|x86 = TSWindowsDXRelease|x86 + TSWindowsGLDebug|Any CPU = TSWindowsGLDebug|Any CPU + TSWindowsGLDebug|ARM64 = TSWindowsGLDebug|ARM64 + TSWindowsGLDebug|x64 = TSWindowsGLDebug|x64 + TSWindowsGLDebug|x86 = TSWindowsGLDebug|x86 + TSWindowsGLRelease|Any CPU = TSWindowsGLRelease|Any CPU + TSWindowsGLRelease|ARM64 = TSWindowsGLRelease|ARM64 + TSWindowsGLRelease|x64 = TSWindowsGLRelease|x64 + TSWindowsGLRelease|x86 = TSWindowsGLRelease|x86 + TSWindowsXNADebug|Any CPU = TSWindowsXNADebug|Any CPU + TSWindowsXNADebug|ARM64 = TSWindowsXNADebug|ARM64 + TSWindowsXNADebug|x64 = TSWindowsXNADebug|x64 + TSWindowsXNADebug|x86 = TSWindowsXNADebug|x86 + TSWindowsXNARelease|Any CPU = TSWindowsXNARelease|Any CPU + TSWindowsXNARelease|ARM64 = TSWindowsXNARelease|ARM64 + TSWindowsXNARelease|x64 = TSWindowsXNARelease|x64 + TSWindowsXNARelease|x86 = TSWindowsXNARelease|x86 + YRUniversalGLDebug|Any CPU = YRUniversalGLDebug|Any CPU + YRUniversalGLDebug|ARM64 = YRUniversalGLDebug|ARM64 + YRUniversalGLDebug|x64 = YRUniversalGLDebug|x64 + YRUniversalGLDebug|x86 = YRUniversalGLDebug|x86 + YRUniversalGLRelease|Any CPU = YRUniversalGLRelease|Any CPU + YRUniversalGLRelease|ARM64 = YRUniversalGLRelease|ARM64 + YRUniversalGLRelease|x64 = YRUniversalGLRelease|x64 + YRUniversalGLRelease|x86 = YRUniversalGLRelease|x86 + YRWindowsDXDebug|Any CPU = YRWindowsDXDebug|Any CPU + YRWindowsDXDebug|ARM64 = YRWindowsDXDebug|ARM64 + YRWindowsDXDebug|x64 = YRWindowsDXDebug|x64 + YRWindowsDXDebug|x86 = YRWindowsDXDebug|x86 + YRWindowsDXRelease|Any CPU = YRWindowsDXRelease|Any CPU + YRWindowsDXRelease|ARM64 = YRWindowsDXRelease|ARM64 + YRWindowsDXRelease|x64 = YRWindowsDXRelease|x64 + YRWindowsDXRelease|x86 = YRWindowsDXRelease|x86 + YRWindowsGLDebug|Any CPU = YRWindowsGLDebug|Any CPU + YRWindowsGLDebug|ARM64 = YRWindowsGLDebug|ARM64 + YRWindowsGLDebug|x64 = YRWindowsGLDebug|x64 + YRWindowsGLDebug|x86 = YRWindowsGLDebug|x86 + YRWindowsGLRelease|Any CPU = YRWindowsGLRelease|Any CPU + YRWindowsGLRelease|ARM64 = YRWindowsGLRelease|ARM64 + YRWindowsGLRelease|x64 = YRWindowsGLRelease|x64 + YRWindowsGLRelease|x86 = YRWindowsGLRelease|x86 + YRWindowsXNADebug|Any CPU = YRWindowsXNADebug|Any CPU + YRWindowsXNADebug|ARM64 = YRWindowsXNADebug|ARM64 + YRWindowsXNADebug|x64 = YRWindowsXNADebug|x64 + YRWindowsXNADebug|x86 = YRWindowsXNADebug|x86 + YRWindowsXNARelease|Any CPU = YRWindowsXNARelease|Any CPU + YRWindowsXNARelease|ARM64 = YRWindowsXNARelease|ARM64 + YRWindowsXNARelease|x64 = YRWindowsXNARelease|x64 + YRWindowsXNARelease|x86 = YRWindowsXNARelease|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 + {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 + {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 + {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 + {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 + {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|Any CPU.Build.0 = AresWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|ARM64.Build.0 = AresWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|x64.Build.0 = AresWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|Any CPU.Build.0 = AresWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|ARM64.Build.0 = AresWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|x64.Build.0 = AresWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|Any CPU.Build.0 = TSWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|ARM64.Build.0 = TSWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|x64.Build.0 = TSWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|Any CPU.Build.0 = TSWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|ARM64.Build.0 = TSWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|x64.Build.0 = TSWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|Any CPU.Build.0 = YRWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|ARM64.Build.0 = YRWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|x64.Build.0 = YRWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|Any CPU.Build.0 = YRWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|ARM64.Build.0 = YRWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|x64.Build.0 = YRWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|Any CPU + {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|Any CPU.Build.0 = AresWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|ARM64.Build.0 = AresWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|x64.Build.0 = AresWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|Any CPU.Build.0 = AresWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|ARM64.Build.0 = AresWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|x64.Build.0 = AresWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|Any CPU.Build.0 = TSWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|ARM64.Build.0 = TSWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|x64.Build.0 = TSWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|Any CPU.Build.0 = TSWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|ARM64.Build.0 = TSWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|x64.Build.0 = TSWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|Any CPU.Build.0 = YRWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|ARM64.Build.0 = YRWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|x64.Build.0 = YRWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|Any CPU.Build.0 = YRWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|ARM64.Build.0 = YRWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|x64.Build.0 = YRWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|Any CPU + {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {524B40FE-44F2-419A-B6D3-F9F0F813101F} + EndGlobalSection +EndGlobal diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 133ac3a65..cde267ab6 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -764,7 +764,6 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEventArgs e) { - Logger.Log($"GameBroadcastChannel_ChannelListReceived ** {e.ChannelName}, {e.Topic}"); OnParseGameTopic(e.Topic, e.ChannelName); } @@ -987,6 +986,8 @@ private string GetJoinGameError(HostedCnCNetGame hg) if (hg.IsLoadedGame && !hg.Players.Contains(ProgramConstants.PLAYERNAME)) return "You do not exist in the saved game!".L10N("Client:Main:NotInSavedGame"); + Logger.Log($"{hg.ChannelName}"); + return GetJoinGameErrorBase(); } @@ -1093,6 +1094,9 @@ private void _JoinGame(HostedCnCNetGame hg, string password) gameChannel.TargetChangeTooFast += GameChannel_TargetChangeTooFast; } + Logger.Log("Pausing listings in lobby"); + //gameChanneListTimer.Change(Timeout.Infinite, Timeout.Infinite); + connectionManager.SendCustomMessage(new QueuedMessage("JOIN " + hg.ChannelName + " " + password, QueuedMessageType.INSTANT_MESSAGE, 0)); } diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index cf886c2ca..20da0ae41 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -62,8 +62,6 @@ DiscordHandler discordHandler new IntCommandHandler("OR", HandleOptionsRequest), new IntCommandHandler("R", HandleReadyRequest), new StringCommandHandler("PO", ApplyPlayerOptionsFromCTCP), - //new StringCommandHandler(PlayerExtraOptions.CNCNET_MESSAGE_KEY, ApplyPlayerExtraOptions), - //new StringCommandHandler("GO", ApplyGameOptionsFromTopic), new StringCommandHandler("START", NonHostLaunchGame), new NotificationHandler("AISPECS", HandleNotification, AISpectatorsNotification), new NotificationHandler("GETREADY", HandleNotification, GetReadyNotification), @@ -219,7 +217,7 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, channel.UserAdded += Channel_UserAdded; channel.UserNameChanged += Channel_UserNameChanged; channel.UserListReceived += Channel_UserListReceived; - channel.TopicChanged += Channel_TopicChanged; + //channel.TopicChanged += Channel_TopicChanged; this.hostName = hostName; this.playerLimit = playerLimit; @@ -238,28 +236,24 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, btnChangeTunnel.Disable(); } - if (players.Count > 0) - { - LoadInitialPlayerNamesIntoUI(players); - } - tunnelHandler.CurrentTunnel = tunnel; - tunnelHandler.CurrentTunnelPinged += TunnelHandler_CurrentTunnelPinged; + //tunnelHandler.CurrentTunnelPinged += TunnelHandler_CurrentTunnelPinged; connectionManager.ConnectionLost += ConnectionManager_ConnectionLost; connectionManager.Disconnected += ConnectionManager_Disconnected; Refresh(isHost); + LoadInitialPlayerNamesIntoUI(players); } private void TunnelHandler_CurrentTunnelPinged(object sender, EventArgs e) => UpdatePing(); public void OnJoined() { - FileHashCalculator fhc = new FileHashCalculator(); - fhc.CalculateHashes(GameModeMaps.GameModes); + //FileHashCalculator fhc = new FileHashCalculator(); + //fhc.CalculateHashes(GameModeMaps.GameModes); - gameFilesHash = fhc.GetCompleteHash(); + //gameFilesHash = fhc.GetCompleteHash(); if (IsHost) { @@ -270,8 +264,7 @@ public void OnJoined() } else { - channel.SendCTCPMessage("FHSH " + gameFilesHash, QueuedMessageType.SYSTEM_MESSAGE, 10); - Logger.Log("PLAYER TOPIC: " + channel.Topic); + //channel.SendCTCPMessage("FHSH " + gameFilesHash, QueuedMessageType.SYSTEM_MESSAGE, 10); } TopBar.AddPrimarySwitchable(this); @@ -279,25 +272,25 @@ public void OnJoined() WindowManager.SelectedControl = tbChatInput; ResetAutoReadyCheckbox(); - UpdatePing(); - UpdateDiscordPresence(true); - BroadcastPlayerOptions(); - OnHostShouldUpdateTopic(); + //UpdatePing(); + //UpdateDiscordPresence(true); + + channel.TopicChanged += Channel_TopicChanged; } private void UpdatePing() { - if (tunnelHandler.CurrentTunnel == null) - return; + //if (tunnelHandler.CurrentTunnel == null) + // return; - channel.SendCTCPMessage("TNLPNG " + tunnelHandler.CurrentTunnel.PingInMs, QueuedMessageType.SYSTEM_MESSAGE, 10); + //channel.SendCTCPMessage("TNLPNG " + tunnelHandler.CurrentTunnel.PingInMs, QueuedMessageType.SYSTEM_MESSAGE, 10); - PlayerInfo pInfo = Players.Find(p => p.Name.Equals(ProgramConstants.PLAYERNAME)); - if (pInfo != null) - { - pInfo.Ping = tunnelHandler.CurrentTunnel.PingInMs; - UpdatePlayerPingIndicator(pInfo); - } + //PlayerInfo pInfo = Players.Find(p => p.Name.Equals(ProgramConstants.PLAYERNAME)); + //if (pInfo != null) + //{ + // pInfo.Ping = tunnelHandler.CurrentTunnel.PingInMs; + // UpdatePlayerPingIndicator(pInfo); + //} } protected override void CopyPlayerDataToUI() @@ -385,11 +378,14 @@ public override void Clear() TopBar.RemovePrimarySwitchable(this); ResetDiscordPresence(); + + cachedGameTopic = string.Empty; + + Logger.Log("CnCNetGameLobby ** Clear Complete"); } private void Channel_TopicChanged(object sender, MessageEventArgs e) { - Logger.Log("CnCNetGameLobby ** Channel_TopicChanged " + e.Message); ParseGameTopic(e.Message); } @@ -400,8 +396,9 @@ public void LeaveGameLobby() closed = true; } - Clear(); channel.Leave(); + Clear(); + channel = null; } private void ConnectionManager_Disconnected(object sender, EventArgs e) => HandleConnectionLoss(); @@ -431,21 +428,21 @@ private void Channel_UserNameChanged(object sender, UserNameChangedEventArgs e) protected override void UpdateDiscordPresence(bool resetTimer = false) { - if (discordHandler == null) - return; + //if (discordHandler == null) + // return; - PlayerInfo player = FindLocalPlayer(); - if (player == null || Map == null || GameMode == null) - return; - string side = ""; - if (ddPlayerSides.Length > Players.IndexOf(player)) - side = (string)ddPlayerSides[Players.IndexOf(player)].SelectedItem.Tag; - string currentState = ProgramConstants.IsInGame ? "In Game" : "In Lobby"; // not UI strings + //PlayerInfo player = FindLocalPlayer(); + //if (player == null || Map == null || GameMode == null) + // return; + //string side = ""; + //if (ddPlayerSides.Length > Players.IndexOf(player)) + // side = (string)ddPlayerSides[Players.IndexOf(player)].SelectedItem.Tag; + //string currentState = ProgramConstants.IsInGame ? "In Game" : "In Lobby"; // not UI strings - discordHandler.UpdatePresence( - Map.UntranslatedName, GameMode.UntranslatedUIName, "Multiplayer", - currentState, Players.Count, playerLimit, side, - channel.UIName, IsHost, isCustomPassword, Locked, resetTimer); + //discordHandler.UpdatePresence( + // Map.UntranslatedName, GameMode.UntranslatedUIName, "Multiplayer", + // currentState, Players.Count, playerLimit, side, + // channel.UIName, IsHost, isCustomPassword, Locked, resetTimer); } private void Channel_UserQuitIRC(object sender, UserNameEventArgs e) @@ -526,9 +523,16 @@ private void Channel_UserAdded(object sender, ChannelUserEventArgs e) WindowManager.FlashWindow(); #endif + if (IsHost) + { + Logger.Log("Channel_UserAdded ** Called BroadcastPlayerOptions"); + BroadcastPlayerOptions(); + } + if (!IsHost) { - CopyPlayerDataToUI(); + Logger.Log("Removed CopyPlayerDataToUI from Channel_UserAdded"); + //CopyPlayerDataToUI(); return; } @@ -537,13 +541,15 @@ private void Channel_UserAdded(object sender, ChannelUserEventArgs e) // Changing the map applies forced settings (co-op sides etc.) to the // new player, and it also sends an options broadcast message //CopyPlayerDataToUI(); This is also called by ChangeMap() + Logger.Log("Channel_UserAdded ** Called ChangeMap"); ChangeMap(GameModeMap); - BroadcastPlayerOptions(); - OnHostShouldUpdateTopic(); + //BroadcastPlayerOptions(); UpdateDiscordPresence(); + } else { + Logger.Log("Channel_UserAdded ** Called CopyPlayerDataToUI"); Players[0].Ready = true; CopyPlayerDataToUI(); } @@ -565,7 +571,6 @@ private void RemovePlayer(string playerName) CopyPlayerDataToUI(); - OnHostShouldUpdateTopic(); if (IsHost) BroadcastPlayerOptions(); @@ -577,6 +582,10 @@ private void RemovePlayer(string playerName) { UnlockGame(true); } + else + { + UpdateChannelTopic(); + } } private void Channel_ChannelModesChanged(object sender, ChannelModeEventArgs e) @@ -598,8 +607,6 @@ private void Channel_ChannelModesChanged(object sender, ChannelModeEventArgs e) private void Channel_CTCPReceived(object sender, ChannelCTCPEventArgs e) { - Logger.Log("CnCNetGameLobby_CTCPReceived"); - foreach (CommandHandlerBase cmdHandler in ctcpCommandHandlers) { if (cmdHandler.Handle(e.UserName, e.Message)) @@ -686,6 +693,8 @@ protected override void RequestPlayerOptions(int side, int color, int start, int int intValue = BitConverter.ToInt32(value, 0); + Logger.Log($"RequestPlayerOptions ** OR: {intValue}"); + channel.SendCTCPMessage( string.Format("OR {0}", intValue), QueuedMessageType.GAME_SETTINGS_MESSAGE, 6); @@ -781,7 +790,6 @@ private void HandleOptionsRequest(string playerName, int options) pInfo.TeamId = team; CopyPlayerDataToUI(); - //OnHostShouldUpdateTopic(); BroadcastPlayerOptions(); } @@ -802,7 +810,6 @@ private void HandleReadyRequest(string playerName, int readyStatus) pInfo.AutoReady = readyStatus > 1; CopyPlayerDataToUI(); - OnHostShouldUpdateTopic(); BroadcastPlayerOptions(); } @@ -811,6 +818,7 @@ private void HandleReadyRequest(string playerName, int readyStatus) /// protected override void BroadcastPlayerOptions() { + Logger.Log($"BroadcastPlayerOptions ** Broadcasting Player Options"); channel.SendCTCPMessage(BuildPlayerOptionsCTCPString(), QueuedMessageType.GAME_PLAYERS_MESSAGE, 11); } @@ -824,7 +832,7 @@ protected override void PlayerExtraOptions_OptionsChanged(object sender, EventAr protected override void BroadcastPlayerExtraOptions() { if (!IsHost) - return; + return; var playerExtraOptions = GetPlayerExtraOptions(); channel.SendCTCPMessage(playerExtraOptions.ToCncnetMessage(), QueuedMessageType.GAME_PLAYERS_EXTRA_MESSAGE, 11, true); @@ -852,6 +860,7 @@ private void LoadInitialPlayerNamesIntoUI(List playerNames) /// private void ApplyPlayerOptionsFromCTCP(string sender, string message) { + Logger.Log($"ApplyPlayerOptionsFromCTCP ** " + message); if (sender != hostName) return; @@ -945,48 +954,20 @@ private void ApplyPlayerOptionsFromCTCP(string sender, string message) } } - CopyPlayerDataToUI(); + OnGameOptionChanged(); } /// /// Broadcasts game options to non-host players when the host has changed an option. - /// @TODO: This should be using the topic instead of sending a message? /// protected override void OnGameOptionChanged() { base.OnGameOptionChanged(); - if (!IsHost) - return; - - bool[] optionValues = new bool[CheckBoxes.Count]; - for (int i = 0; i < CheckBoxes.Count; i++) - optionValues[i] = CheckBoxes[i].Checked; - - // Let's pack the booleans into bytes - List byteList = Conversions.BoolArrayIntoBytes(optionValues).ToList(); - - while (byteList.Count % 4 != 0) - byteList.Add(0); - - int integerCount = byteList.Count / 4; - byte[] byteArray = byteList.ToArray(); - - ExtendedStringBuilder sb = new ExtendedStringBuilder("GO ", true, ';'); - - for (int i = 0; i < integerCount; i++) - sb.Append(BitConverter.ToInt32(byteArray, i * 4)); - - // We don't gain much in most cases by packing the drop-down values - // (because they're bytes to begin with, and usually non-zero), - // so let's just transfer them as usual - - foreach (GameLobbyDropDown dd in DropDowns) - sb.Append(dd.SelectedIndex); - - channel.SendCTCPMessage(sb.ToString(), QueuedMessageType.GAME_SETTINGS_MESSAGE, 11); + UpdateChannelTopic(); } + /// /// Handles game details messages from the channel topic /// @@ -1256,7 +1237,7 @@ protected override void GameProcessExited() if (IsHost) { RandomSeed = new Random().Next(); - OnGameOptionChanged(); // This eventually calls OnHostShouldUpdateTopic() + OnGameOptionChanged(); // This eventually calls UpdateChannelTopic() ClearReadyStatuses(); CopyPlayerDataToUI(); BroadcastPlayerOptions(); @@ -1319,15 +1300,15 @@ protected override void StartGame() { AddNotice("Starting game...".L10N("Client:Main:StartingGame")); - FileHashCalculator fhc = new FileHashCalculator(); - fhc.CalculateHashes(GameModeMaps.GameModes); + //FileHashCalculator fhc = new FileHashCalculator(); + //fhc.CalculateHashes(GameModeMaps.GameModes); - if (gameFilesHash != fhc.GetCompleteHash()) - { - Logger.Log("Game files modified during client session!"); - channel.SendCTCPMessage(CHEAT_DETECTED_MESSAGE, QueuedMessageType.INSTANT_MESSAGE, 0); - HandleCheatDetectedMessage(ProgramConstants.PLAYERNAME); - } + //if (gameFilesHash != fhc.GetCompleteHash()) + //{ + // Logger.Log("Game files modified during client session!"); + // channel.SendCTCPMessage(CHEAT_DETECTED_MESSAGE, QueuedMessageType.INSTANT_MESSAGE, 0); + // HandleCheatDetectedMessage(ProgramConstants.PLAYERNAME); + //} base.StartGame(); } @@ -1532,7 +1513,7 @@ protected override void LockGame() Locked = true; btnLockGame.Text = "Unlock Game".L10N("Client:Main:UnlockGame"); - OnHostShouldUpdateTopic(); + UpdateChannelTopic(); } protected override void UnlockGame(bool announce) @@ -1545,7 +1526,7 @@ protected override void UnlockGame(bool announce) AddNotice("The game room has been unlocked.".L10N("Client:Main:GameRoomUnlocked")); btnLockGame.Text = "Lock Game".L10N("Client:Main:LockGame"); - OnHostShouldUpdateTopic(); + UpdateChannelTopic(); } protected override void KickPlayer(int playerIndex) @@ -1620,7 +1601,7 @@ private void HandleTunnelServerChange(CnCNetTunnel tunnel) { tunnelHandler.CurrentTunnel = tunnel; AddNotice(string.Format("The game host has changed the tunnel server to: {0}".L10N("Client:Main:HostChangeTunnel"), tunnel.Name)); - UpdatePing(); + //UpdatePing(); } #endregion @@ -1907,6 +1888,8 @@ private void ParseGameTopic(string topic) if (!topic.StartsWith("GD ")) return; + Logger.Log($"CnCNetGameLobby ** Channel_TopicChanged {topic}"); + // Split the topic into GAME and DETAIL parts using '|' string[] topicParts = topic.Split('|'); string gameDetails = topicParts[0]; @@ -1915,9 +1898,9 @@ private void ParseGameTopic(string topic) ApplyGameDetailsFromTopic(gameDetails.Substring(3)); // Remove the "GD " prefix ApplyGameOptionsFromTopic(gameOptions.Substring(3)); // Remove the "GO " prefix - ApplyPlayerExtraOptions(extraPlayerOptions.Substring(4)); // Remove the "PEO " prefix - - CopyPlayerDataToUI(); + ApplyPlayerExtraOptionsFromTopic(extraPlayerOptions.Substring(4)); // Remove the "PEO " prefix + + OnGameOptionChanged(); } private string BuildGameDetailsTopicString() @@ -2056,12 +2039,10 @@ private string BuildPlayerOptionsCTCPString() return sb.ToString(); } - /// - /// Only update the topic when something in the lobby has changed - /// Updates Game details for the CnCNet lobby & Game Lobby + /// Update Game Channel topic with the current game details, game options and extraplayer options. /// - protected override void OnHostShouldUpdateTopic() + private void UpdateChannelTopic() { if (channel != null && IsHost) { diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/GameLobbyBase.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/GameLobbyBase.cs index e34443279..759c2e6d1 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/GameLobbyBase.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/GameLobbyBase.cs @@ -464,7 +464,7 @@ protected void BtnPlayerExtraOptions_LeftClick(object sender, EventArgs e) PlayerExtraOptionsPanel.Enable(); } - protected void ApplyPlayerExtraOptions(string message) + protected void ApplyPlayerExtraOptionsFromTopic(string message) { var playerExtraOptions = PlayerExtraOptions.FromMessage(message); diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/LANGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/LANGameLobby.cs index 8f0422ed6..046cd2b8d 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/LANGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/LANGameLobby.cs @@ -864,7 +864,7 @@ private void HandlePlayerOptionsRequest(string sender, string data) BroadcastPlayerOptions(); } - private void HandlePlayerExtraOptionsBroadcast(string data) => ApplyPlayerExtraOptions(data); + private void HandlePlayerExtraOptionsBroadcast(string data) => ApplyPlayerExtraOptionsFromTopic(data); private void HandlePlayerOptionsBroadcast(string data) { diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs index 4d73dd360..5b32dbd8e 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs @@ -607,7 +607,7 @@ protected void Refresh(bool isHost) { IsHost = isHost; Locked = false; - CopyPlayerDataToUI(); + //CopyPlayerDataToUI(); UpdateMapPreviewBoxEnabledStatus(); PlayerExtraOptionsPanel?.SetIsHost(isHost); @@ -951,13 +951,12 @@ protected override void OnGameOptionChanged() { base.OnGameOptionChanged(); + Logger.Log("MultiplayerGameLobby: Game option changed"); + ClearReadyStatuses(); CopyPlayerDataToUI(); - OnHostShouldUpdateTopic(); } - protected virtual void OnHostShouldUpdateTopic() {} - protected abstract void HostLaunchGame(); protected override void CopyPlayerDataFromUI(object sender, EventArgs e) diff --git a/DXMainClient/Online/Channel.cs b/DXMainClient/Online/Channel.cs index 959426a47..4c893f7c8 100644 --- a/DXMainClient/Online/Channel.cs +++ b/DXMainClient/Online/Channel.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using DTAClient.DXGUI; using ClientCore.Extensions; +using Rampastring.Tools; namespace DTAClient.Online { @@ -81,11 +82,11 @@ public string Topic get { return _topic; } set { - if (_topic != value) // Only trigger the event if the topic actually changes + Logger.Log("SETTING TOPIC: " + value); + if (_topic != value || _topic == null) // Only trigger the event if the topic actually changes { _topic = value; - // Raise the TopicChanged event TopicChanged?.Invoke(this, new MessageEventArgs(_topic)); if (Persistent) diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index e9869b2cf..dbaf37e74 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -264,14 +264,10 @@ private void DoChannelModesChanged(string userName, string channelName, string m public void OnChannelListReceived(List> channelList) { - Logger.Log("OnChannelListReceived called"); - foreach (var nameTopic in channelList) { (string channelName, string channelTopic) = nameTopic; - Logger.Log($"OnChannelListReceived: channelName: {channelName} channelTopic: {channelTopic}"); - Channel channel = FindChannel(channelName); wm.AddCallback(new Action(DoChannelListReceived), channelName, channelTopic); } diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 6de1b8eb5..8dda2dee1 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -612,7 +612,6 @@ private void PerformCommand(string message) _channelList.Add(Tuple.Create(listChannelName, listChannelTopic)); break; case 323: // End of the LIST command - Logger.Log($"End of Channel LIST"); connectionManager.OnChannelListReceived(_channelList); _channelList.Clear(); break; @@ -788,7 +787,7 @@ private void PerformCommand(string message) } catch { - Logger.Log("Warning: Failed to parse command " + message); + Logger.Log("Warning: Failed to parse command " + message + " // " + parameters); } } @@ -951,11 +950,7 @@ private void Register() public void RequestChannelList(string pattern) { - Logger.Log("RequestChannelList"); - string listCommand = $"LIST {pattern}"; - Logger.Log($"RequestChannelList: {listCommand}"); - QueueMessage(new QueuedMessage(listCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); } @@ -966,7 +961,7 @@ public void SetChannelTopic(string channelName, string newTopic) Logger.Log($"Setting topic for {channelName}: {newTopic}"); // Queue the message to be sent to the server. - QueueMessage(new QueuedMessage(topicCommand, QueuedMessageType.GAME_TOPIC_CHANGED_MESSAGE, 20)); + QueueMessage(new QueuedMessage(topicCommand, QueuedMessageType.GAME_TOPIC_CHANGED_MESSAGE, 11)); } public void ChangeNickname() @@ -1048,6 +1043,8 @@ public void QueueMessage(QueuedMessage qm) qm.ID = NextQueueID++; + Logger.Log("QUEUE Count: " + MessageQueue.Count); + lock (messageQueueLocker) { switch (qm.MessageType) From c08e22a846bd298fd367f76e29367d9185582b73 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Thu, 17 Oct 2024 16:21:33 +0100 Subject: [PATCH 27/38] Hosted game changes & user list updates - Upon receiving user list, send a WHO to the chat channel - Upon succesfully receiving the WHO, request the channel list for games - Better handling of hosts closing the game - Broadcast in topic is by ident not usernames to save space --- .../CnCNet/CnCNetGameLoadingLobby.cs | 1 + .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 100 ++++++++++++------ .../CnCNet/GameCreationEventArgs.cs | 7 +- .../Multiplayer/CnCNet/GameCreationWindow.cs | 1 - .../DXGUI/Multiplayer/GameInformationPanel.cs | 4 +- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 64 +++++++---- DXMainClient/DXGUI/Multiplayer/LANLobby.cs | 4 +- .../Multiplayer/CnCNet/HostedCnCNetGame.cs | 7 +- .../Domain/Multiplayer/GenericHostedGame.cs | 4 +- .../Domain/Multiplayer/LAN/HostedLANGame.cs | 19 +++- DXMainClient/Domain/Multiplayer/PlayerInfo.cs | 8 ++ DXMainClient/Online/Channel.cs | 27 ++--- DXMainClient/Online/CnCNetManager.cs | 59 +++++++++++ DXMainClient/Online/Connection.cs | 25 ++++- DXMainClient/Online/IConnectionManager.cs | 2 + DXMainClient/Online/IUserCollection.cs | 3 + DXMainClient/Online/SortedUserCollection.cs | 24 +++++ DXMainClient/Online/UnsortedUserCollection.cs | 15 +++ 18 files changed, 283 insertions(+), 91 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs index f134bc4d1..704996a7d 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetGameLoadingLobby.cs @@ -271,6 +271,7 @@ private void Channel_UserAdded(object sender, ChannelUserEventArgs e) { PlayerInfo pInfo = new PlayerInfo(); pInfo.Name = e.User.IRCUser.Name; + pInfo.Ident = e.User.IRCUser.Ident; Players.Add(pInfo); diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index cde267ab6..deb342190 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -424,7 +424,7 @@ private bool HostedGameMatches(GenericHostedGame hg) { // friends list takes priority over other filters below if (UserINISettings.Instance.ShowFriendGamesOnly) - return hg.Players.Any(cncnetUserData.IsFriend); + return hg.Players.Any(p => cncnetUserData.IsFriend(p.Name)); // Compare based on player name if (UserINISettings.Instance.HideLockedGames.Value && hg.Locked) return false; @@ -440,7 +440,7 @@ private bool HostedGameMatches(GenericHostedGame hg) string textUpper = tbGameSearch?.Text?.ToUpperInvariant(); - string translatedGameMode = string.IsNullOrEmpty(hg.GameMode) + string translatedGameMode = string.IsNullOrEmpty(hg.GameMode) ? "Unknown".L10N("Client:Main:Unknown") : hg.GameMode.L10N($"INI:GameModes:{hg.GameMode}:UIName", notify: false); @@ -456,7 +456,7 @@ private bool HostedGameMatches(GenericHostedGame hg) translatedGameMode.ToUpperInvariant().Equals(textUpper, StringComparison.Ordinal) || hg.Map.ToUpperInvariant().Contains(textUpper) || (translatedMapName is not null && translatedMapName.ToUpperInvariant().Contains(textUpper)) || - hg.Players.Any(pl => pl.ToUpperInvariant().Equals(textUpper, StringComparison.Ordinal)); + hg.Players.Any(p => p.Name.ToUpperInvariant().Equals(textUpper, StringComparison.Ordinal)); } @@ -543,7 +543,7 @@ private void PostUIInit() connectionManager.Disconnected += ConnectionManager_Disconnected; connectionManager.PrivateCTCPReceived += ConnectionManager_PrivateCTCPReceived; connectionManager.ChannelListReceived += ConnectionManager_ChannelListReceived; - connectionManager.ChannelMessageOfTheDayComplete += ConnectionManager_ChannelMessageOfTheDayComplete; + connectionManager.UserListInitialized += ConnectionManager_UserListInitialized; cncnetUserData.UserFriendToggled += RefreshPlayerList; cncnetUserData.UserIgnoreToggled += RefreshPlayerList; @@ -595,8 +595,9 @@ private void PostUIInit() GameProcessLogic.GameProcessExited += SharedUILogic_GameProcessExited; } - private void ConnectionManager_ChannelMessageOfTheDayComplete(object sender, EventArgs e) + private void ConnectionManager_UserListInitialized(object sender, EventArgs e) { + // We have the user list with full ident info now. We can now request the games list RequestChannelList(null); gameChanneListTimer = new Timer(RequestChannelList, null, 8000, 8000); } @@ -609,7 +610,7 @@ private void RequestChannelList(object state) private void OnParseGameTopic(string topic, string channelName) { - // GD | GO | PO | PEO + // GD | GO | PO | PEO | GS // Ensure the topic starts with "GD " as expected if (!topic.StartsWith("GD ")) return; @@ -628,11 +629,16 @@ private void OnParseGameTopic(string topic, string channelName) private void ApplyGameDetails(string gameDetailsMessage, string channelName) { - try { string[] splitGameDettailsMessage = gameDetailsMessage.Split(new char[] { ';' }); + if (splitGameDettailsMessage.Length < 20) + { + Logger.Log("Error applying game details: message does not have enough elements."); + return; + } + // 0. Protocol version // 1. Game Version // 2. Player Limit @@ -652,7 +658,7 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) // 16. ProtocolVersion // 17. RandomSeed // 18. RemoveStartingLocations - // 19. Players + // 19. Player idents string revision = splitGameDettailsMessage[0]; if (revision != ProgramConstants.CNCNET_PROTOCOL_REVISION) @@ -674,14 +680,42 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) string messageFrameSendRate = splitGameDettailsMessage[14]; string messageMaxAhead = splitGameDettailsMessage[15]; string messageGameProtocolVersion = splitGameDettailsMessage[16]; - string messagePlayers = splitGameDettailsMessage[19]; + string messagePlayerIdents = splitGameDettailsMessage[19]; + + // Find players by idents and give hostedgames a list of playerinfos + List playerIdents = messagePlayerIdents.Split(',').ToList(); + + List playerInfos = new List(); + foreach (string playerIdent in playerIdents) + { + // Check ident exists in the channel and populate name + ChannelUser channelUser = currentChatChannel.Users.Find(u => u?.IRCUser.Ident == playerIdent); + + if (channelUser != null) + { + playerInfos.Add(new PlayerInfo() + { + Name = channelUser.IRCUser.Name, + Ident = channelUser.IRCUser.Ident + }); + } + } + string hostUserName = string.Empty; + string hostIdent = string.Empty; + + if (playerIdents.Count > 0) + { + hostIdent = playerIdents[0]; + ChannelUser hostChannelUser = currentChatChannel.Users.Find(u => + u?.IRCUser?.Ident != null && string.Equals(u.IRCUser.Ident.Trim(), hostIdent.Trim(), StringComparison.OrdinalIgnoreCase)); + + if (hostChannelUser != null) + { + hostUserName = hostChannelUser.IRCUser.Name; + } + } - // Pluck out playernames from players - List playersList = messagePlayers.Split(',').ToList(); - string hostName = string.Empty; - if (playersList.Count > 0) - hostName = playersList[0]; // Host is the first in the list string tunnelAddress = tunnelAddressAndPort[0]; int tunnelPort = int.Parse(tunnelAddressAndPort[1]); @@ -689,13 +723,9 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) CnCNetTunnel tunnel = tunnelHandler.Tunnels.Find(t => t.Address == tunnelAddress && t.Port == tunnelPort); if (tunnel == null || cncnetGame == null) - { - Logger.Log($"GameBroadcastChannel_ChannelListReceived ** Tunnel: {tunnel} // cncnetGame: {cncnetGame}"); return; - } GameModeMap gameModeMap = GameModeMaps.Find(gmm => gmm.Map.SHA1 == mapSHA1); - HostedCnCNetGame game = new HostedCnCNetGame( channelName, revision, @@ -704,8 +734,8 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) channelUIName, isCustomPassword, true, - playersList, - hostName, + playerInfos, + hostUserName, gameModeMap?.Map.Name ?? string.Empty, gameMode ); @@ -715,14 +745,15 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) game.LastRefreshTime = DateTime.Now; game.IsLadder = isLadderGame; game.Game = cncnetGame; - game.Locked = isLocked || (game.IsLoadedGame && !game.Players.Contains(ProgramConstants.PLAYERNAME)); + game.Locked = isLocked || (game.IsLoadedGame && !game.Players.Any(player => player.Name == ProgramConstants.PLAYERNAME)); game.Incompatible = cncnetGame == localGame && game.GameVersion != ProgramConstants.GAME_VERSION; game.TunnelServer = tunnel; + game.HostIdent = hostIdent; // If the game is closed, remove it from the list if (isClosed) { - int index = lbGameList.HostedGames.FindIndex(hg => ((HostedCnCNetGame)hg).HostName == hostName); + int index = lbGameList.HostedGames.FindIndex(hg => ((HostedCnCNetGame)hg).HostIdent == hostIdent); if (index > -1) { @@ -735,7 +766,7 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) return; } - int gameIndex = lbGameList.HostedGames.FindIndex(hg => ((HostedCnCNetGame)hg).HostName == hostName); + int gameIndex = lbGameList.HostedGames.FindIndex(hg => ((HostedCnCNetGame)hg).HostIdent == hostIdent); if (gameIndex > -1) { lbGameList.HostedGames[gameIndex] = game; @@ -983,7 +1014,7 @@ private string GetJoinGameError(HostedCnCNetGame hg) if (hg.Locked) return "The selected game is locked!".L10N("Client:Main:GameLocked"); - if (hg.IsLoadedGame && !hg.Players.Contains(ProgramConstants.PLAYERNAME)) + if (hg.IsLoadedGame && !hg.Players.Any(p => p.Name == ProgramConstants.PLAYERNAME)) return "You do not exist in the saved game!".L10N("Client:Main:NotInSavedGame"); Logger.Log($"{hg.ChannelName}"); @@ -1079,14 +1110,14 @@ private void _JoinGame(HostedCnCNetGame hg, string password) if (hg.IsLoadedGame) { - gameLoadingLobby.SetUp(false, hg.TunnelServer, gameChannel, hg.HostName); + gameLoadingLobby.SetUp(false, hg.TunnelServer, gameChannel, hg.HostUserName); gameChannel.UserAdded += GameLoadingChannel_UserAdded; //gameChannel.MessageAdded += GameLoadingChannel_MessageAdded; gameChannel.InvalidPasswordEntered += GameChannel_InvalidPasswordEntered_LoadedGame; } else { - gameLobby.SetUp(gameChannel, false, hg.MaxPlayers, hg.TunnelServer, hg.HostName, hg.Passworded, hg.Players); + gameLobby.SetUp(gameChannel, false, hg.MaxPlayers, hg.TunnelServer, hg.HostUserName, hg.Passworded, hg.Players); gameChannel.UserAdded += GameChannel_UserAdded; gameChannel.InvalidPasswordEntered += GameChannel_InvalidPasswordEntered_NewGame; gameChannel.InviteOnlyErrorOnJoin += GameChannel_InviteOnlyErrorOnJoin; @@ -1094,9 +1125,6 @@ private void _JoinGame(HostedCnCNetGame hg, string password) gameChannel.TargetChangeTooFast += GameChannel_TargetChangeTooFast; } - Logger.Log("Pausing listings in lobby"); - //gameChanneListTimer.Change(Timeout.Infinite, Timeout.Infinite); - connectionManager.SendCustomMessage(new QueuedMessage("JOIN " + hg.ChannelName + " " + password, QueuedMessageType.INSTANT_MESSAGE, 0)); } @@ -1167,6 +1195,7 @@ private void ClearGameChannelEvents(Channel channel) channel.InviteOnlyErrorOnJoin -= GameChannel_InviteOnlyErrorOnJoin; channel.ChannelFull -= GameChannel_ChannelFull; channel.TargetChangeTooFast -= GameChannel_TargetChangeTooFast; + isJoiningGame = false; } @@ -1337,8 +1366,8 @@ private void ConnectionManager_WelcomeMessageReceived(object sender, EventArgs e ddCurrentChannel.AllowDropDown = true; tbChatInput.Enabled = true; - Channel cncnetChannel = connectionManager.FindChannel("#cncnet"); - cncnetChannel.Join(); + //Channel cncnetChannel = connectionManager.FindChannel("#cncnet"); + //cncnetChannel.Join(); string localGameChatChannelName = gameCollection.GetGameChatChannelNameFromIdentifier(localGameID); connectionManager.FindChannel(localGameChatChannelName).Join(); @@ -1543,6 +1572,7 @@ private void RefreshPlayerList(object sender, EventArgs e) lbPlayerList.Clear(); var current = currentChatChannel.Users.GetFirst(); + while (current != null) { var user = current.Value; @@ -1604,7 +1634,7 @@ private void CurrentChatChannel_MessageAdded(object sender, IRCMessageEventArgs /// private void GameBroadcastChannel_UserLeftOrQuit(object sender, UserNameEventArgs e) { - int gameIndex = lbGameList.HostedGames.FindIndex(hg => hg.HostName == e.UserName); + int gameIndex = lbGameList.HostedGames.FindIndex(hg => hg.HostUserName == e.UserName); if (gameIndex > -1) { @@ -1723,7 +1753,7 @@ private void DismissInvalidInvitations() { var gameIndex = lbGameList.HostedGames.FindIndex(hg => - ((HostedCnCNetGame)hg).HostName == invitation.Key.Item1 && + ((HostedCnCNetGame)hg).HostUserName == invitation.Key.Item1 && ((HostedCnCNetGame)hg).ChannelName == invitation.Key.Item2); if (gameIndex == -1) @@ -1760,7 +1790,9 @@ private void DismissInvitation(UserChannelPair invitationIdentity) /// private HostedCnCNetGame GetHostedGameForUser(IRCUser user) { - return lbGameList.HostedGames.Select(g => (HostedCnCNetGame)g).FirstOrDefault(g => g.Players.Contains(user.Name)); + return lbGameList.HostedGames + .Select(g => (HostedCnCNetGame)g) + .FirstOrDefault(g => g.Players.Any(player => player.Name == user.Name)); } /// diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationEventArgs.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationEventArgs.cs index a6db1560a..ad35cabbe 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationEventArgs.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationEventArgs.cs @@ -1,4 +1,5 @@ -using DTAClient.Domain.Multiplayer.CnCNet; +using DTAClient.Domain.Multiplayer; +using DTAClient.Domain.Multiplayer.CnCNet; using System; using System.Collections.Generic; @@ -7,7 +8,7 @@ namespace DTAClient.DXGUI.Multiplayer.CnCNet class GameCreationEventArgs : EventArgs { public GameCreationEventArgs(string roomName, int maxPlayers, - string password, CnCNetTunnel tunnel, List players) + string password, CnCNetTunnel tunnel, List players) { GameRoomName = roomName; MaxPlayers = maxPlayers; @@ -18,7 +19,7 @@ public GameCreationEventArgs(string roomName, int maxPlayers, public string GameRoomName { get; private set; } public int MaxPlayers { get; private set; } - public List Players { get; private set; } + public List Players { get; private set; } public string Password { get; private set; } public CnCNetTunnel Tunnel { get; private set; } } diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationWindow.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationWindow.cs index 282ff909e..9c5806bd9 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationWindow.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/GameCreationWindow.cs @@ -43,7 +43,6 @@ public GameCreationWindow(WindowManager windowManager, TunnelHandler tunnelHandl private XNAClientButton btnDisplayAdvancedOptions; private TunnelHandler tunnelHandler; - private string[] players; public override void Initialize() { diff --git a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs index 476e91691..53654104d 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameInformationPanel.cs @@ -113,7 +113,7 @@ public void SetInfo(GenericHostedGame game) lblGameVersion.Text = "Game version:".L10N("Client:Main:GameInfoGameVersion") + " " + Renderer.GetSafeString(game.GameVersion, lblGameVersion.FontIndex); lblGameVersion.Visible = true; - lblHost.Text = "Host:".L10N("Client:Main:GameInfoHost") + " " + Renderer.GetSafeString(game.HostName, lblHost.FontIndex); + lblHost.Text = "Host:".L10N("Client:Main:GameInfoHost") + " " + Renderer.GetSafeString(game.HostUserName, lblHost.FontIndex); lblHost.Visible = true; lblPing.Text = game.Ping > 0 ? "Ping:".L10N("Client:Main:GameInfoPing") + " " + game.Ping.ToString() + " ms" : "Ping: Unknown".L10N("Client:Main:GameInfoPingUnknown"); @@ -125,7 +125,7 @@ public void SetInfo(GenericHostedGame game) for (int i = 0; i < game.Players.Count && i < MAX_PLAYERS; i++) { lblPlayerNames[i].Visible = true; - lblPlayerNames[i].Text = Renderer.GetSafeString(game.Players[i], lblPlayerNames[i].FontIndex); + lblPlayerNames[i].Text = Renderer.GetSafeString(game.Players[i].Name, lblPlayerNames[i].FontIndex); } for (int i = game.Players.Count; i < MAX_PLAYERS; i++) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 20da0ae41..310ea295f 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -206,7 +206,7 @@ private void MultiplayerName_RightClick(object sender, MultiplayerNameRightClick public void SetUp(Channel channel, bool isHost, int playerLimit, CnCNetTunnel tunnel, string hostName, bool isCustomPassword, - List players) + List players) { this.channel = channel; channel.MessageAdded += Channel_MessageAdded; @@ -386,19 +386,40 @@ public override void Clear() private void Channel_TopicChanged(object sender, MessageEventArgs e) { - ParseGameTopic(e.Message); + if (closed) + { + OnHostLeftGame(); + } + else + { + ParseGameTopic(e.Message); + } + } + + private void RequestLeaveGame() + { + UpdateChannelTopic(); + } + + private void OnHostLeftGame() + { + Clear(); } public void LeaveGameLobby() { + closed = true; + if (IsHost) { - closed = true; + RequestLeaveGame(); + channel.Leave(); + } + else + { + channel.Leave(); + Clear(); } - - channel.Leave(); - Clear(); - channel = null; } private void ConnectionManager_Disconnected(object sender, EventArgs e) => HandleConnectionLoss(); @@ -513,6 +534,7 @@ private void Channel_UserListReceived(object sender, EventArgs e) private void Channel_UserAdded(object sender, ChannelUserEventArgs e) { PlayerInfo pInfo = new PlayerInfo(e.User.IRCUser.Name); + pInfo.Ident = e.User.IRCUser.Ident; Players.Add(pInfo); if (Players.Count + AIPlayers.Count > MAX_PLAYER_COUNT && AIPlayers.Count > 0) @@ -722,6 +744,7 @@ protected override void RequestReadyStatus() readyState = 1; channel.SendCTCPMessage($"R {readyState}", QueuedMessageType.GAME_PLAYERS_READY_STATUS_MESSAGE, 5); + OnGameOptionChanged(); } protected override void AddNotice(string message, Color color) => channel.AddMessage(new ChatMessage(color, message)); @@ -842,16 +865,9 @@ protected override void BroadcastPlayerExtraOptions() /// Show the player names in the UI upon joining the game. (So its not not initially blank). /// /// - private void LoadInitialPlayerNamesIntoUI(List playerNames) + private void LoadInitialPlayerNamesIntoUI(List players) { - Players.Clear(); - - for (int i = 0; i < playerNames.Count; i++) - { - PlayerInfo pInfo = new() { Name = playerNames[i] }; - Players.Add(pInfo); - } - + Players = players; CopyPlayerDataToUI(); } @@ -997,8 +1013,9 @@ private void ApplyGameDetailsFromTopic(string message) // 16. ProtocolVersion // 17. RandomSeed // 18. RemoveStartingLocations - // 19. Players + // 19. Player idents + bool isClosed = Conversions.BooleanFromString(splitMessage[6], true); string mapOfficial = splitMessage[10]; string mapSHA1 = splitMessage[11]; string gameMode = splitMessage[12]; @@ -1007,11 +1024,14 @@ private void ApplyGameDetailsFromTopic(string message) string messageGameProtocolVersion = splitMessage[16]; string messageRandomSeed = splitMessage[17]; string messageRemoveStartingLocations = splitMessage[18]; - string messagePlayers = splitMessage[19]; + string messagePlayerIdents = splitMessage[19]; + if (isClosed) + { + LeaveGameLobby(); + return; + } - // Do stuff with it. - // Seed int randomSeed; bool parseSuccess = int.TryParse(messageRandomSeed, out randomSeed); @@ -1924,7 +1944,7 @@ private string BuildGameDetailsTopicString() // 16. ProtocolVersion // 17. RandomSeed // 18. RemoveStartingLocations - // 19. Players + // 19. Idents ExtendedStringBuilder sb = new ExtendedStringBuilder("GD ", true, ';'); @@ -1953,7 +1973,7 @@ private string BuildGameDetailsTopicString() StringBuilder playersSb = new StringBuilder(";"); foreach (PlayerInfo pInfo in Players) { - playersSb.Append(pInfo.Name); + playersSb.Append(pInfo.Ident); playersSb.Append(","); } diff --git a/DXMainClient/DXGUI/Multiplayer/LANLobby.cs b/DXMainClient/DXGUI/Multiplayer/LANLobby.cs index c13102f46..733d698d3 100644 --- a/DXMainClient/DXGUI/Multiplayer/LANLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/LANLobby.cs @@ -545,7 +545,7 @@ private void LbGameList_DoubleLeftClick(object sender, EventArgs e) if (hg.IsLoadedGame) { - if (!hg.Players.Contains(ProgramConstants.PLAYERNAME)) + if (!hg.Players.Any(p => p.Name == ProgramConstants.PLAYERNAME)) { lbChatMessages.AddMessage("You do not exist in the saved game!".L10N("Client:Main:NotInSavedGame")); return; @@ -553,7 +553,7 @@ private void LbGameList_DoubleLeftClick(object sender, EventArgs e) } else { - if (hg.Players.Contains(ProgramConstants.PLAYERNAME)) + if (!hg.Players.Any(p => p.Name == ProgramConstants.PLAYERNAME)) { lbChatMessages.AddMessage("Your name is already taken in the game.".L10N("Client:Main:NameOccupied")); return; diff --git a/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs b/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs index 9f6d5a357..e4d184ad2 100644 --- a/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs +++ b/DXMainClient/Domain/Multiplayer/CnCNet/HostedCnCNetGame.cs @@ -8,8 +8,8 @@ public class HostedCnCNetGame : GenericHostedGame public HostedCnCNetGame() { } public HostedCnCNetGame(string channelName, string revision, string gameVersion, int maxPlayers, - string roomName, bool passworded, bool tunneled, List players, - string hostName, string mapName, string gameMode) + string roomName, bool passworded, bool tunneled, List players, + string hostUserName, string mapName, string gameMode) { ChannelName = channelName; Revision = revision; @@ -19,7 +19,7 @@ public HostedCnCNetGame(string channelName, string revision, string gameVersion, Passworded = passworded; Tunneled = tunneled; Players = players; - HostName = hostName; + HostUserName = hostUserName; Map = mapName; GameMode = gameMode; } @@ -28,6 +28,7 @@ public HostedCnCNetGame(string channelName, string revision, string gameVersion, public string Revision { get; set; } public bool Tunneled { get; set; } public bool IsLadder { get; set; } + public string HostIdent { get; set; } public string MatchID { get; set; } public CnCNetTunnel TunnelServer { get; set; } diff --git a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs index fc0aa8a85..33a203bdf 100644 --- a/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs +++ b/DXMainClient/Domain/Multiplayer/GenericHostedGame.cs @@ -19,8 +19,8 @@ public abstract class GenericHostedGame: IEquatable public string GameMode { get; set; } public string Map { get; set; } public string GameVersion { get; set; } - public string HostName { get; set; } - public ListPlayers { get; set; } + public string HostUserName { get; set; } + public List Players { get; set; } public int MaxPlayers { get; set; } = 8; public abstract int Ping { get; } diff --git a/DXMainClient/Domain/Multiplayer/LAN/HostedLANGame.cs b/DXMainClient/Domain/Multiplayer/LAN/HostedLANGame.cs index 5483fbf3b..6c4b27ff1 100644 --- a/DXMainClient/Domain/Multiplayer/LAN/HostedLANGame.cs +++ b/DXMainClient/Domain/Multiplayer/LAN/HostedLANGame.cs @@ -43,16 +43,25 @@ public bool SetDataFromStringArray(GameCollection gc, string[] parameters) Map = parameters[3]; GameMode = parameters[4]; LoadedGameID = parameters[5]; - List players = parameters[6].Split(',').ToList(); - Players = players; - if (players.Count == 0) + + List playerInfos = new List(); + + List playerNames = parameters[6].Split(',').ToList(); + foreach (string playerName in playerNames) + { + playerInfos.Add(new PlayerInfo(playerName)); + } + + Players = playerInfos; + if (playerInfos.Count == 0) return false; - HostName = players[0]; + + HostUserName = playerInfos[0].Name; Locked = Conversions.IntFromString(parameters[7], 1) > 0; IsLoadedGame = Conversions.IntFromString(parameters[8], 0) > 0; LastRefreshTime = DateTime.Now; TimeWithoutRefresh = TimeSpan.Zero; - RoomName = HostName + "'s Game"; + RoomName = HostUserName + "'s Game"; return true; } diff --git a/DXMainClient/Domain/Multiplayer/PlayerInfo.cs b/DXMainClient/Domain/Multiplayer/PlayerInfo.cs index 43abbdd00..45fd99c49 100644 --- a/DXMainClient/Domain/Multiplayer/PlayerInfo.cs +++ b/DXMainClient/Domain/Multiplayer/PlayerInfo.cs @@ -8,6 +8,8 @@ namespace DTAClient.Domain.Multiplayer /// public class PlayerInfo { + private string _ident; + public PlayerInfo() { } public PlayerInfo(string name) @@ -24,6 +26,12 @@ public PlayerInfo(string name, int sideId, int startingLocation, int colorId, in TeamId = teamId; } + public PlayerInfo(string name, string ident) : this(name) + { + _ident = ident; + } + + public string Ident { get; set; } public string Name { get; set; } public int SideId { get; set; } public int StartingLocation { get; set; } diff --git a/DXMainClient/Online/Channel.cs b/DXMainClient/Online/Channel.cs index 4c893f7c8..deb3cdeb5 100644 --- a/DXMainClient/Online/Channel.cs +++ b/DXMainClient/Online/Channel.cs @@ -137,24 +137,25 @@ public void OnUserJoined(ChannelUser user) #endif } - public void OnUserListReceived(List userList) + public void OnUserListReceived(List channelUserList) { - for (int i = 0; i < userList.Count; i++) + for (int i = 0; i < channelUserList.Count; i++) { - ChannelUser user = userList[i]; - var existingUser = users.Find(user.IRCUser.Name); + ChannelUser channelUser = channelUserList[i]; + ChannelUser existingUser = users.Find(channelUser.IRCUser.Name); if (existingUser == null) { - users.Add(user.IRCUser.Name, user); + users.Add(channelUser.IRCUser.Name, channelUser); } else if (IsChatChannel) { - if (existingUser.IsAdmin != user.IsAdmin) - { - existingUser.IsAdmin = user.IsAdmin; - existingUser.IsFriend = user.IsFriend; - users.Reinsert(user.IRCUser.Name); - } + ChannelUser newChannelUser = new ChannelUser(existingUser.IRCUser); + newChannelUser.IRCUser.Ident = channelUser.IRCUser.Ident; + newChannelUser.IRCUser.Hostname = channelUser.IRCUser.Hostname; + newChannelUser.IsFriend = existingUser.IsFriend; + newChannelUser.IsAdmin = existingUser.IsAdmin; + + users.Update(channelUser.IRCUser.Name, newChannelUser); } } @@ -290,9 +291,9 @@ public void SendCTCPMessage(string message, QueuedMessageType qmType, int priori } /// - /// Sends a "kick user" message to the channel. + /// Sends a "kick channelUser" message to the channel. /// - /// The name of the user that should be kicked. + /// The name of the channelUser that should be kicked. /// The priority of the message in the send queue. public void SendKickMessage(string userName, int priority) { diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index dbaf37e74..ab9e363d8 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -9,6 +9,9 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Microsoft.Extensions.Hosting; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; +using SharpDX.XInput; namespace DTAClient.Online { @@ -42,6 +45,7 @@ public class CnCNetManager : IConnectionManager public event EventHandler ReconnectAttempt; public event EventHandler Disconnected; public event EventHandler Connected; + public event EventHandler UserListInitialized; public event EventHandler UserAdded; public event EventHandler UserGameIndexUpdated; @@ -116,6 +120,8 @@ public bool IsAttemptingConnection private bool disconnect = false; + private bool userListInitialized = false; + public bool IsCnCNetInitialized() { return Connection.IsIdSet(); @@ -273,6 +279,49 @@ public void OnChannelListReceived(List> channelList) } } + public void OnWhoQueryComplete(string channelName, List> whoDataList) + { + Logger.Log("OnWhoQueryComplete ** " + channelName + " -- " + whoDataList.Count); + wm.AddCallback(new Action>>(DoWhoQueryComplete), channelName, whoDataList); + } + + private void DoWhoQueryComplete(string channelName, List> whoDataList) + { + Channel channel = FindChannel(channelName); + + Logger.Log("ChannelName ** " + channelName + " -- " + channel); + + if (channel == null) + return; + + if (!channel.IsChatChannel) + return; + + var channelUserList = new List(); + + foreach (var whoData in whoDataList) + { + (string ident, string host, string userName, string extraInfo) = whoData; + + IRCUser ircUser = new(userName); + ircUser.Ident = ident; + ircUser.Hostname = host; + + UserList.Add(ircUser); + + var channelUser = new ChannelUser(ircUser); + channelUser.IsFriend = cncNetUserData.IsFriend(channelUser.IRCUser.Name); + + channelUserList.Add(channelUser); + } + + UserList = UserList.OrderBy(u => u.Name).ToList(); + MultipleUsersAdded?.Invoke(this, EventArgs.Empty); + UserListInitialized?.Invoke(this, EventArgs.Empty); + + channel.OnUserListReceived(channelUserList); + } + public void OnMessageOfTheDayComplete() { wm.AddCallback(new Action(DoMessageOfTheDayComplete), null); @@ -483,6 +532,7 @@ private void DoConnectionLost(string reason) MainChannel.AddMessage(new ChatMessage(Color.Red, "Connection to CnCNet has been lost.".L10N("Client:Main:ConnectToCncNetHasLost"))); connected = false; + userListInitialized = false; } /// @@ -529,6 +579,7 @@ private void DoDisconnected() MainChannel.AddMessage(new ChatMessage("You have disconnected from CnCNet.".L10N("Client:Main:CncNetDisconnected"))); connected = false; + userListInitialized = false; UserList.Clear(); @@ -747,6 +798,7 @@ public void RemoveChannelFromUser(string userName, string channelName) UserRemoved?.Invoke(this, new UserNameIndexEventArgs(userIndex, userName)); } } + userListInitialized = false; } public void OnUserListReceived(string channelName, string[] userList) @@ -799,6 +851,13 @@ private void DoUserListReceived(string channelName, string[] userList) MultipleUsersAdded?.Invoke(this, EventArgs.Empty); channel.OnUserListReceived(channelUserList); + + // We only need to request user info once, and chat channels only. + if (!userListInitialized && channel.IsChatChannel) + { + channel.RequestUserInfo(); + userListInitialized = true; + } } public void OnUserQuitIRC(string userName) diff --git a/DXMainClient/Online/Connection.cs b/DXMainClient/Online/Connection.cs index 8dda2dee1..e5784c913 100644 --- a/DXMainClient/Online/Connection.cs +++ b/DXMainClient/Online/Connection.cs @@ -123,6 +123,7 @@ private bool disconnect private static string systemId; private static readonly object idLocker = new object(); private readonly List> _channelList = []; + private readonly List> _whoResponseList = []; public static void SetId(string id) { @@ -607,9 +608,13 @@ private void PerformCommand(string message) connectionManager.OnAwayMessageReceived(awayPlayer, awayReason); break; case 322: // Channel information from LIST command - string listChannelName = parameters[1]; - string listChannelTopic = parameters[3]; - _channelList.Add(Tuple.Create(listChannelName, listChannelTopic)); + // Ensure topic is present + if (parameters.Count > 3) + { + string listChannelName = parameters[1]; + string listChannelTopic = parameters[3]; + _channelList.Add(Tuple.Create(listChannelName, listChannelTopic)); + } break; case 323: // End of the LIST command connectionManager.OnChannelListReceived(_channelList); @@ -634,11 +639,17 @@ private void PerformCommand(string message) string host = parameters[3]; string wUserName = parameters[5]; string extraInfo = parameters[7]; + _whoResponseList.Add(Tuple.Create(ident, host, wUserName, extraInfo)); connectionManager.OnWhoReplyReceived(ident, host, wUserName, extraInfo); break; case 311: // Reply to WHOIS NAME query connectionManager.OnWhoReplyReceived(parameters[2], parameters[3], parameters[1], string.Empty); break; + case 315: // End of WHO query + Logger.Log($"END OF WHO QUERY " + parameters[1] + " COUNT:" + _whoResponseList.Count); + connectionManager.OnWhoQueryComplete(parameters[1], new List>(_whoResponseList)); + _whoResponseList.Clear(); + break; case 433: // Name already in use message = serverMessagePart + parameters[1] + ": " + parameters[2]; //connectionManager.OnGenericServerMessageReceived(message); @@ -954,6 +965,12 @@ public void RequestChannelList(string pattern) QueueMessage(new QueuedMessage(listCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); } + public void RequestWHOList(string channelName) + { + string whoCommand = $"WHO {channelName}"; + QueueMessage(new QueuedMessage(whoCommand, QueuedMessageType.SYSTEM_MESSAGE, 5000)); + } + public void SetChannelTopic(string channelName, string newTopic) { // Send the TOPIC command to the IRC server with the desired topic. @@ -979,7 +996,7 @@ public void QueueMessage(QueuedMessageType type, int priority, int delay, string { QueuedMessage qm = new QueuedMessage(message, type, priority, delay); QueueMessage(qm); - Logger.Log("Setting delay to " + delay + "ms for " + qm.ID); + Logger.Log("Setting delay to " + delay + "ms for " + qm.ID + " __ " + message); } /// diff --git a/DXMainClient/Online/IConnectionManager.cs b/DXMainClient/Online/IConnectionManager.cs index d94e777c6..05afe3d72 100644 --- a/DXMainClient/Online/IConnectionManager.cs +++ b/DXMainClient/Online/IConnectionManager.cs @@ -24,6 +24,8 @@ public interface IConnectionManager void OnWhoReplyReceived(string ident, string hostName, string userName, string extraInfo); + void OnWhoQueryComplete(string channel, List> whoList); + void OnChannelFull(string channelName); void OnTargetChangeTooFast(string channelName, string message); diff --git a/DXMainClient/Online/IUserCollection.cs b/DXMainClient/Online/IUserCollection.cs index ac242b7e2..d8c559f4b 100644 --- a/DXMainClient/Online/IUserCollection.cs +++ b/DXMainClient/Online/IUserCollection.cs @@ -11,8 +11,11 @@ public interface IUserCollection void Clear(); void DoForAllUsers(Action action); T Find(string username); + T Find(Func predicate); // This allows searching with a custom predicate + LinkedListNode GetFirst(); void Reinsert(string username); bool Remove(string username); + void Update(string username, T item); } } \ No newline at end of file diff --git a/DXMainClient/Online/SortedUserCollection.cs b/DXMainClient/Online/SortedUserCollection.cs index e6b1134b0..3c96c1f04 100644 --- a/DXMainClient/Online/SortedUserCollection.cs +++ b/DXMainClient/Online/SortedUserCollection.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using Rampastring.Tools; + namespace DTAClient.Online { /// @@ -74,6 +76,20 @@ public T Find(string username) return default(T); } + public T Find(Func predicate) + { + var current = linkedList.First; + while (current != null) + { + if (predicate(current.Value)) + { + return current.Value; + } + current = current.Next; + } + return default(T); + } + public void Reinsert(string username) { var existing = Find(username.ToLower()); @@ -84,6 +100,14 @@ public void Reinsert(string username) Add(username, existing); } + public void Update(string username, T item) + { + if (dictionary.TryGetValue(username.ToLower(), out var existing)) + { + existing.Value = item; + } + } + public void Clear() { linkedList.Clear(); diff --git a/DXMainClient/Online/UnsortedUserCollection.cs b/DXMainClient/Online/UnsortedUserCollection.cs index e6b606d56..9893c15e8 100644 --- a/DXMainClient/Online/UnsortedUserCollection.cs +++ b/DXMainClient/Online/UnsortedUserCollection.cs @@ -42,6 +42,16 @@ public T Find(string username) return default(T); } + public T Find(Func predicate) + { + foreach (var user in dictionary.Values) + { + if (predicate(user)) + return user; + } + return default(T); + } + public LinkedListNode GetFirst() { throw new NotImplementedException(); @@ -52,6 +62,11 @@ public void Reinsert(string username) throw new NotImplementedException(); } + public void Update(string username, T item) + { + throw new NotImplementedException(); + } + public bool Remove(string username) { return dictionary.Remove(username.ToLower()); From 3cc60ccd4e5479f196adce7a5c014ddf7e3f80cf Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Thu, 17 Oct 2024 16:40:19 +0100 Subject: [PATCH 28/38] Puts back other bits --- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 90 +++++++++++-------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 310ea295f..b81c0ad55 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -237,7 +237,7 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, } tunnelHandler.CurrentTunnel = tunnel; - //tunnelHandler.CurrentTunnelPinged += TunnelHandler_CurrentTunnelPinged; + tunnelHandler.CurrentTunnelPinged += TunnelHandler_CurrentTunnelPinged; connectionManager.ConnectionLost += ConnectionManager_ConnectionLost; connectionManager.Disconnected += ConnectionManager_Disconnected; @@ -250,10 +250,10 @@ public void SetUp(Channel channel, bool isHost, int playerLimit, public void OnJoined() { - //FileHashCalculator fhc = new FileHashCalculator(); - //fhc.CalculateHashes(GameModeMaps.GameModes); + FileHashCalculator fhc = new FileHashCalculator(); + fhc.CalculateHashes(GameModeMaps.GameModes); - //gameFilesHash = fhc.GetCompleteHash(); + gameFilesHash = fhc.GetCompleteHash(); if (IsHost) { @@ -261,10 +261,12 @@ public void OnJoined() string.Format("MODE {0} +klnN {1} {2}", channel.ChannelName, channel.Password, playerLimit), QueuedMessageType.SYSTEM_MESSAGE, 50)); + + UpdateChannelTopic(); } else { - //channel.SendCTCPMessage("FHSH " + gameFilesHash, QueuedMessageType.SYSTEM_MESSAGE, 10); + channel.SendCTCPMessage("FHSH " + gameFilesHash, QueuedMessageType.SYSTEM_MESSAGE, 10); } TopBar.AddPrimarySwitchable(this); @@ -272,25 +274,25 @@ public void OnJoined() WindowManager.SelectedControl = tbChatInput; ResetAutoReadyCheckbox(); - //UpdatePing(); - //UpdateDiscordPresence(true); + UpdatePing(); + UpdateDiscordPresence(true); channel.TopicChanged += Channel_TopicChanged; } private void UpdatePing() { - //if (tunnelHandler.CurrentTunnel == null) - // return; + if (tunnelHandler.CurrentTunnel == null) + return; - //channel.SendCTCPMessage("TNLPNG " + tunnelHandler.CurrentTunnel.PingInMs, QueuedMessageType.SYSTEM_MESSAGE, 10); + channel.SendCTCPMessage("TNLPNG " + tunnelHandler.CurrentTunnel.PingInMs, QueuedMessageType.SYSTEM_MESSAGE, 10); - //PlayerInfo pInfo = Players.Find(p => p.Name.Equals(ProgramConstants.PLAYERNAME)); - //if (pInfo != null) - //{ - // pInfo.Ping = tunnelHandler.CurrentTunnel.PingInMs; - // UpdatePlayerPingIndicator(pInfo); - //} + PlayerInfo pInfo = Players.Find(p => p.Name.Equals(ProgramConstants.PLAYERNAME)); + if (pInfo != null) + { + pInfo.Ping = tunnelHandler.CurrentTunnel.PingInMs; + UpdatePlayerPingIndicator(pInfo); + } } protected override void CopyPlayerDataToUI() @@ -409,6 +411,7 @@ private void OnHostLeftGame() public void LeaveGameLobby() { closed = true; + Disable(); if (IsHost) { @@ -449,21 +452,32 @@ private void Channel_UserNameChanged(object sender, UserNameChangedEventArgs e) protected override void UpdateDiscordPresence(bool resetTimer = false) { - //if (discordHandler == null) - // return; + if (discordHandler == null) + return; + + PlayerInfo player = FindLocalPlayer(); + if (player == null || Map == null || GameMode == null || Players.Count == 0) + return; - //PlayerInfo player = FindLocalPlayer(); - //if (player == null || Map == null || GameMode == null) - // return; - //string side = ""; - //if (ddPlayerSides.Length > Players.IndexOf(player)) - // side = (string)ddPlayerSides[Players.IndexOf(player)].SelectedItem.Tag; - //string currentState = ProgramConstants.IsInGame ? "In Game" : "In Lobby"; // not UI strings + string side = ""; + if (ddPlayerSides != null && ddPlayerSides.Length > Players.IndexOf(player)) + side = ddPlayerSides[Players.IndexOf(player)].SelectedItem?.Tag?.ToString() ?? "Unknown Side"; - //discordHandler.UpdatePresence( - // Map.UntranslatedName, GameMode.UntranslatedUIName, "Multiplayer", - // currentState, Players.Count, playerLimit, side, - // channel.UIName, IsHost, isCustomPassword, Locked, resetTimer); + string currentState = ProgramConstants.IsInGame ? "In Game" : "In Lobby"; + + discordHandler.UpdatePresence( + Map.UntranslatedName ?? "Unknown Map", + GameMode.UntranslatedUIName ?? "Unknown Mode", + "Multiplayer", + currentState, + Players.Count, + playerLimit, + side, + channel?.UIName ?? "Unknown Channel", + IsHost, + isCustomPassword, + Locked, + resetTimer); } private void Channel_UserQuitIRC(object sender, UserNameEventArgs e) @@ -1320,15 +1334,15 @@ protected override void StartGame() { AddNotice("Starting game...".L10N("Client:Main:StartingGame")); - //FileHashCalculator fhc = new FileHashCalculator(); - //fhc.CalculateHashes(GameModeMaps.GameModes); + FileHashCalculator fhc = new FileHashCalculator(); + fhc.CalculateHashes(GameModeMaps.GameModes); - //if (gameFilesHash != fhc.GetCompleteHash()) - //{ - // Logger.Log("Game files modified during client session!"); - // channel.SendCTCPMessage(CHEAT_DETECTED_MESSAGE, QueuedMessageType.INSTANT_MESSAGE, 0); - // HandleCheatDetectedMessage(ProgramConstants.PLAYERNAME); - //} + if (gameFilesHash != fhc.GetCompleteHash()) + { + Logger.Log("Game files modified during client session!"); + channel.SendCTCPMessage(CHEAT_DETECTED_MESSAGE, QueuedMessageType.INSTANT_MESSAGE, 0); + HandleCheatDetectedMessage(ProgramConstants.PLAYERNAME); + } base.StartGame(); } @@ -1621,7 +1635,7 @@ private void HandleTunnelServerChange(CnCNetTunnel tunnel) { tunnelHandler.CurrentTunnel = tunnel; AddNotice(string.Format("The game host has changed the tunnel server to: {0}".L10N("Client:Main:HostChangeTunnel"), tunnel.Name)); - //UpdatePing(); + UpdatePing(); } #endregion From 2aaa1802ed184f7294aeedcd2e12ca5c3db95db1 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Thu, 17 Oct 2024 16:42:49 +0100 Subject: [PATCH 29/38] Fix pipeline error --- DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index b81c0ad55..1cec64380 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -11,7 +11,6 @@ using Microsoft.Xna.Framework; using Rampastring.Tools; using Rampastring.XNAUI; -using Rampastring.XNAUI.XNAControls; using System; using System.Collections.Generic; using System.IO; @@ -19,8 +18,6 @@ using System.Text; using DTAClient.Domain.Multiplayer.CnCNet; using ClientCore.Extensions; -using SharpDX.Direct2D1; -using Microsoft.VisualBasic; namespace DTAClient.DXGUI.Multiplayer.GameLobby { From a8913b23bcbabd6ec4685d74d8405b2a756d7b81 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Thu, 17 Oct 2024 17:30:56 +0100 Subject: [PATCH 30/38] Few ui fixes --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 63 +++++++++-------- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 69 +++++++++---------- DXMainClient/Online/Channel.cs | 1 - DXMainClient/Online/CnCNetManager.cs | 4 -- DXMainClient/Online/Connection.cs | 4 -- 5 files changed, 62 insertions(+), 79 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index deb342190..59e15888e 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -598,6 +598,11 @@ private void PostUIInit() private void ConnectionManager_UserListInitialized(object sender, EventArgs e) { // We have the user list with full ident info now. We can now request the games list + + btnNewGame.AllowClick = true; + btnJoinGame.AllowClick = true; + ddCurrentChannel.AllowDropDown = true; + RequestChannelList(null); gameChanneListTimer = new Timer(RequestChannelList, null, 8000, 8000); } @@ -618,8 +623,6 @@ private void OnParseGameTopic(string topic, string channelName) // Split the topic into GAME and DETAIL parts using '|' string[] topicParts = topic.Split('|'); string gameDetails = topicParts[0]; - string gameOptions = topicParts.Length > 1 ? topicParts[1] : null; - string extraPlayerOptions = topicParts.Length > 2 ? topicParts[2] : null; ApplyGameDetails( gameDetails.Substring(3), // Remove the "GD " prefix @@ -629,11 +632,11 @@ private void OnParseGameTopic(string topic, string channelName) private void ApplyGameDetails(string gameDetailsMessage, string channelName) { - try - { + //try + //{ string[] splitGameDettailsMessage = gameDetailsMessage.Split(new char[] { ';' }); - if (splitGameDettailsMessage.Length < 20) + if (splitGameDettailsMessage.Length < 19) { Logger.Log("Error applying game details: message does not have enough elements."); return; @@ -651,14 +654,13 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) // 9. LoadedGameId // 10. Map Is Official // 11. Map SHA1 - // 12. Game Mode Name - // 13. Tunnel address: Port - // 14. FrameSendRate - // 15. MaxAhead - // 16. ProtocolVersion - // 17. RandomSeed - // 18. RemoveStartingLocations - // 19. Player idents + // 12. Tunnel address: Port + // 13. FrameSendRate + // 14. MaxAhead + // 15. ProtocolVersion + // 16. RandomSeed + // 17. RemoveStartingLocations + // 18. Idents string revision = splitGameDettailsMessage[0]; if (revision != ProgramConstants.CNCNET_PROTOCOL_REVISION) @@ -675,12 +677,11 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) string loadedGameId = splitGameDettailsMessage[9]; string mapOfficial = splitGameDettailsMessage[10]; string mapSHA1 = splitGameDettailsMessage[11]; - string gameMode = splitGameDettailsMessage[12]; - string[] tunnelAddressAndPort = splitGameDettailsMessage[13].Split(':'); - string messageFrameSendRate = splitGameDettailsMessage[14]; - string messageMaxAhead = splitGameDettailsMessage[15]; - string messageGameProtocolVersion = splitGameDettailsMessage[16]; - string messagePlayerIdents = splitGameDettailsMessage[19]; + string[] tunnelAddressAndPort = splitGameDettailsMessage[12].Split(':'); + string messageFrameSendRate = splitGameDettailsMessage[13]; + string messageMaxAhead = splitGameDettailsMessage[14]; + string messageGameProtocolVersion = splitGameDettailsMessage[15]; + string messagePlayerIdents = splitGameDettailsMessage[18]; // Find players by idents and give hostedgames a list of playerinfos List playerIdents = messagePlayerIdents.Split(',').ToList(); @@ -737,7 +738,7 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) playerInfos, hostUserName, gameModeMap?.Map.Name ?? string.Empty, - gameMode + gameModeMap?.GameMode.Name ?? string.Empty ); game.IsLoadedGame = isLoadedGame; @@ -786,11 +787,12 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) SortAndRefreshHostedGames(); - } - catch (Exception ex) - { - Logger.Log("Error applying game details: " + ex.Message); - } + //} + //catch (Exception ex) + //{ + // Logger.Log("Error applying game details: " + ex.Message); + // Logger.Log("Error applying game details: " + ex.Message); + //} } private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEventArgs e) @@ -1361,13 +1363,8 @@ private void ConnectionManager_Disconnected(object sender, EventArgs e) private void ConnectionManager_WelcomeMessageReceived(object sender, EventArgs e) { - btnNewGame.AllowClick = true; - btnJoinGame.AllowClick = true; - ddCurrentChannel.AllowDropDown = true; - tbChatInput.Enabled = true; - - //Channel cncnetChannel = connectionManager.FindChannel("#cncnet"); - //cncnetChannel.Join(); + Channel cncnetChannel = connectionManager.FindChannel("#cncnet"); + cncnetChannel.Join(); string localGameChatChannelName = gameCollection.GetGameChatChannelNameFromIdentifier(localGameID); connectionManager.FindChannel(localGameChatChannelName).Join(); @@ -1390,6 +1387,8 @@ private void ConnectionManager_WelcomeMessageReceived(object sender, EventArgs e } } + tbChatInput.Enabled = true; + gameCheckCancellation = new CancellationTokenSource(); CnCNetGameCheck gameCheck = new CnCNetGameCheck(); gameCheck.InitializeService(gameCheckCancellation); diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 1cec64380..7bc55cd6c 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -385,7 +385,7 @@ public override void Clear() private void Channel_TopicChanged(object sender, MessageEventArgs e) { - if (closed) + if (closed && IsHost) { OnHostLeftGame(); } @@ -395,33 +395,29 @@ private void Channel_TopicChanged(object sender, MessageEventArgs e) } } - private void RequestLeaveGame() - { - UpdateChannelTopic(); - } - private void OnHostLeftGame() { Clear(); + channel.Leave(); } public void LeaveGameLobby() { - closed = true; - Disable(); - if (IsHost) { - RequestLeaveGame(); - channel.Leave(); + // We need to succesfully change the topic first before we can leave the channel + btnLeaveGame.Enabled = false; + closed = true; + UpdateChannelTopic(); } else { - channel.Leave(); Clear(); + channel.Leave(); } } + private void ConnectionManager_Disconnected(object sender, EventArgs e) => HandleConnectionLoss(); private void ConnectionManager_ConnectionLost(object sender, ConnectionLostEventArgs e) => HandleConnectionLoss(); @@ -1017,25 +1013,24 @@ private void ApplyGameDetailsFromTopic(string message) // 9. LoadedGameId // 10. Map Is Official // 11. Map SHA1 - // 12. Game Mode Name - // 13. Tunnel address: Port - // 14. FrameSendRate - // 15. MaxAhead - // 16. ProtocolVersion - // 17. RandomSeed - // 18. RemoveStartingLocations - // 19. Player idents + // 12. Tunnel address: Port + // 13. FrameSendRate + // 14. MaxAhead + // 15. ProtocolVersion + // 16. RandomSeed + // 17. RemoveStartingLocations + // 18. Idents bool isClosed = Conversions.BooleanFromString(splitMessage[6], true); string mapOfficial = splitMessage[10]; string mapSHA1 = splitMessage[11]; - string gameMode = splitMessage[12]; - string messageFrameSendRate = splitMessage[14]; - string messageMaxAhead = splitMessage[15]; - string messageGameProtocolVersion = splitMessage[16]; - string messageRandomSeed = splitMessage[17]; - string messageRemoveStartingLocations = splitMessage[18]; - string messagePlayerIdents = splitMessage[19]; + // 12. Tunnel address: Port + string messageFrameSendRate = splitMessage[13]; + string messageMaxAhead = splitMessage[14]; + string messageGameProtocolVersion = splitMessage[15]; + string messageRandomSeed = splitMessage[16]; + string messageRemoveStartingLocations = splitMessage[17]; + string messagePlayerIdents = splitMessage[18]; if (isClosed) { @@ -1062,7 +1057,7 @@ private void ApplyGameDetailsFromTopic(string message) GameModeMap currentGameModeMap = GameModeMap; bool isMapOfficial = Conversions.BooleanFromString(mapOfficial, true); - GameModeMap = GameModeMaps.Find(gmm => gmm.GameMode.Name == gameMode && gmm.Map.SHA1 == mapSHA1); + GameModeMap = GameModeMaps.Find(gmm => gmm.Map.SHA1 == mapSHA1); if (GameModeMap == null) { ChangeMap(null); @@ -1081,7 +1076,7 @@ private void ApplyGameDetailsFromTopic(string message) } lastMapName = GameModeMap.Map?.Name ?? string.Empty; - lastGameMode = gameMode; + lastGameMode = GameModeMap.GameMode?.Name ?? string.Empty; lastMapSHA1 = mapSHA1; int frameSendRate = Conversions.IntFromString(messageFrameSendRate, FrameSendRate); @@ -1948,14 +1943,13 @@ private string BuildGameDetailsTopicString() // 9. LoadedGameId // 10. Map Is Official // 11. Map SHA1 - // 12. Game Mode Name - // 13. Tunnel address: Port - // 14. FrameSendRate - // 15. MaxAhead - // 16. ProtocolVersion - // 17. RandomSeed - // 18. RemoveStartingLocations - // 19. Idents + // 12. Tunnel address: Port + // 13. FrameSendRate + // 14. MaxAhead + // 15. ProtocolVersion + // 16. RandomSeed + // 17. RemoveStartingLocations + // 18. Idents ExtendedStringBuilder sb = new ExtendedStringBuilder("GD ", true, ';'); @@ -1972,7 +1966,6 @@ private string BuildGameDetailsTopicString() sb.Append(Convert.ToInt32(Map?.Official ?? false)); sb.Append(Map?.SHA1 ?? string.Empty); - sb.Append(GameMode?.Name ?? string.Empty); sb.Append(tunnelHandler?.CurrentTunnel == null ? string.Empty : tunnelHandler.CurrentTunnel.Address + ":" + tunnelHandler.CurrentTunnel.Port); sb.Append(FrameSendRate); sb.Append(MaxAhead); diff --git a/DXMainClient/Online/Channel.cs b/DXMainClient/Online/Channel.cs index deb3cdeb5..dbff7ea69 100644 --- a/DXMainClient/Online/Channel.cs +++ b/DXMainClient/Online/Channel.cs @@ -82,7 +82,6 @@ public string Topic get { return _topic; } set { - Logger.Log("SETTING TOPIC: " + value); if (_topic != value || _topic == null) // Only trigger the event if the topic actually changes { _topic = value; diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index ab9e363d8..e67d26dc0 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -281,7 +281,6 @@ public void OnChannelListReceived(List> channelList) public void OnWhoQueryComplete(string channelName, List> whoDataList) { - Logger.Log("OnWhoQueryComplete ** " + channelName + " -- " + whoDataList.Count); wm.AddCallback(new Action>>(DoWhoQueryComplete), channelName, whoDataList); } @@ -289,8 +288,6 @@ private void DoWhoQueryComplete(string channelName, List Date: Fri, 18 Oct 2024 11:28:00 +0100 Subject: [PATCH 31/38] Fixes to ui updating --- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 7bc55cd6c..286c81f0e 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -258,8 +258,6 @@ public void OnJoined() string.Format("MODE {0} +klnN {1} {2}", channel.ChannelName, channel.Password, playerLimit), QueuedMessageType.SYSTEM_MESSAGE, 50)); - - UpdateChannelTopic(); } else { @@ -270,6 +268,7 @@ public void OnJoined() TopBar.SwitchToPrimary(); WindowManager.SelectedControl = tbChatInput; + UpdateChannelTopic(); ResetAutoReadyCheckbox(); UpdatePing(); UpdateDiscordPresence(true); @@ -744,14 +743,29 @@ protected override void RequestReadyStatus() PlayerInfo pInfo = Players.Find(p => p.Name == ProgramConstants.PLAYERNAME); int readyState = 0; + Logger.Log("RequestReadyStatus called ** // " + pInfo.Name + (ProgramConstants.PLAYERNAME) + " // Ready: " + pInfo.Ready + " // AutoReady: " + pInfo.AutoReady + " // CheckboxAutoReadyChecked: " + chkAutoReady.Checked + " // P"); if (chkAutoReady.Checked) + { readyState = 2; + } else if (!pInfo.Ready) + { readyState = 1; + } + // Update our own client UI immediatly so its not waiting for the server to respond + pInfo.Ready = readyState > 0; + pInfo.AutoReady = readyState > 1; + btnLaunchGame.Text = pInfo.Ready ? BTN_LAUNCH_NOT_READY : BTN_LAUNCH_READY; + + // Copy the player data to the UI so it shows up + CopyPlayerDataToUI(); + UpdateLaunchGameButtonStatus(); + + // Send the ready status to the host, host will then broadcast it to all players + Logger.Log("SENDING READY STATE " + readyState + " TO HOST" + " FROM " + pInfo.Name); channel.SendCTCPMessage($"R {readyState}", QueuedMessageType.GAME_PLAYERS_READY_STATUS_MESSAGE, 5); - OnGameOptionChanged(); } protected override void AddNotice(string message, Color color) => channel.AddMessage(new ChatMessage(color, message)); @@ -761,7 +775,7 @@ protected override void RequestReadyStatus() /// private void HandleOptionsRequest(string playerName, int options) { - Logger.Log($"HandleOptionsRequest: Received options from {playerName}."); + Logger.Log($"HandleOptionsRequest ** called: Playername: {playerName} // Options: {options}."); if (!IsHost) return; @@ -828,6 +842,7 @@ private void HandleOptionsRequest(string playerName, int options) /// private void HandleReadyRequest(string playerName, int readyStatus) { + Logger.Log("HandleReadyRequest ** called: Playername: " + playerName + " // ReadyStatus: " + readyStatus + "."); if (!IsHost) return; @@ -883,7 +898,7 @@ private void LoadInitialPlayerNamesIntoUI(List players) /// private void ApplyPlayerOptionsFromCTCP(string sender, string message) { - Logger.Log($"ApplyPlayerOptionsFromCTCP ** " + message); + Logger.Log($"ApplyPlayerOptionsFromCTCP called ** Message: " + message + " // Sender: " + sender + " // Host: " + hostName); if (sender != hostName) return; @@ -977,7 +992,7 @@ private void ApplyPlayerOptionsFromCTCP(string sender, string message) } } - OnGameOptionChanged(); + CopyPlayerDataToUI(); } /// @@ -1564,6 +1579,8 @@ protected override void KickPlayer(int playerIndex) AddNotice(string.Format("Kicking {0} from the game...".L10N("Client:Main:KickPlayer"), pInfo.Name)); channel.SendKickMessage(pInfo.Name, 8); + + UpdateChannelTopic(); } protected override void BanPlayer(int playerIndex) @@ -1581,6 +1598,8 @@ protected override void BanPlayer(int playerIndex) channel.SendBanMessage(user.Hostname, 8); channel.SendKickMessage(user.Name, 8); } + + UpdateChannelTopic(); } protected override bool UpdateLaunchGameButtonStatus() @@ -1926,7 +1945,7 @@ private void ParseGameTopic(string topic) ApplyGameOptionsFromTopic(gameOptions.Substring(3)); // Remove the "GO " prefix ApplyPlayerExtraOptionsFromTopic(extraPlayerOptions.Substring(4)); // Remove the "PEO " prefix - OnGameOptionChanged(); + CopyPlayerDataToUI(); } private string BuildGameDetailsTopicString() From e73fb15e7d8ff6f8eb98560b4a4d501b183b0ce8 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 18 Oct 2024 11:34:09 +0100 Subject: [PATCH 32/38] Update channel topic when player extra options updated --- DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 286c81f0e..a55e19d09 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -876,11 +876,7 @@ protected override void PlayerExtraOptions_OptionsChanged(object sender, EventAr protected override void BroadcastPlayerExtraOptions() { - if (!IsHost) - return; - - var playerExtraOptions = GetPlayerExtraOptions(); - channel.SendCTCPMessage(playerExtraOptions.ToCncnetMessage(), QueuedMessageType.GAME_PLAYERS_EXTRA_MESSAGE, 11, true); + UpdateChannelTopic(); } /// From e21bb2f1e3b9ed6b5eba2ee05d57ec0f9dad67c8 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 18 Oct 2024 11:44:32 +0100 Subject: [PATCH 33/38] Remove our name if its in already in the topic --- DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index a55e19d09..0f152cdeb 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -885,7 +885,8 @@ protected override void BroadcastPlayerExtraOptions() /// private void LoadInitialPlayerNamesIntoUI(List players) { - Players = players; + // If we leave a game, join again, the game topic may still have our name in. So we need to remove it. + players.FindAll(p => p.Name != ProgramConstants.PLAYERNAME).ForEach(p => Players.Add(p)); CopyPlayerDataToUI(); } From b2e2882f76323e5c04158d3202ddbfbd853160b4 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 18 Oct 2024 11:46:35 +0100 Subject: [PATCH 34/38] No idea where this came from --- CnCNetGame.sln | 1393 ------------------------------------------------ 1 file changed, 1393 deletions(-) delete mode 100644 CnCNetGame.sln diff --git a/CnCNetGame.sln b/CnCNetGame.sln deleted file mode 100644 index 348c78541..000000000 --- a/CnCNetGame.sln +++ /dev/null @@ -1,1393 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.2.32408.312 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DXMainClient", "DXMainClient\DXMainClient.csproj", "{97458C1E-2E6C-4C5C-93C7-16A6712802E9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientCore", "ClientCore\ClientCore.csproj", "{DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientGUI", "ClientGUI\ClientGUI.csproj", "{4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DTAConfig", "DTAConfig\DTAConfig.csproj", "{D517317D-8EA8-4225-AF9E-5385D8A7F047}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0F60E4A3-55C8-4C3F-BFC0-27C597433E8A}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - .gitattributes = .gitattributes - .gitignore = .gitignore - Directory.Build.props = Directory.Build.props - Directory.Build.targets = Directory.Build.targets - Directory.Packages.props = Directory.Packages.props - GitVersion.yml = GitVersion.yml - global.json = global.json - NuGet.config = NuGet.config - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TranslationNotifierGenerator", "TranslationNotifierGenerator\TranslationNotifierGenerator.csproj", "{E0412313-0A6F-400B-9EC8-B162DA8AAA0E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SecondStageUpdater", "SecondStageUpdater\SecondStageUpdater.csproj", "{039DE2BC-4691-4EDA-84D1-59A1D98AC836}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientUpdater", "ClientUpdater\ClientUpdater.csproj", "{551D080B-5624-4793-AC31-69D77C62F6B1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - AresUniversalGLDebug|Any CPU = AresUniversalGLDebug|Any CPU - AresUniversalGLDebug|ARM64 = AresUniversalGLDebug|ARM64 - AresUniversalGLDebug|x64 = AresUniversalGLDebug|x64 - AresUniversalGLDebug|x86 = AresUniversalGLDebug|x86 - AresUniversalGLRelease|Any CPU = AresUniversalGLRelease|Any CPU - AresUniversalGLRelease|ARM64 = AresUniversalGLRelease|ARM64 - AresUniversalGLRelease|x64 = AresUniversalGLRelease|x64 - AresUniversalGLRelease|x86 = AresUniversalGLRelease|x86 - AresWindowsDXDebug|Any CPU = AresWindowsDXDebug|Any CPU - AresWindowsDXDebug|ARM64 = AresWindowsDXDebug|ARM64 - AresWindowsDXDebug|x64 = AresWindowsDXDebug|x64 - AresWindowsDXDebug|x86 = AresWindowsDXDebug|x86 - AresWindowsDXRelease|Any CPU = AresWindowsDXRelease|Any CPU - AresWindowsDXRelease|ARM64 = AresWindowsDXRelease|ARM64 - AresWindowsDXRelease|x64 = AresWindowsDXRelease|x64 - AresWindowsDXRelease|x86 = AresWindowsDXRelease|x86 - AresWindowsGLDebug|Any CPU = AresWindowsGLDebug|Any CPU - AresWindowsGLDebug|ARM64 = AresWindowsGLDebug|ARM64 - AresWindowsGLDebug|x64 = AresWindowsGLDebug|x64 - AresWindowsGLDebug|x86 = AresWindowsGLDebug|x86 - AresWindowsGLRelease|Any CPU = AresWindowsGLRelease|Any CPU - AresWindowsGLRelease|ARM64 = AresWindowsGLRelease|ARM64 - AresWindowsGLRelease|x64 = AresWindowsGLRelease|x64 - AresWindowsGLRelease|x86 = AresWindowsGLRelease|x86 - AresWindowsXNADebug|Any CPU = AresWindowsXNADebug|Any CPU - AresWindowsXNADebug|ARM64 = AresWindowsXNADebug|ARM64 - AresWindowsXNADebug|x64 = AresWindowsXNADebug|x64 - AresWindowsXNADebug|x86 = AresWindowsXNADebug|x86 - AresWindowsXNARelease|Any CPU = AresWindowsXNARelease|Any CPU - AresWindowsXNARelease|ARM64 = AresWindowsXNARelease|ARM64 - AresWindowsXNARelease|x64 = AresWindowsXNARelease|x64 - AresWindowsXNARelease|x86 = AresWindowsXNARelease|x86 - TSUniversalGLDebug|Any CPU = TSUniversalGLDebug|Any CPU - TSUniversalGLDebug|ARM64 = TSUniversalGLDebug|ARM64 - TSUniversalGLDebug|x64 = TSUniversalGLDebug|x64 - TSUniversalGLDebug|x86 = TSUniversalGLDebug|x86 - TSUniversalGLRelease|Any CPU = TSUniversalGLRelease|Any CPU - TSUniversalGLRelease|ARM64 = TSUniversalGLRelease|ARM64 - TSUniversalGLRelease|x64 = TSUniversalGLRelease|x64 - TSUniversalGLRelease|x86 = TSUniversalGLRelease|x86 - TSWindowsDXDebug|Any CPU = TSWindowsDXDebug|Any CPU - TSWindowsDXDebug|ARM64 = TSWindowsDXDebug|ARM64 - TSWindowsDXDebug|x64 = TSWindowsDXDebug|x64 - TSWindowsDXDebug|x86 = TSWindowsDXDebug|x86 - TSWindowsDXRelease|Any CPU = TSWindowsDXRelease|Any CPU - TSWindowsDXRelease|ARM64 = TSWindowsDXRelease|ARM64 - TSWindowsDXRelease|x64 = TSWindowsDXRelease|x64 - TSWindowsDXRelease|x86 = TSWindowsDXRelease|x86 - TSWindowsGLDebug|Any CPU = TSWindowsGLDebug|Any CPU - TSWindowsGLDebug|ARM64 = TSWindowsGLDebug|ARM64 - TSWindowsGLDebug|x64 = TSWindowsGLDebug|x64 - TSWindowsGLDebug|x86 = TSWindowsGLDebug|x86 - TSWindowsGLRelease|Any CPU = TSWindowsGLRelease|Any CPU - TSWindowsGLRelease|ARM64 = TSWindowsGLRelease|ARM64 - TSWindowsGLRelease|x64 = TSWindowsGLRelease|x64 - TSWindowsGLRelease|x86 = TSWindowsGLRelease|x86 - TSWindowsXNADebug|Any CPU = TSWindowsXNADebug|Any CPU - TSWindowsXNADebug|ARM64 = TSWindowsXNADebug|ARM64 - TSWindowsXNADebug|x64 = TSWindowsXNADebug|x64 - TSWindowsXNADebug|x86 = TSWindowsXNADebug|x86 - TSWindowsXNARelease|Any CPU = TSWindowsXNARelease|Any CPU - TSWindowsXNARelease|ARM64 = TSWindowsXNARelease|ARM64 - TSWindowsXNARelease|x64 = TSWindowsXNARelease|x64 - TSWindowsXNARelease|x86 = TSWindowsXNARelease|x86 - YRUniversalGLDebug|Any CPU = YRUniversalGLDebug|Any CPU - YRUniversalGLDebug|ARM64 = YRUniversalGLDebug|ARM64 - YRUniversalGLDebug|x64 = YRUniversalGLDebug|x64 - YRUniversalGLDebug|x86 = YRUniversalGLDebug|x86 - YRUniversalGLRelease|Any CPU = YRUniversalGLRelease|Any CPU - YRUniversalGLRelease|ARM64 = YRUniversalGLRelease|ARM64 - YRUniversalGLRelease|x64 = YRUniversalGLRelease|x64 - YRUniversalGLRelease|x86 = YRUniversalGLRelease|x86 - YRWindowsDXDebug|Any CPU = YRWindowsDXDebug|Any CPU - YRWindowsDXDebug|ARM64 = YRWindowsDXDebug|ARM64 - YRWindowsDXDebug|x64 = YRWindowsDXDebug|x64 - YRWindowsDXDebug|x86 = YRWindowsDXDebug|x86 - YRWindowsDXRelease|Any CPU = YRWindowsDXRelease|Any CPU - YRWindowsDXRelease|ARM64 = YRWindowsDXRelease|ARM64 - YRWindowsDXRelease|x64 = YRWindowsDXRelease|x64 - YRWindowsDXRelease|x86 = YRWindowsDXRelease|x86 - YRWindowsGLDebug|Any CPU = YRWindowsGLDebug|Any CPU - YRWindowsGLDebug|ARM64 = YRWindowsGLDebug|ARM64 - YRWindowsGLDebug|x64 = YRWindowsGLDebug|x64 - YRWindowsGLDebug|x86 = YRWindowsGLDebug|x86 - YRWindowsGLRelease|Any CPU = YRWindowsGLRelease|Any CPU - YRWindowsGLRelease|ARM64 = YRWindowsGLRelease|ARM64 - YRWindowsGLRelease|x64 = YRWindowsGLRelease|x64 - YRWindowsGLRelease|x86 = YRWindowsGLRelease|x86 - YRWindowsXNADebug|Any CPU = YRWindowsXNADebug|Any CPU - YRWindowsXNADebug|ARM64 = YRWindowsXNADebug|ARM64 - YRWindowsXNADebug|x64 = YRWindowsXNADebug|x64 - YRWindowsXNADebug|x86 = YRWindowsXNADebug|x86 - YRWindowsXNARelease|Any CPU = YRWindowsXNARelease|Any CPU - YRWindowsXNARelease|ARM64 = YRWindowsXNARelease|ARM64 - YRWindowsXNARelease|x64 = YRWindowsXNARelease|x64 - YRWindowsXNARelease|x86 = YRWindowsXNARelease|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 - {97458C1E-2E6C-4C5C-93C7-16A6712802E9}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 - {DAA331A7-FDAC-44FD-98B5-2DC5025F48C3}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 - {4C26AD04-FF2E-4465-9F40-DEB9DDC2C1D6}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 - {D517317D-8EA8-4225-AF9E-5385D8A7F047}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|ARM64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|x64 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|x86 - {E0412313-0A6F-400B-9EC8-B162DA8AAA0E}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|x86 - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|Any CPU.Build.0 = AresWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|ARM64.Build.0 = AresWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|x64.Build.0 = AresWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|Any CPU.Build.0 = AresWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|ARM64.Build.0 = AresWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|x64.Build.0 = AresWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|Any CPU.Build.0 = TSWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|ARM64.Build.0 = TSWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|x64.Build.0 = TSWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|Any CPU.Build.0 = TSWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|ARM64.Build.0 = TSWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|x64.Build.0 = TSWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|Any CPU.Build.0 = YRWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|ARM64.Build.0 = YRWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|x64.Build.0 = YRWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|Any CPU.Build.0 = YRWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|ARM64.Build.0 = YRWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|x64.Build.0 = YRWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|Any CPU - {039DE2BC-4691-4EDA-84D1-59A1D98AC836}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|Any CPU.ActiveCfg = AresUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|Any CPU.Build.0 = AresUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|ARM64.ActiveCfg = AresUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|ARM64.Build.0 = AresUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|x64.ActiveCfg = AresUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|x64.Build.0 = AresUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|x86.ActiveCfg = AresUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLDebug|x86.Build.0 = AresUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|Any CPU.ActiveCfg = AresUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|Any CPU.Build.0 = AresUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|ARM64.ActiveCfg = AresUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|ARM64.Build.0 = AresUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|x64.ActiveCfg = AresUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|x64.Build.0 = AresUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|x86.ActiveCfg = AresUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresUniversalGLRelease|x86.Build.0 = AresUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|Any CPU.ActiveCfg = AresWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|Any CPU.Build.0 = AresWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|ARM64.ActiveCfg = AresWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|ARM64.Build.0 = AresWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|x64.ActiveCfg = AresWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|x64.Build.0 = AresWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|x86.ActiveCfg = AresWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXDebug|x86.Build.0 = AresWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|Any CPU.ActiveCfg = AresWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|Any CPU.Build.0 = AresWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|ARM64.ActiveCfg = AresWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|ARM64.Build.0 = AresWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|x64.ActiveCfg = AresWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|x64.Build.0 = AresWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|x86.ActiveCfg = AresWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsDXRelease|x86.Build.0 = AresWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|Any CPU.ActiveCfg = AresWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|Any CPU.Build.0 = AresWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|ARM64.ActiveCfg = AresWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|ARM64.Build.0 = AresWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|x64.ActiveCfg = AresWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|x64.Build.0 = AresWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|x86.ActiveCfg = AresWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLDebug|x86.Build.0 = AresWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|Any CPU.ActiveCfg = AresWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|Any CPU.Build.0 = AresWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|ARM64.ActiveCfg = AresWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|ARM64.Build.0 = AresWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|x64.ActiveCfg = AresWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|x64.Build.0 = AresWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|x86.ActiveCfg = AresWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsGLRelease|x86.Build.0 = AresWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|Any CPU.ActiveCfg = AresWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|Any CPU.Build.0 = AresWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|ARM64.ActiveCfg = AresWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|ARM64.Build.0 = AresWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|x64.ActiveCfg = AresWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|x64.Build.0 = AresWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|x86.ActiveCfg = AresWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNADebug|x86.Build.0 = AresWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|Any CPU.ActiveCfg = AresWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|Any CPU.Build.0 = AresWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|ARM64.ActiveCfg = AresWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|ARM64.Build.0 = AresWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|x64.ActiveCfg = AresWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|x64.Build.0 = AresWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|x86.ActiveCfg = AresWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.AresWindowsXNARelease|x86.Build.0 = AresWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|Any CPU.ActiveCfg = TSUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|Any CPU.Build.0 = TSUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|ARM64.ActiveCfg = TSUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|ARM64.Build.0 = TSUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|x64.ActiveCfg = TSUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|x64.Build.0 = TSUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|x86.ActiveCfg = TSUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLDebug|x86.Build.0 = TSUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|Any CPU.ActiveCfg = TSUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|Any CPU.Build.0 = TSUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|ARM64.ActiveCfg = TSUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|ARM64.Build.0 = TSUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|x64.ActiveCfg = TSUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|x64.Build.0 = TSUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|x86.ActiveCfg = TSUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSUniversalGLRelease|x86.Build.0 = TSUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|Any CPU.ActiveCfg = TSWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|Any CPU.Build.0 = TSWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|ARM64.ActiveCfg = TSWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|ARM64.Build.0 = TSWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|x64.ActiveCfg = TSWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|x64.Build.0 = TSWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|x86.ActiveCfg = TSWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXDebug|x86.Build.0 = TSWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|Any CPU.ActiveCfg = TSWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|Any CPU.Build.0 = TSWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|ARM64.ActiveCfg = TSWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|ARM64.Build.0 = TSWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|x64.ActiveCfg = TSWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|x64.Build.0 = TSWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|x86.ActiveCfg = TSWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsDXRelease|x86.Build.0 = TSWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|Any CPU.ActiveCfg = TSWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|Any CPU.Build.0 = TSWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|ARM64.ActiveCfg = TSWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|ARM64.Build.0 = TSWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|x64.ActiveCfg = TSWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|x64.Build.0 = TSWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|x86.ActiveCfg = TSWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLDebug|x86.Build.0 = TSWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|Any CPU.ActiveCfg = TSWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|Any CPU.Build.0 = TSWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|ARM64.ActiveCfg = TSWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|ARM64.Build.0 = TSWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|x64.ActiveCfg = TSWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|x64.Build.0 = TSWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|x86.ActiveCfg = TSWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsGLRelease|x86.Build.0 = TSWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|Any CPU.ActiveCfg = TSWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|Any CPU.Build.0 = TSWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|ARM64.ActiveCfg = TSWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|ARM64.Build.0 = TSWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|x64.ActiveCfg = TSWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|x64.Build.0 = TSWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|x86.ActiveCfg = TSWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNADebug|x86.Build.0 = TSWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|Any CPU.ActiveCfg = TSWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|Any CPU.Build.0 = TSWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|ARM64.ActiveCfg = TSWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|ARM64.Build.0 = TSWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|x64.ActiveCfg = TSWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|x64.Build.0 = TSWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|x86.ActiveCfg = TSWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.TSWindowsXNARelease|x86.Build.0 = TSWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|Any CPU.ActiveCfg = YRUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|Any CPU.Build.0 = YRUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|ARM64.ActiveCfg = YRUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|ARM64.Build.0 = YRUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|x64.ActiveCfg = YRUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|x64.Build.0 = YRUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|x86.ActiveCfg = YRUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLDebug|x86.Build.0 = YRUniversalGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|Any CPU.ActiveCfg = YRUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|Any CPU.Build.0 = YRUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|ARM64.ActiveCfg = YRUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|ARM64.Build.0 = YRUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|x64.ActiveCfg = YRUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|x64.Build.0 = YRUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|x86.ActiveCfg = YRUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRUniversalGLRelease|x86.Build.0 = YRUniversalGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|Any CPU.ActiveCfg = YRWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|Any CPU.Build.0 = YRWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|ARM64.ActiveCfg = YRWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|ARM64.Build.0 = YRWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|x64.ActiveCfg = YRWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|x64.Build.0 = YRWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|x86.ActiveCfg = YRWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXDebug|x86.Build.0 = YRWindowsDXDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|Any CPU.ActiveCfg = YRWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|Any CPU.Build.0 = YRWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|ARM64.ActiveCfg = YRWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|ARM64.Build.0 = YRWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|x64.ActiveCfg = YRWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|x64.Build.0 = YRWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|x86.ActiveCfg = YRWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsDXRelease|x86.Build.0 = YRWindowsDXRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|Any CPU.ActiveCfg = YRWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|Any CPU.Build.0 = YRWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|ARM64.ActiveCfg = YRWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|ARM64.Build.0 = YRWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|x64.ActiveCfg = YRWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|x64.Build.0 = YRWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|x86.ActiveCfg = YRWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLDebug|x86.Build.0 = YRWindowsGLDebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|Any CPU.ActiveCfg = YRWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|Any CPU.Build.0 = YRWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|ARM64.ActiveCfg = YRWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|ARM64.Build.0 = YRWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|x64.ActiveCfg = YRWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|x64.Build.0 = YRWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|x86.ActiveCfg = YRWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsGLRelease|x86.Build.0 = YRWindowsGLRelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|Any CPU.ActiveCfg = YRWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|Any CPU.Build.0 = YRWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|ARM64.ActiveCfg = YRWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|ARM64.Build.0 = YRWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|x64.ActiveCfg = YRWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|x64.Build.0 = YRWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|x86.ActiveCfg = YRWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNADebug|x86.Build.0 = YRWindowsXNADebug|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|Any CPU.ActiveCfg = YRWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|Any CPU.Build.0 = YRWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|ARM64.ActiveCfg = YRWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|ARM64.Build.0 = YRWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|x64.ActiveCfg = YRWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|x64.Build.0 = YRWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|x86.ActiveCfg = YRWindowsXNARelease|Any CPU - {551D080B-5624-4793-AC31-69D77C62F6B1}.YRWindowsXNARelease|x86.Build.0 = YRWindowsXNARelease|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {524B40FE-44F2-419A-B6D3-F9F0F813101F} - EndGlobalSection -EndGlobal From a5b23691f639e0b619da9bd72cc20af31b159f3a Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 18 Oct 2024 11:52:29 +0100 Subject: [PATCH 35/38] Pipeline build error fix --- DXMainClient/Online/CnCNetManager.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/DXMainClient/Online/CnCNetManager.cs b/DXMainClient/Online/CnCNetManager.cs index e67d26dc0..641314286 100644 --- a/DXMainClient/Online/CnCNetManager.cs +++ b/DXMainClient/Online/CnCNetManager.cs @@ -9,9 +9,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using Microsoft.Extensions.Hosting; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; -using SharpDX.XInput; namespace DTAClient.Online { From 4eaa3a274962419c8bf90901cb9ec13c152231de Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 18 Oct 2024 12:07:54 +0100 Subject: [PATCH 36/38] Tidy up of logs --- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 0f152cdeb..7970ef51a 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -378,8 +378,6 @@ public override void Clear() ResetDiscordPresence(); cachedGameTopic = string.Empty; - - Logger.Log("CnCNetGameLobby ** Clear Complete"); } private void Channel_TopicChanged(object sender, MessageEventArgs e) @@ -550,34 +548,21 @@ private void Channel_UserAdded(object sender, ChannelUserEventArgs e) #if WINFORMS WindowManager.FlashWindow(); #endif - if (IsHost) - { - Logger.Log("Channel_UserAdded ** Called BroadcastPlayerOptions"); BroadcastPlayerOptions(); - } if (!IsHost) - { - Logger.Log("Removed CopyPlayerDataToUI from Channel_UserAdded"); - //CopyPlayerDataToUI(); return; - } if (e.User.IRCUser.Name != ProgramConstants.PLAYERNAME) { // Changing the map applies forced settings (co-op sides etc.) to the // new player, and it also sends an options broadcast message - //CopyPlayerDataToUI(); This is also called by ChangeMap() - Logger.Log("Channel_UserAdded ** Called ChangeMap"); ChangeMap(GameModeMap); - //BroadcastPlayerOptions(); UpdateDiscordPresence(); - } else { - Logger.Log("Channel_UserAdded ** Called CopyPlayerDataToUI"); Players[0].Ready = true; CopyPlayerDataToUI(); } @@ -721,8 +706,6 @@ protected override void RequestPlayerOptions(int side, int color, int start, int int intValue = BitConverter.ToInt32(value, 0); - Logger.Log($"RequestPlayerOptions ** OR: {intValue}"); - channel.SendCTCPMessage( string.Format("OR {0}", intValue), QueuedMessageType.GAME_SETTINGS_MESSAGE, 6); @@ -743,7 +726,6 @@ protected override void RequestReadyStatus() PlayerInfo pInfo = Players.Find(p => p.Name == ProgramConstants.PLAYERNAME); int readyState = 0; - Logger.Log("RequestReadyStatus called ** // " + pInfo.Name + (ProgramConstants.PLAYERNAME) + " // Ready: " + pInfo.Ready + " // AutoReady: " + pInfo.AutoReady + " // CheckboxAutoReadyChecked: " + chkAutoReady.Checked + " // P"); if (chkAutoReady.Checked) { @@ -764,7 +746,6 @@ protected override void RequestReadyStatus() UpdateLaunchGameButtonStatus(); // Send the ready status to the host, host will then broadcast it to all players - Logger.Log("SENDING READY STATE " + readyState + " TO HOST" + " FROM " + pInfo.Name); channel.SendCTCPMessage($"R {readyState}", QueuedMessageType.GAME_PLAYERS_READY_STATUS_MESSAGE, 5); } @@ -775,8 +756,6 @@ protected override void RequestReadyStatus() /// private void HandleOptionsRequest(string playerName, int options) { - Logger.Log($"HandleOptionsRequest ** called: Playername: {playerName} // Options: {options}."); - if (!IsHost) return; @@ -842,7 +821,6 @@ private void HandleOptionsRequest(string playerName, int options) /// private void HandleReadyRequest(string playerName, int readyStatus) { - Logger.Log("HandleReadyRequest ** called: Playername: " + playerName + " // ReadyStatus: " + readyStatus + "."); if (!IsHost) return; @@ -863,7 +841,6 @@ private void HandleReadyRequest(string playerName, int readyStatus) /// protected override void BroadcastPlayerOptions() { - Logger.Log($"BroadcastPlayerOptions ** Broadcasting Player Options"); channel.SendCTCPMessage(BuildPlayerOptionsCTCPString(), QueuedMessageType.GAME_PLAYERS_MESSAGE, 11); } @@ -895,7 +872,6 @@ private void LoadInitialPlayerNamesIntoUI(List players) /// private void ApplyPlayerOptionsFromCTCP(string sender, string message) { - Logger.Log($"ApplyPlayerOptionsFromCTCP called ** Message: " + message + " // Sender: " + sender + " // Host: " + hostName); if (sender != hostName) return; From 61d915cf0739fdfa2e12cc3d34cca9bd22b7ae73 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Fri, 18 Oct 2024 12:14:56 +0100 Subject: [PATCH 37/38] Tidy up --- .../DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs | 18 ++++++++---------- .../GameLobby/MultiplayerGameLobby.cs | 2 -- DXMainClient/Program.cs | 2 +- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs index 59e15888e..1ba8d0f14 100644 --- a/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/CnCNet/CnCNetLobby.cs @@ -632,8 +632,8 @@ private void OnParseGameTopic(string topic, string channelName) private void ApplyGameDetails(string gameDetailsMessage, string channelName) { - //try - //{ + try + { string[] splitGameDettailsMessage = gameDetailsMessage.Split(new char[] { ';' }); if (splitGameDettailsMessage.Length < 19) @@ -787,12 +787,12 @@ private void ApplyGameDetails(string gameDetailsMessage, string channelName) SortAndRefreshHostedGames(); - //} - //catch (Exception ex) - //{ - // Logger.Log("Error applying game details: " + ex.Message); - // Logger.Log("Error applying game details: " + ex.Message); - //} + } + catch (Exception ex) + { + Logger.Log("Error applying game details: " + ex.Message); + Logger.Log("Error applying game details: " + ex.Message); + } } private void ConnectionManager_ChannelListReceived(object sender, ChannelTopicEventArgs e) @@ -1019,8 +1019,6 @@ private string GetJoinGameError(HostedCnCNetGame hg) if (hg.IsLoadedGame && !hg.Players.Any(p => p.Name == ProgramConstants.PLAYERNAME)) return "You do not exist in the saved game!".L10N("Client:Main:NotInSavedGame"); - Logger.Log($"{hg.ChannelName}"); - return GetJoinGameErrorBase(); } diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs index 5b32dbd8e..65f5cfb92 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/MultiplayerGameLobby.cs @@ -951,8 +951,6 @@ protected override void OnGameOptionChanged() { base.OnGameOptionChanged(); - Logger.Log("MultiplayerGameLobby: Game option changed"); - ClearReadyStatuses(); CopyPlayerDataToUI(); } diff --git a/DXMainClient/Program.cs b/DXMainClient/Program.cs index c02a3f619..2b2ccd668 100644 --- a/DXMainClient/Program.cs +++ b/DXMainClient/Program.cs @@ -99,7 +99,7 @@ static void Main(string[] args) InitializeApplicationConfiguration(); bool noAudio = false; - bool multipleInstanceMode = true; + bool multipleInstanceMode = false; List unknownStartupParams = new List(); for (int arg = 0; arg < args.Length; arg++) From fe09dad4e8b66c3caedfdac75460e199b87a3208 Mon Sep 17 00:00:00 2001 From: Grant Bartlett Date: Sat, 19 Oct 2024 11:03:37 +0100 Subject: [PATCH 38/38] Fix on topic change broadcasting player options --- .../Multiplayer/GameLobby/CnCNetGameLobby.cs | 31 +++++-------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs index 7970ef51a..223f61157 100644 --- a/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs +++ b/DXMainClient/DXGUI/Multiplayer/GameLobby/CnCNetGameLobby.cs @@ -382,36 +382,20 @@ public override void Clear() private void Channel_TopicChanged(object sender, MessageEventArgs e) { - if (closed && IsHost) - { - OnHostLeftGame(); - } - else - { - ParseGameTopic(e.Message); - } - } - - private void OnHostLeftGame() - { - Clear(); - channel.Leave(); + ParseGameTopic(e.Message); } public void LeaveGameLobby() { if (IsHost) { - // We need to succesfully change the topic first before we can leave the channel - btnLeaveGame.Enabled = false; closed = true; - UpdateChannelTopic(); - } - else - { - Clear(); - channel.Leave(); + Locked = true; // So no-one can join our potentially ghosted game + UpdateChannelTopic(); // Mark it as closed } + + Clear(); + channel.Leave(); } @@ -739,7 +723,7 @@ protected override void RequestReadyStatus() // Update our own client UI immediatly so its not waiting for the server to respond pInfo.Ready = readyState > 0; pInfo.AutoReady = readyState > 1; - btnLaunchGame.Text = pInfo.Ready ? BTN_LAUNCH_NOT_READY : BTN_LAUNCH_READY; + //btnLaunchGame.Text = pInfo.Ready ? BTN_LAUNCH_NOT_READY : BTN_LAUNCH_READY; // Copy the player data to the UI so it shows up CopyPlayerDataToUI(); @@ -1918,6 +1902,7 @@ private void ParseGameTopic(string topic) ApplyGameOptionsFromTopic(gameOptions.Substring(3)); // Remove the "GO " prefix ApplyPlayerExtraOptionsFromTopic(extraPlayerOptions.Substring(4)); // Remove the "PEO " prefix + BroadcastPlayerOptions(); CopyPlayerDataToUI(); }