示例#1
0
 public void SelectCard(OnlineCard card)
 {
     if (Equals(currentSelectedCard.Value, card))
     {
         currentSelectedCard.Value = null;
     }
     else
     {
         currentSelectedCard.Value = card;
     }
 }
示例#2
0
        private void argumentWithOneArgument(OnlineRoom receivedRoom, ArgumentReturnType argumentType)
        {
            if (receivedRoom.Players[receivedRoom.UserActionArgument.Arguments[0].Result[0]].BackingUser.ID != localPlayer.BackingUser.ID)
            {
                sendOverlay.Hide();
                EnableCardSelection.Value   = false;
                EnablePlayerSelection.Value = false;
                EnableTileSelection.Value   = false;
                return;
            }

            if ((argumentType & ArgumentReturnType.Tile) != 0)
            {
                EnableTileSelection.Value = true;
                sendOverlay.Show();
            }
            if ((argumentType & ArgumentReturnType.Card) != 0)
            {
                EnableCardSelection.Value = true;
                sendOverlay.Show();
            }
            if ((argumentType & ArgumentReturnType.Player) != 0)
            {
                EnablePlayerSelection.Value = true;
                sendOverlay.Show();
                playersArray = receivedRoom.Players;
            }
            if ((argumentType & ArgumentReturnType.CardType) != 0)
            {
                EnableCardSelection.Value = true;
                List <OnlineCard> cardsType = new List <OnlineCard>();
                foreach (var card in game.GameCards)
                {
                    OnlineCard oc = new OnlineCard()
                    {
                        TypeID = card.TypeID
                    };
                    cardsType.Add(oc);
                }
                selectOverlay.PopulateCards(cardsType);
                sendOverlay.Show();
            }
        }
示例#3
0
        /// <summary>
        /// Update the board field using a sync object.
        /// </summary>
        /// <param name="sync">Board sync object.</param>
        /// <param name="players">List of players.</param>
        public void Update(Sync sync, PlayerState[] players)
        {
            // Do not check the coordinates! They might require transformation for player 2!
            Card card;

            if (sync.Card.IsFirewall)
            {
                card = new FirewallCard
                {
                    Owner = sync.Card.Owner == 1 ? players[0] : players[1]
                };
            }
            else
            {
                card = new OnlineCard
                {
                    HasBoost = sync.Card.HasBoost,
                    IsFaceUp = sync.Card.IsFaceUp,
                    Owner    = sync.Card.Owner == 1 ? players[0] : players[1],
                    Type     = sync.Card.Type
                };
            }
            Card = card;
        }
        // TODO: Distinguish between Board and BoardFieldVm
        // TODO: lock access to prevent changes while synchronizing
        public void HandleFieldSelection(int index)
        {
            if (_parent.IsBusy)
            {
                return;
            }
            if (index < 0 || index >= BoardFieldList.Count)
            {
                return;
            }

            // index can be calculated as: 8*y + x

            var vm = BoardFieldList[index];

            if (vm == null || vm.Field == null)
            {
                return;
            }

            if (!(Phase == GamePhase.Deployment) &&
                !(IsPlayerHost && Phase == GamePhase.Player1Turn) &&
                !(!IsPlayerHost && Phase == GamePhase.Player2Turn))
            {
                return;
            }

            var playerNum = IsPlayerHost ? 1 : 2;
            var opponent  = IsPlayerHost ? 2 : 1;

            // In this mode we do not send packets to server while moving cards
            if (Phase == GamePhase.Deployment)
            {
                if (_parent.CurrentMenu != MenuType.Deployment)
                {
                    return;                                             // Already deployed
                }
                if (!vm.IsDeploymentField(playerNum) || (_selectedField < 0 && !vm.HasCard))
                {
                    ClearHighlighting();
                    ClearFieldSelection();
                    return;
                }
                if (_selectedField < 0)
                {
                    _selectedField = index;
                    vm.IsSelected  = true;
                    // Highlight all other deployment fields
                    for (int x = 0; x <= 7; ++x)
                    {
                        var y = 0;
                        if (x == 3 || x == 4)
                        {
                            y = 1;
                        }
                        BoardFieldVm[x, y].IsHighlighted = (8 * y + x) != index;
                    }
                    vm.IsHighlighted = false;
                    return;
                }
                // Move card. If target field already has card, switch them
                var source     = BoardFieldList[_selectedField];
                var sourceCard = source.Field.Card;
                var targetCard = vm.Field.Card;
                vm.Field.Card     = sourceCard;
                source.Field.Card = targetCard;
                ClearHighlighting();
                ClearFieldSelection();
                OnPropertyChanged(nameof(CanConfirmDeploy));
                CardMoved?.Invoke(this, EventArgs.Empty); // TODO: This does nothing
                CommandManager.InvalidateRequerySuggested();
                return;
            }
            if (Phase == GamePhase.Player1Turn && IsPlayerHost ||
                Phase == GamePhase.Player2Turn && !IsPlayerHost)
            {
                var player = Players[playerNum - 1]; // is never null

                if (_parent.CurrentMenu == MenuType.SwitchCards)
                {
                    // User tried to play Error 404 but aborted
                    ClearFieldSelection();
                    ClearHighlighting();
                    _parent.CurrentMenu = MenuType.None;
                    return;
                }

                // Action item handling is special. Do it first
                if (IsAnyActionItemSelected)
                {
                    if (_isLineBoostSelected)
                    {
                        if (vm.HasCard && vm.Field.Card?.Owner?.PlayerNumber == playerNum)
                        {
                            SendGameCommand(string.Format("bs {0},{1},{2}", vm.Field.X + 1, vm.Field.Y + 1, 1));
                        }
                    }
                    else if (_isFirewallSelected)
                    {
                        if (!vm.HasCard &&
                            index != 84 && index != 85 &&
                            index != 3 && index != 4 && index != 3 + 8 * 7 && index != 4 + 8 * 7)
                        {
                            SendGameCommand(string.Format("fw {0},{1},{2}", vm.Field.X + 1, vm.Field.Y + 1, 1));
                        }
                    }
                    else if (_isVirusCheckSelected)
                    {
                        if (!player.DidVirusCheck && vm.Field?.Card?.Owner.PlayerNumber == opponent && vm.Field.Card is OnlineCard)
                        {
                            SendGameCommand(string.Format("vc {0},{1}", vm.Field.X + 1, vm.Field.Y + 1));
                        }
                    }
                    else if (_isError404Selected)
                    {
                        if (!player.Did404NotFound && vm.Field.Card?.Owner?.PlayerNumber == playerNum && vm.Field.Card is OnlineCard)
                        {
                            if (_selectedField < 0)
                            {
                                _selectedField = index;
                                vm.IsSelected  = true;
                                return;
                            }
                            // Unselect
                            if (_selectedField == index)
                            {
                                vm.IsSelected  = false;
                                _selectedField = -1;
                                return;
                            }
                            // Second card selected
                            // Check if first selected field is OK
                            OnlineCard firstCard = null;
                            if (_selectedField < BoardFieldList.Count)
                            {
                                firstCard = BoardFieldList[_selectedField].Field.Card as OnlineCard;
                            }
                            if (firstCard != null)
                            {
                                vm.IsSelected        = true;
                                _secondSelectedField = index;
                                _parent.CurrentMenu  = MenuType.SwitchCards;
                                return;
                            }
                        }
                    }
                    ClearFieldSelection();
                    ClearHighlighting();
                    return;
                }

                // If we reach this point, then no action items are selected

                // If selected field is clicked, deselect it
                if (_selectedField == index)
                {
                    ClearFieldSelection();
                    ClearHighlighting();
                    return;
                }

                // Select field
                if (_selectedField < 0)
                {
                    if (!vm.HasCard || vm.Field.Card?.Owner?.PlayerNumber != playerNum)
                    {
                        return;
                    }
                    ClearFieldSelection();
                    ClearHighlighting();
                    vm.IsSelected  = true;
                    _selectedField = index;
                    // Update highlighting
                    if (vm.Field?.Card is OnlineCard)
                    {
                        var targets = Game.GetMoveTargetFields(this, vm.Field);
                        foreach (var target in targets)
                        {
                            // Game works with absolute coordinates but we have to change the view:
                            int x = target.X;
                            int y = target.Y;
                            Helpers.ConvertCoordinates(ref x, ref y, IsPlayerHost);
                            BoardFieldVm[x, y].IsHighlighted = true;
                        }
                    }
                    return;
                }

                // Move card
                if ((index < 64 || index == 84 || index == 85) &&
                    _selectedField < 64)
                {
                    var from = BoardFieldList[_selectedField];
                    // TODO: Ask Game class if move is possible
                    // TODO: Exclude own exit fields
                    SendGameCommand(string.Format("mv {0},{1},{2},{3}", from.Field.X + 1, from.Field.Y + 1, vm.Field.X + 1, vm.Field.Y + 1));
                }
                // Any other field that was clicked resets the selection
                ClearFieldSelection();
                ClearHighlighting();
            }
            return;
        }
示例#5
0
 public CardContainer(OnlineCard card)
 {
     Card = game.GameCards.FirstOrDefault(c => c.ID == card.TypeID);
 }