protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { int[] counts = { -3, -1, -1, -1, -1, -1, -1, -1, -3 }; for (int i = 0; i < tiles.Count; i++) { counts[(tiles[i].BaseTile as NumberTile).Number - 1]++; } int val = 0; for (int i = 0; i < 9; i++) { val |= counts[i]; } if (val != 1) { return(false); } int extraNumber = Array.IndexOf(counts, 1) + 1; var extraTile = tiles.Added.BaseTile as NumberTile; if (extraTile.Number == extraNumber) { result.Add(YakuValue.FromFullYaku(this, "纯正九莲宝灯", 1)); } else { result.Add(YakuValue.FromFullYaku(this, "九莲宝灯", 1)); } return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { if (groups.PungList.Any(g => !(g is Gan))) { return(false); } result.Add(YakuValue.FromFullYaku(this, "四杠子", 1)); return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { if (groups.Any(g => !g.Key.IsTerminal)) { return(false); } result.Add(YakuValue.FromFullYaku(this, "清老头", 1)); return(true); }
protected override bool Test(ICollection<YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { if (!TestRon(tiles, env)) return false; if (tiles.HandTiles.Take(13).Any(t => t.BaseTile == tiles.Added.BaseTile)) { result.Add(YakuValue.FromFullYaku(this, "国士无双十三面", 1)); } else { result.Add(YakuValue.FromFullYaku(this, "国士无双", 1)); } return true; }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { const KanjiTile.Kanji check = KanjiTile.Kanji.东 | KanjiTile.Kanji.南 | KanjiTile.Kanji.西 | KanjiTile.Kanji.北; if (groups.PungList.Any(g => !(g.Key is KanjiTile t) || (t.Value & check) == 0)) { return(false); } result.Add(YakuValue.FromFullYaku(this, "大四喜", 1)); return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { const KanjiTile.Kanji check = KanjiTile.Kanji.白 | KanjiTile.Kanji.发 | KanjiTile.Kanji.中; int count = groups.PungList.Count(g => g.Key is KanjiTile t && (t.Value & check) != 0); if (count < 3) { return(false); } result.Add(YakuValue.FromFullYaku(this, "大三元", 1)); return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { long flags = 0; for (int i = 0; i < tiles.Count; i++) { flags |= (1L << tiles[i].BaseTile.SortedIndex); } if ((flags | CheckFlags) != CheckFlags) { return(false); } result.Add(YakuValue.FromFullYaku(this, "绿一色", 1)); return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { const KanjiTile.Kanji check = KanjiTile.Kanji.东 | KanjiTile.Kanji.南 | KanjiTile.Kanji.西 | KanjiTile.Kanji.北; int count = groups.PungList.Count(g => g.Key is KanjiTile t && (t.Value & check) != 0); if (count != 3) { return(false); } if (!(groups.Pair.Key is KanjiTile t2) || (t2.Value & check) == 0) { return(false); } result.Add(YakuValue.FromFullYaku(this, "小四喜", 1)); return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { if (!TestRon(tiles, env)) { return(true); } if (tiles.Count(t => t.BaseTile == tiles.Added.BaseTile) == 2) { result.Add(YakuValue.FromFullYaku(this, "国士无双十三面", 1)); } else { result.Add(YakuValue.FromFullYaku(this, "国士无双", 1)); } return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { if ((env & YakuEnvironment.第一巡) == 0) { return(false); } if ((env & YakuEnvironment.自摸) != 0) { if ((env & YakuEnvironment.自风东) != 0) { result.Add(YakuValue.FromFullYaku(this, "天和", 1)); } else { result.Add(YakuValue.FromFullYaku(this, "地和", 1)); } } else { result.Add(YakuValue.FromFullYaku(this, "人和", 1)); } return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { foreach (var g in groups.PungList) { if (g.Type == GroupType.副露) { return(false); } if (g.Type == GroupType.和牌 && !SelfWindEquals(g.AddedWind, env)) { return(false); } } if (groups.Pair.Type == GroupType.和牌) { result.Add(YakuValue.FromFullYaku(this, "四暗刻单骑", 1)); } else { result.Add(YakuValue.FromFullYaku(this, "四暗刻", 1)); } return(true); }
protected override bool Test(ICollection <YakuValue> result, ITiles tiles, IGroups groups, YakuEnvironment env) { result.Add(YakuValue.FromFullYaku(this, "字一色", 1)); return(true); }