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); } } }
public void GameUndoRed() { if (UndoStateRed.Count > 0) { GameState = UndoStateRed[UndoStateRed.Count - 1]; UndoStateRed.RemoveAt(UndoStateRed.Count - 1); OnGameStateChanged?.Invoke(GameState, null); } }
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); }
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); } } }
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(); } } } }