private void LayingCardsDone() { // With only one card left, just end the game if (HandCardCount == 1) { DiscardCard(); return; } // Check if there are any (more) single cards to lay down singleLayDownCards = PlayerUtil.UpdateSingleLaydownCards(HandCardSpot.Objects, laydownCards); PossibleSinglesChanged.Invoke(singleLayDownCards); if (singleLayDownCards.Count == HandCardCount) { KeepOneSingleCard(); } if (singleLayDownCards.Count > 0) { currentCardIdx = 0; layStage = LayStage.SINGLES; } else { DiscardCard(); } }
private void DiscardCardMoveFinished(Card card) { card.MoveFinished.RemoveAllListeners(); Tb.I.DiscardStack.AddCard(card); // Refresh the list of possible card combos and singles for the UI GetBestCardCombo(HandCardSpot.Objects, true); singleLayDownCards = PlayerUtil.UpdateSingleLaydownCards(HandCardSpot.Objects, laydownCards, true); PossibleSinglesChanged.Invoke(singleLayDownCards); TurnFinished.Invoke(); State = PlayerState.IDLE; }
private void ReturnJokerMoveFinished(Card joker) { returningJoker.MoveFinished.RemoveAllListeners(); isJokerBeingReturned = false; HandCardSpot.AddCard(joker); returningJoker = null; // All possible runs/sets/singles have to be calculated again with that newly returned joker laydownCards = GetBestCardCombo(HandCardSpot.Objects, true); singleLayDownCards = PlayerUtil.UpdateSingleLaydownCards(HandCardSpot.Objects, laydownCards); PossibleSinglesChanged.Invoke(singleLayDownCards); if (laydownCards.CardCount == HandCardCount) { KeepOneSingleCard(); } // Proceed with waiting State = PlayerState.WAITING; waitStartTime = Time.time; }
private void DrawCardFinished(Card card, bool isServingCard) { card.MoveFinished.RemoveAllListeners(); HandCardSpot.AddCard(card); card.SetTurned(false); if (isServingCard) { State = PlayerState.IDLE; return; } var combos = CardUtil.GetAllPossibleCombos(HandCardSpot.Objects, Tb.I.GameMaster.GetAllCardSpotCards(), false); PossibleCardCombosChanged.Invoke(combos); laydownCards = combos.Count > 0 ? combos[0] : new CardCombo(); singleLayDownCards = PlayerUtil.UpdateSingleLaydownCards(HandCardSpot.Objects, laydownCards); PossibleSinglesChanged.Invoke(singleLayDownCards); if (Tb.I.GameMaster.LayingAllowed()) { var usedJokers = false; // If the player has not laid down card packs yet, check if their sum would be enough to do so if (!HasLaidDown) { HasLaidDown = laydownCards.Value >= Tb.I.GameMaster.MinimumLaySum; /// Try to reach <see cref="GameMaster.MinimumLaySum"/> by appending jokers to any possible cardcombo var jokers = HandCardSpot.Objects.Where(c => c.IsJoker()).ToList(); if (!HasLaidDown && jokers.Count() > 0) { for (int i = 0; i < combos.Count; i++) { var combo = new CardCombo(combos[i]); var jokersInUse = combo.GetCards().Where(c => c.IsJoker()).ToList(); var remainingJokers = jokers.Except(jokersInUse).ToList(); if (remainingJokers.Count == 0) { continue; } var canLayCombo = combo.TryAddJoker(remainingJokers); if (canLayCombo && combo.CardCount < HandCardCount) { usedJokers = true; laydownCards = combo; combos.Insert(0, combo); PossibleCardCombosChanged.Invoke(combos); NewThought.Invoke("Use jokers to lay down"); HasLaidDown = true; break; } } if (!HasLaidDown) { NewThought.Invoke("Cannot reach " + Tb.I.GameMaster.MinimumLaySum + " using jokers"); } } } // At least one card must remain when laying down if (!usedJokers && HasLaidDown && laydownCards.CardCount == HandCardCount) { KeepOneSingleCard(); } } State = PlayerState.WAITING; waitStartTime = Time.time; }