private void HandleState(MultiplayerGame game, MultiplayerGameState multiplayerGameState, Action action)
        {
            var subscription = game.GameStateObservable.Where(state => state == multiplayerGameState)
                               .Subscribe(state => action());

            _gameSubscriptions.AddResourceRequiringCleanup(subscription);
        }
Beispiel #2
0
        /// <summary>
        /// Despawns the current platform when entering a lobby and changing back when leaving
        /// </summary>
        private void OnMultiplayerGameStateModelDidChange(MultiplayerGameState multiplayerGameState)
        {
            CustomPlatform platform;

            switch (multiplayerGameState)
            {
            case MultiplayerGameState.None:
                _assetLoader.ToggleHeart(_config.ShowHeart);
                platform = _config.ShowInMenu
                        ? _config.ShufflePlatforms
                            ? RandomPlatform
                            : _platformManager.SingleplayerPlatform
                        : _platformManager.DefaultPlatform;
                break;

            case MultiplayerGameState.Lobby when _prevGameState != MultiplayerGameState.Game:
                _assetLoader.ToggleHeart(false);
                platform = _platformManager.DefaultPlatform;
                break;

            default:
                return;
            }

            _prevGameState = multiplayerGameState;
            _ = ChangeToPlatformAsync(platform);
        }
        public MultiplayerBase(string address, int port, PGGI.PGGIProvider provider)
        {
            ISpriteBatchService spriteService = Atom.Shared.Globals.Engine.GetService<ISpriteBatchService>();
            IInputService inputService = Atom.Shared.Globals.Engine.GetService<IInputService>();

            contract = inputService.CreateContract();
            contract.Enabled = true;
            contract.SubscribedTouchEvents = TouchStates.OnDoubleTap | TouchStates.OnDrag | TouchStates.OnTap;
            contract.TouchEventHandler += contract_TouchEventHandler;

            spriteBatch = spriteService.SpriteBatch;

            SelectionState = SelectionState.Selection;
            GameState = MultiplayerGameState.Connecting;
            GameCounter = 0;
            client = new Client();
            client.OnConnection += new EventHandler<ConnectionArgs>(ClientOnConnection);
            client.OnPacketRecieved += new EventHandler<PacketRecievedArgs>(ClientOnPacket);
            Packet ConnectionPacket = new Packet();
            ConnectionPacket.Write(provider.PGGI);
            ConnectionPacket.Write(provider.Token);
            client.Connect(new System.Net.DnsEndPoint(address, port), ConnectionPacket);
            Syncing = false;
            FramesToSpin = int.MaxValue;
            Manager = new MultiplayerGameManager();
            Content = new ContentManager(Atom.Shared.Globals.Engine, "Content");

            Fleet = Content.Load<Texture2D>("Graphics/Fleets/1");
        }
Beispiel #4
0
        /// <summary>
        /// Despawns the current platform when entering a lobby and changing back when leaving
        /// </summary>
        // ReSharper disable once AsyncVoidMethod
        private async void OnMultiplayerGameStateModelDidChange(MultiplayerGameState multiplayerGameState)
        {
            CustomPlatform?platform = multiplayerGameState switch
            {
                MultiplayerGameState.None when _prevGameState == MultiplayerGameState.Lobby => _platformManager.MenuPlatform,
                          MultiplayerGameState.Lobby when _prevGameState == MultiplayerGameState.None => _platformManager.DefaultPlatform,
                          _ => null
            };

            _prevGameState = multiplayerGameState;
            if (platform is null)
            {
                return;
            }
            await ChangeToPlatformAsync(platform);
        }
Beispiel #5
0
        public void Clear()
        {
            _state = MultiplayerGameState.InActive;

            /*int i;
             *
             * gameState = INACTIVE;
             * nextState = INACTIVE;
             * pingUpdateTime = 0;
             * vote = VOTE_NONE;
             * voteTimeOut = 0;
             * voteExecTime = 0;
             * nextStateSwitch = 0;
             * matchStartedTime = 0;
             * currentTourneyPlayer[0] = -1;
             * currentTourneyPlayer[1] = -1;
             * one = two = three = false;
             *
             * lastWinner = -1;
             * currentMenu = 0;
             * bCurrentMenuMsg = false;
             * nextMenu = 0;
             * pureReady = false;
             * scoreBoard = NULL;
             * spectateGui = NULL;
             * guiChat = NULL;
             * mainGui = NULL;
             * msgmodeGui = NULL;
             * if(mapList)
             * {
             *      uiManager->FreeListGUI(mapList);
             *      mapList = NULL;
             * }
             * fragLimitTimeout = 0;
             * memset(&switchThrottle, 0, sizeof(switchThrottle));
             * voiceChatThrottle = 0;*/

            for (int i = 0; i < ChatNotifyCount; i++)
            {
                _chatHistory[i].Line = string.Empty;
            }

            /*warmupText.Clear();
             * voteValue.Clear();
             * voteString.Clear();
             * startFragLimit = -1;*/
        }
Beispiel #6
0
		public void Clear()
		{
			_state = MultiplayerGameState.InActive;
			/*int i;

			gameState = INACTIVE;
			nextState = INACTIVE;
			pingUpdateTime = 0;
			vote = VOTE_NONE;
			voteTimeOut = 0;
			voteExecTime = 0;
			nextStateSwitch = 0;
			matchStartedTime = 0;
			currentTourneyPlayer[0] = -1;
			currentTourneyPlayer[1] = -1;
			one = two = three = false;
			
			lastWinner = -1;
			currentMenu = 0;
			bCurrentMenuMsg = false;
			nextMenu = 0;
			pureReady = false;
			scoreBoard = NULL;
			spectateGui = NULL;
			guiChat = NULL;
			mainGui = NULL;
			msgmodeGui = NULL;
			if(mapList)
			{
				uiManager->FreeListGUI(mapList);
				mapList = NULL;
			}
			fragLimitTimeout = 0;
			memset(&switchThrottle, 0, sizeof(switchThrottle));
			voiceChatThrottle = 0;*/

			for(int i = 0; i < ChatNotifyCount; i++)
			{
				_chatHistory[i].Line = string.Empty;
			}

			/*warmupText.Clear();
			voteValue.Clear();
			voteString.Clear();
			startFragLimit = -1;*/
		}
 public new void HandleGameStateDidChange(MultiplayerGameState newGameState)
 {
     base.HandleGameStateDidChange(newGameState);
     MPState.CurrentGameState = newGameState;
     MPEvents.RaiseGameStateChanged(_lobbyGameState, newGameState);
 }
Beispiel #8
0
 internal static void RaiseGameStateChanged(object sender, MultiplayerGameState state)
 => GameStateChanged.RaiseEventSafe(sender, state, nameof(GameStateChanged));
Beispiel #9
0
        // uploads the game state and adds it to the data base
        private void UploadGameState(bool ForceUpload = false)
        {
            if (!MultiplayerMatch) return; // upload only in multiplayer matches
            if (!ForceUpload && !AllowedToOperate()) return; // multiplayer: aborts current action if the user is not allowed to move

            GameState++; // increment game state counter
            GameScreen.UpdateMatchState(GameState);

            Game GameCopy = ObjectTools.DeepCopy<Game>(this.Game);

            // upload new game version
            new Thread(() =>
            {
                // needs to be in a separate thread to keep the ui responsive
                // thread settings
                Thread.CurrentThread.IsBackground = true;
                Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

                MultiplayerGameState MultiplayerGameState = new MultiplayerGameState()
                {
                    // TODO: transmit only those object which changed since the last game state has been received
                    BuildingOwners = GameCopy.Map.GetBuildingsOwnersList(),
                    Units = GameCopy.Units,
                    Turn = GameCopy.Turn,
                    Crusaders = GameCopy.Crusaders,
                    Saracens = GameCopy.Saracens,
                    Rounds = GameCopy.Rounds,
                    Over = GameCopy.Over
                };

                // save data to file
                Data.SaveMultiplayerGameState(
                    MatchId.ToString() + "_" + GameState.ToString(),
                    MultiplayerGameState);

                // upload the file
                Server.UploadCurrentGameState(MatchId, GameState, ref UploadTraffic);

                // update the database (add info that a new file is available)
                Server.UpdateGameStateInDataBase(MatchId, GameState);

                Control.MainWindow.Dispatcher.BeginInvoke( // in gui thread
                    (Action)(() =>
                    {
                        // refresh traffic label
                        GameScreen.Label_Multiplayer_TrafficUpload.Content = UploadTraffic.ToString();
                    }));
            }).Start(); // start thread
        }
 void WebClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
 {
     if (e.Result != null)
     {
         IsolatedStorageFileStream fs = new IsolatedStorageFileStream(string.Format(@"MultiplayerMaps\map{0}", Map), System.IO.FileMode.Create, storage);
         e.Result.CopyTo(fs);
         fs.Flush();
         fs.Dispose();
         e.Result.Dispose();
         List<Planet> planets = (LoadMap(string.Format(@"MultiplayerMaps\map{0}", Map)));
         foreach (Planet p in planets)
             Manager.AddPlanet(p);
         GameState = MultiplayerGameState.Ready;
         Thread.Sleep(1000);
         Packet ready = new Packet();
         ready.Write((byte)0xFE);
         client.SendPacket(ready);
     }
 }
        protected void ClientOnPacket(object sender, PacketRecievedArgs e)
        {
            e.Drop = true;
            byte Type = e.Packet.ReadByte();

            switch (Type)
            {
                case 0:
                    int Owner = e.Packet.ReadInt();
                    int SimulationTick = e.Packet.ReadInt();
                    int Count = e.Packet.ReadInt();
                    for (int i = 0; i < Count; i++)
                    {

                        int OriginID = e.Packet.ReadInt();
                        int DestinationID = e.Packet.ReadInt();
                        SendRequest r = new SendRequest();
                        r.SimulationTick = SimulationTick;
                        r.Owner = Owner == 1 ? VelesConflict.Gameplay.PlayerType.Player1 : VelesConflict.Gameplay.PlayerType.Player2;
                        r.Origin = OriginID;
                        r.Destination = DestinationID;
                        Manager.QueueAction(r);
                    }
                    break;
                case 0xFB:
                    GameState = MultiplayerGameState.Waiting;
                    KillGame(true);

                    break;
                case 0xFD:
                    GameState = MultiplayerGameState.Downloading;
                    Map = e.Packet.ReadInt();
                    if (!storage.DirectoryExists("MultiplayerMaps"))
                    {
                        storage.CreateDirectory("MultiplayerMaps");
                    }
                    if (storage.FileExists(string.Format(@"MultiplayerMaps\map{0}", Map)))
                    {
                        List<Planet> planets = (LoadMap(string.Format(@"MultiplayerMaps\map{0}", Map)));
                        foreach (Planet p in planets)
                            Manager.AddPlanet(p);
                        GameState = MultiplayerGameState.Ready;
                        Thread.Sleep(1000);
                        Packet ready = new Packet();
                        ready.Write((byte)0xFE);
                        client.SendPacket(ready);
                    }
                    else
                    {
                        string MapAddress = string.Format(@"http://www.velesconflict.com/maps/map{0}.xml", Map);
                        WebClient = new WebClient();
                        WebClient.OpenReadCompleted += new OpenReadCompletedEventHandler(WebClient_OpenReadCompleted);
                        WebClient.OpenReadAsync(new Uri(MapAddress));
                    }
                    break;
                case 0xFC:
                    Player = (VelesConflict.Gameplay.PlayerType)e.Packet.ReadByte();
                    break;
                case 0xFF:
                    GameCounter = 0;
                    GameState = MultiplayerGameState.Game;
                    Syncing = true;
                    FramesToSpin = 120 - (client.Ping() / 2 + 17 / 2) / 17;
                    break;
            }

            e.Packet.ResetPointer();
        }
 protected void ClientOnConnection(object sender, ConnectionArgs e)
 {
     byte Type = e.Packet.ReadByte();
     switch (Type)
     {
         case 0xFC:
             GameState = MultiplayerGameState.Waiting;
             byte pType = e.Packet.ReadByte();
             Player = pType == 1 ? VelesConflict.Gameplay.PlayerType.Player1 : VelesConflict.Gameplay.PlayerType.Player2;
             break;
     }
 }