public DiscardResponse OnDiscard(VisibleBoard board, Tile tile, int who, DiscardActions suggestedActions) { if (suggestedActions.HasFlag(DiscardActions.Ron)) { return(DiscardResponse.Ron()); } // Call value honors if it improves shanten. But don't call if already tenpai (all discards would be furiten) var shanten = board.Watashi.Hand.Shanten; if (shanten > 0 && suggestedActions.HasFlag(DiscardActions.Pon) && !suggestedActions.HasFlag(DiscardActions.Kan)) { var tileType = tile.TileType; if (tileType.TileTypeId >= 31 || tileType == board.RoundWind || tileType == board.Watashi.SeatWind) { var t = board.Watashi.Hand.WithPon(tileType); if (t.Shanten < shanten) { var tilesInHand = board.Watashi.ConcealedTiles.Where(i => i.TileType.TileTypeId == tileType.TileTypeId).ToList(); var tileTypeId = t.GetHighestUkeIreDiscard(); var discard = board.Watashi.ConcealedTiles.First(i => i.TileType.TileTypeId == tileTypeId); return(DiscardResponse.Pon(tilesInHand[0], tilesInHand[1], discard)); } } } return(DiscardResponse.Pass()); }
internal override bool CanExecute(VisibleBoard board, DiscardActions possibleActions) { if (board.CurrentDiscard == null) { return(false); } var tileType = board.CurrentDiscard.TileType; return(possibleActions.HasFlag(DiscardActions.Pon) && _tile0.TileType == tileType && _tile1.TileType == tileType && _discardAfterCall.TileType != tileType && // kuikae HasTile(board, _tile0) && HasTile(board, _tile1) && HasTile(board, _discardAfterCall)); }
internal override bool CanExecute(VisibleBoard board, DiscardActions possibleActions) { if (board.CurrentDiscard == null) { return(false); } var tileType = board.CurrentDiscard.TileType; var tileTypeIds = new[] { _tile0.TileType.TileTypeId, _tile1.TileType.TileTypeId, tileType.TileTypeId }.OrderBy(x => x).ToList(); var isValidDiscardForKanchanCase = tileTypeIds[1] == tileType.TileTypeId && _discardAfterCall.TileType != tileType; var isValidDiscard = isValidDiscardForKanchanCase || Kuikae.IsValidDiscardForNonKanchanChii(tileType, _discardAfterCall.TileType); return(possibleActions.HasFlag(DiscardActions.Chii) && tileTypeIds[0] + 1 == tileTypeIds[1] && tileTypeIds[1] + 1 == tileTypeIds[2] && isValidDiscard && HasTile(board, _tile0) && HasTile(board, _tile1) && HasTile(board, _discardAfterCall)); }
internal override bool CanExecute(VisibleBoard board, DiscardActions possibleActions) { return(possibleActions.HasFlag(DiscardActions.Kan)); }