コード例 #1
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnAttackUnit(ClientToServerMessage message)
        {
            AttackUnitRequest request = message.AttackUnitRequest;

            if (request == null)
            {
                throw new ServerClientException("Invalid attack unit request");
            }
            Unit attacker = PlayerState.GetUnit(request.AttackerUnitId);

            if (attacker == null)
            {
                throw new ServerClientException("Encountered an invalid attacking unit ID in an attack request");
            }
            Unit defender = Opponent.PlayerState.GetUnit(request.DefenderUnitId);

            if (defender == null)
            {
                throw new ServerClientException("Encountered an invalid target unit ID in an attack request");
            }
            PlayerState.AttackUnit(attacker, defender);
            UnitCasualties        attackerCasualties = new UnitCasualties(attacker.Id, attacker.Strength);
            UnitCasualties        defenderCasualties = new UnitCasualties(defender.Id, defender.Strength);
            UnitCombatBroadcast   casualties         = new UnitCombatBroadcast(attackerCasualties, defenderCasualties);
            ServerToClientMessage broadcast          = new ServerToClientMessage(casualties);

            BroadcastMessage(broadcast);
            AnnihilationCheck();
        }
コード例 #2
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnMoveUnit(ClientToServerMessage message)
        {
            MoveUnitRequest request = message.MoveUnitRequest;

            if (request == null)
            {
                throw new ServerClientException("Invalid move unit request");
            }
            Unit unit = PlayerState.GetUnit(request.UnitId);

            if (unit == null)
            {
                throw new ServerClientException("Encountered an invalid unit ID in a move request");
            }
            int        movementPointsLeft;
            List <Hex> captures;

            PlayerState.MoveUnit(unit, request.NewPosition, out movementPointsLeft, out captures);
            UnitMoveBroadcast move = new UnitMoveBroadcast(unit.Id, movementPointsLeft);

            foreach (var hex in captures)
            {
                move.Captures.Add(hex.Position);
            }
            ServerToClientMessage broadcast = new ServerToClientMessage(move);

            BroadcastMessage(broadcast);
        }
コード例 #3
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnJoinGameRequest(ClientToServerMessage message)
        {
            JoinGameRequest request = message.JoinGameRequest;

            if (request == null)
            {
                throw new ServerClientException("Invalid join game request");
            }
            // Defaults to false so lazy/afk players lose the first turn privilege
            _RequestedFirstTurn = false;
            InitialiseArmy(request.Army);
            Faction faction = Server.GetFaction(request.Army.FactionId);
            bool    success = Server.OnJoinGameRequest(this, request, out _Game);

            if (success)
            {
                _PlayerState = new PanzerKontrol.PlayerState(Game, faction, PlayerIdentifier.Player2);
                InGameState(PlayerStateType.DeployingUnits, ClientToServerMessageType.InitialDeployment);
            }
            else
            {
                ServerToClientMessage reply = new ServerToClientMessage(ServerToClientMessageType.NoSuchGame);
                QueueMessage(reply);
            }
            Game.OnOpponentFound(this);
        }
コード例 #4
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        public void OnGameEnd(GameEndBroadcast broadcast)
        {
            LoggedInState();
            ServerToClientMessage message = new ServerToClientMessage(broadcast);

            QueueMessage(message);
        }
コード例 #5
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        public void OnOpponentLeftGame()
        {
            LoggedInState();
            ServerToClientMessage reply = new ServerToClientMessage(ServerToClientMessageType.OpponentLeftGame);

            QueueMessage(reply);
        }
コード例 #6
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnCancelGameRequest(ClientToServerMessage message)
        {
            Server.OnCancelGameRequest(this);
            LoggedInState();
            ServerToClientMessage reply = new ServerToClientMessage(ServerToClientMessageType.CancelGameConfirmation);

            QueueMessage(reply);
        }
コード例 #7
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
 void QueueMessage(ServerToClientMessage message)
 {
     lock (SendQueue)
     {
         SendQueue.Add(message);
         SendEvent.Set();
     }
 }
コード例 #8
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        public void NewTurn(bool isMyTurn, List <Unit> attritionUnits)
        {
            var attritionCasualties       = attritionUnits.Select((Unit x) => new UnitCasualties(x.Id, x.Strength, !x.CanPerformAction)).ToList();
            var identifier                = isMyTurn ? Identifier : Opponent.Identifier;
            NewTurnBroadcast      newTurn = new NewTurnBroadcast(identifier, attritionCasualties);
            ServerToClientMessage message = new ServerToClientMessage(newTurn);

            QueueMessage(message);
            if (isMyTurn)
            {
                InGameState(PlayerStateType.MyTurn, ClientToServerMessageType.MoveUnit, ClientToServerMessageType.EntrenchUnit, ClientToServerMessageType.AttackUnit, ClientToServerMessageType.DeployUnit, ClientToServerMessageType.ReinforceUnit, ClientToServerMessageType.PurchaseUnit, ClientToServerMessageType.UpgradeUnit, ClientToServerMessageType.EndTurn);
            }
            else
            {
                InGameState(PlayerStateType.OpponentTurn);
            }
        }
コード例 #9
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnDeployUnit(ClientToServerMessage message)
        {
            UnitDeployment deployment = message.UnitDeployment;

            if (deployment == null)
            {
                throw new ServerClientException("Invalid unit deployment");
            }
            Unit unit = PlayerState.GetUnit(deployment.Unit.UnitId);

            if (unit == null)
            {
                throw new ServerClientException("Encountered an invalid unit ID in a deployment request");
            }
            PlayerState.DeployUnit(unit, deployment.Unit.Position);
            ServerToClientMessage broadcast = new ServerToClientMessage(deployment);

            BroadcastMessage(broadcast);
        }
コード例 #10
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnEntrenchUnit(ClientToServerMessage message)
        {
            UnitEntrenched entrenchUnit = message.EntrenchUnit;

            if (entrenchUnit == null)
            {
                throw new ServerClientException("Invalid entrench unit request");
            }
            Unit unit = PlayerState.GetUnit(entrenchUnit.UnitId);

            if (unit == null)
            {
                throw new ServerClientException("Encountered an invalid unit ID in a move request");
            }
            PlayerState.EntrenchUnit(unit);
            ServerToClientMessage broadcast = new ServerToClientMessage(entrenchUnit);

            BroadcastMessage(broadcast);
        }
コード例 #11
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnUpgradeUnit(ClientToServerMessage message)
        {
            UpgradeUnitRequest request = message.UpgradeUnitRequest;

            if (request == null)
            {
                throw new ServerClientException("Invalid upgrade unit request");
            }
            Unit unit = PlayerState.GetUnit(request.UnitId);

            if (unit == null)
            {
                throw new ServerClientException("Encountered an invalid unit ID in an upgrade request");
            }
            PlayerState.UpgradeUnit(unit, unit.GetUpgrade(request.UpgradeId));
            UnitUpgradedBroadcast unitUpgraded = new UnitUpgradedBroadcast(new ReinforcementState(PlayerState), unit.Id);
            ServerToClientMessage broadcast    = new ServerToClientMessage(unitUpgraded);

            BroadcastMessage(broadcast);
        }
コード例 #12
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnReinforceUnit(ClientToServerMessage message)
        {
            ReinforceUnitRequest request = message.ReinforceUnitRequest;

            if (request == null)
            {
                throw new ServerClientException("Invalid unit reinforcement request");
            }
            Unit unit = PlayerState.GetUnit(request.UnitId);

            if (unit == null)
            {
                throw new ServerClientException("Encountered an invalid unit ID in a reinforcement request");
            }
            PlayerState.ReinforceUnit(unit);
            UnitReinforcementBroadcast unitReinforced = new UnitReinforcementBroadcast(new ReinforcementState(PlayerState), unit.Id, unit.Strength);
            ServerToClientMessage      broadcast      = new ServerToClientMessage(unitReinforced);

            BroadcastMessage(broadcast);
        }
コード例 #13
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
        void OnPurchaseUnit(ClientToServerMessage message)
        {
            PurchaseUnitRequest request = message.PurchaseUnitRequest;

            if (request == null)
            {
                throw new ServerClientException("Invalid purchase request");
            }
            if (request.Unit.FactionId != PlayerState.Faction.Id)
            {
                throw new ServerClientException("Tried to purchase a unit from another faction");
            }
            Unit unit = new Unit(PlayerState, Game.GetUnitId(), request.Unit, Server);

            PlayerState.PurchaseUnit(unit);
            // Update the unit ID prior to broadcasting the purchase information
            UnitConfiguration unitConfiguration = request.Unit;

            unitConfiguration.UnitId = unit.Id;
            UnitPurchasedBroadcast unitPurchased = new UnitPurchasedBroadcast(new ReinforcementState(PlayerState), request.Unit);
            ServerToClientMessage  broadcast     = new ServerToClientMessage(unitPurchased);

            BroadcastMessage(broadcast);
        }
コード例 #14
0
ファイル: ServerClient.cs プロジェクト: jascou/PanzerKontrol
 void BroadcastMessage(ServerToClientMessage message)
 {
     QueueMessage(message);
     Opponent.QueueMessage(message);
 }