Beispiel #1
0
        void Given(CardMoved e)
        {
            var selected = Matching(e.Card);

            selected.Update(e.Card);
            Refresh(selected);
        }
Beispiel #2
0
 public void Handle(CardMoved e)
 {
     WithState(e.AggregateId, board => {
         var summary = board.Lanes[e.FromLaneId].Cards.SingleOrDefault(x => x.Id == e.CardId);
         board.Lanes[e.FromLaneId].Cards.Remove(summary);
         board.Lanes[e.LaneId].Cards.Insert(e.Position, summary);
         return(board);
     });
 }
        // 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;
        }