diff --git a/RuleEngine/MahjongRoom.cs b/RuleEngine/MahjongRoom.cs index bf42f7c..7638956 100644 --- a/RuleEngine/MahjongRoom.cs +++ b/RuleEngine/MahjongRoom.cs @@ -40,7 +40,8 @@ public class MahjongRoom _phaseMachine = new MahjongPhaseMachine(phases, _solver, wildcardCount: wc, require258: r258, fanConfig: fanConfig, jiHuSelfDrawOnly: _rules.WinRule?.JiHuSelfDrawOnly ?? false, - wildcards: State.Wildcards); + wildcards: State.Wildcards, + winMinFan: _rules.WinMinFan); _scoreEngine = new MahjongScoreEngine(new ScoringConfig { diff --git a/RuleEngine/Phase/PhaseMachine.cs b/RuleEngine/Phase/PhaseMachine.cs index 38a6083..82f8636 100644 --- a/RuleEngine/Phase/PhaseMachine.cs +++ b/RuleEngine/Phase/PhaseMachine.cs @@ -44,13 +44,15 @@ public class MahjongPhaseMachine private readonly bool _jiHuSelfDrawOnly; private readonly WildcardRegistry _wildcards; private readonly bool _chiAllowed; + private readonly int _winMinFan; public bool ChiAllowed => _chiAllowed; public MahjongPhaseMachine(List phases, MeldsSolver solver, int wildcardCount = 0, bool require258 = false, Dictionary? fanConfig = null, bool jiHuSelfDrawOnly = false, - WildcardRegistry? wildcards = null) + WildcardRegistry? wildcards = null, + int winMinFan = 0) { _phases = phases; _solver = solver; @@ -59,6 +61,7 @@ public class MahjongPhaseMachine _fanConfig = fanConfig ?? new(); _jiHuSelfDrawOnly = jiHuSelfDrawOnly; _wildcards = wildcards ?? new(); + _winMinFan = winMinFan; _chiAllowed = phases.Any(p => p.OthersReactions.Any(o => o.Action == "chi")); } @@ -94,8 +97,8 @@ public class MahjongPhaseMachine "can_chi" => chiAllowed, "can_win" => canSelfWin, "can_win_tumo" => canSelfWin, - "can_win_tumo_and_fan_ge_8" => canSelfWin && fanSum >= 8, - "can_win_and_fan_ge_8" => canSelfWin && fanSum >= 8, + "can_win_tumo_and_fan_ge_8" => canSelfWin && fanSum >= _winMinFan, + "can_win_and_fan_ge_8" => canSelfWin && fanSum >= _winMinFan, _ => true // unknown condition → allow (fail-open for safety) }; } @@ -136,7 +139,7 @@ public class MahjongPhaseMachine { // Don't add win action; 鸡胡 can only self-draw } - else if (!requireWinFan || result.Fans.Sum(f => GetFanValue(f)) >= 8) + else if (!requireWinFan || result.Fans.Sum(f => GetFanValue(f)) >= _winMinFan) actions.Add(new ActionOption { Action = "win", Priority = 4 }); } } @@ -162,7 +165,7 @@ public class MahjongPhaseMachine wildcardCount: wildInSelf, require258Pair: _require258); if (tumoResult != null && tumoResult.IsWin) { - if (!requireWinFan || tumoResult.Fans.Sum(f => GetFanValue(f)) >= 8) + if (!requireWinFan || tumoResult.Fans.Sum(f => GetFanValue(f)) >= _winMinFan) actions.Add(new ActionOption { Action = "win", Priority = 4 }); } }