public void SelectCard(OnlineCard card) { if (Equals(currentSelectedCard.Value, card)) { currentSelectedCard.Value = null; } else { currentSelectedCard.Value = card; } }
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(); } }
/// <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; }
public CardContainer(OnlineCard card) { Card = game.GameCards.FirstOrDefault(c => c.ID == card.TypeID); }