void Given(CardMoved e) { var selected = Matching(e.Card); selected.Update(e.Card); Refresh(selected); }
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; }