private void HakuHatsuChun(int offset) { for (var i = 0; i < 3; i++) { if (_arrangement.ContainsKoutsu(i + 4)) { SumValue |= 0b1L << (offset + i); } } }
private static bool Matches(ArrangementGroup arrangements, Arrangement arrangement, FuConstraint constraint) { if (constraint.DoujunIndex >= 0 && !arrangement.ContainsShuntsu(constraint.DoujunIndex)) { // open hands with less than 6 tiles in the arrangement can use a meld to get sanshoku if (arrangements.TileCount > 5 || !constraint.Open) { return(false); } } if (constraint.DoukouIndex >= 0 && !arrangement.ContainsKoutsu(constraint.DoukouIndex)) { // hands with less than 6 tiles in the arrangement can use a meld to get sanshoku. If closed must be ankan if (arrangements.TileCount > 5) { return(false); } } var hasIipeikou = arrangement.Blocks.Where(b => b.IsShuntsu).GroupBy(s => s.Index).Any(g => g.Count() >= 2); if (arrangements.HasIipeikou && !constraint.Open && !hasIipeikou) { if (!arrangements.HasSquareType || constraint.SquareIsNotSanankou) { return(false); } } if (constraint.SquareIsNotSanankou && arrangement.Blocks.Count(b => b.IsKoutsu) >= 3) { return(false); } return(true); }