Esempio n. 1
0
        private void GamePlayBlueCard()
        {
            if (GameState.state == ETriadGameState.InProgressBlue)
            {
                if ((Session.specialRules & ETriadGameSpecialMod.BlueCardSelection) != ETriadGameSpecialMod.None)
                {
                    UndoStateBlue = new TriadGameData(GameState);
                }

                bool bHasMove = Session.SolverFindBestMove(GameState, out int bestNextPos, out TriadCard bestNextCard, out TriadGameResultChance bestChance);
                if (bHasMove)
                {
                    Logger.WriteLine("Blue> [{0}]: {1} => {2}: {3:P0}",
                                     bestNextPos, bestNextCard.Name.GetCodeName(),
                                     bestChance.expectedResult == ETriadGameState.BlueDraw ? "draw" : "win",
                                     bestChance.expectedResult == ETriadGameState.BlueDraw ? bestChance.drawChance : bestChance.winChance);

                    GameState.bDebugRules = true;
                    Session.PlaceCard(GameState, bestNextCard, ETriadCardOwner.Blue, bestNextPos);
                    GameState.bDebugRules = false;

                    OnGameStateChanged?.Invoke(GameState, new Move()
                    {
                        Card = bestNextCard, BoardIdx = bestNextPos, WinChance = bestChance
                    });
                }
                else
                {
                    OnGameStateChanged?.Invoke(GameState, null);
                }
            }
        }
Esempio n. 2
0
        public void GameUndoRed()
        {
            if (UndoStateRed.Count > 0)
            {
                GameState = UndoStateRed[UndoStateRed.Count - 1];
                UndoStateRed.RemoveAt(UndoStateRed.Count - 1);

                OnGameStateChanged?.Invoke(GameState, null);
            }
        }
Esempio n. 3
0
        public void GameReset()
        {
            Logger.WriteLine("Game.Reset");
            foreach (var rule in Session.modifiers)
            {
                rule.OnMatchInit();
            }

            GameState     = Session.StartGame(PlayerDeck, Npc.Deck, ETriadGameState.InProgressRed);
            UndoStateBlue = null;
            UndoStateRed.Clear();

            OnGameStateChanged?.Invoke(GameState, null);
        }
Esempio n. 4
0
        public void SetGameRedCard(TriadCard card, int boardIdx)
        {
            if (GameState != null)
            {
                GameState.forcedCardIdx = -1;
                TriadGameData newUndoState = new TriadGameData(GameState);

                Logger.WriteLine("Red> [{0}]: {1}", boardIdx, card.Name.GetCodeName());
                GameState.bDebugRules = true;
                bool bPlaced = Session.PlaceCard(GameState, card, ETriadCardOwner.Red, boardIdx);
                GameState.bDebugRules = false;

                // additional debug logs
                int numBoardPlaced = 0;
                {
                    int availBoardMask = 0;
                    for (int Idx = 0; Idx < GameState.board.Length; Idx++)
                    {
                        if (GameState.board[Idx] != null)
                        {
                            numBoardPlaced++;
                        }
                        else
                        {
                            availBoardMask |= (1 << Idx);
                        }
                    }

                    Logger.WriteLine("  Board cards:{0} ({1:x}), placed:{2}", numBoardPlaced, availBoardMask, bPlaced);
                }

                if (bPlaced)
                {
                    if (numBoardPlaced == GameState.board.Length)
                    {
                        OnGameStateChanged?.Invoke(GameState, null);
                    }
                    else
                    {
                        GamePlayBlueCard();
                    }

                    UndoStateRed.Add(newUndoState);
                }
            }
        }
Esempio n. 5
0
        public void SetGameForcedBlueCard(TriadCard card)
        {
            if (GameState != null && GameState.state == ETriadGameState.InProgressRed && UndoStateBlue != null)
            {
                var blueDeckEx = GameState.deckBlue as TriadDeckInstanceManual;
                if ((Session.specialRules & ETriadGameSpecialMod.BlueCardSelection) != ETriadGameSpecialMod.None && blueDeckEx != null)
                {
                    int deckSlotIdx = blueDeckEx.GetCardIndex(card);
                    if (GameState.forcedCardIdx != deckSlotIdx && !blueDeckEx.IsPlaced(deckSlotIdx))
                    {
                        Logger.WriteLine("Force blue card: {0}", card.Name.GetCodeName());

                        GameState = UndoStateBlue;
                        GameState.forcedCardIdx = deckSlotIdx;
                        GamePlayBlueCard();
                    }
                }
            }
        }