fix: chi在四川血战等无吃变体中仍然可用

Root cause: HandleDiscardReactions始终调用CanChiCheck,不检查
DSL的others_reaction是否包含chi action

修复:
- PhaseMachine: 构造时读取phases→检查是否有chi→_chiAllowed
- MahjongRoom: HandleDiscardReactions用_phaseMachine.ChiAllowed门控
- 人类/AI均在无chi变体中不再看到/执行chi

Impact: xuezhandaodi(无chi)和wuhan/guobiao/guangdong(有chi)行为正确隔离
This commit is contained in:
xiaoou
2026-07-04 20:22:04 +08:00
parent ed30351ad0
commit d95eab84f0
2 changed files with 6 additions and 2 deletions

View File

@ -305,8 +305,8 @@ public class MahjongRoom
bool canWin = false, canKong = sameCount >= 3, canPung = sameCount >= 2;
bool canChi = false;
// Chi: only available to the player immediately after the discarder (上家)
if (offset == 1 && !MahjongTile.IsHonor(discardTile))
// Chi: only if DSL allows it + immediate next player + non-honor tile
if (_phaseMachine.ChiAllowed && offset == 1 && !MahjongTile.IsHonor(discardTile))
canChi = _phaseMachine.CanChiCheck(State, p, discardTile);
// Check win

View File

@ -43,6 +43,8 @@ public class MahjongPhaseMachine
private readonly Dictionary<string, FanConfig> _fanConfig;
private readonly bool _jiHuSelfDrawOnly;
private readonly WildcardRegistry _wildcards;
private readonly bool _chiAllowed;
public bool ChiAllowed => _chiAllowed;
public MahjongPhaseMachine(List<PhaseConfig> phases, MeldsSolver solver,
int wildcardCount = 0, bool require258 = false,
@ -57,6 +59,8 @@ public class MahjongPhaseMachine
_fanConfig = fanConfig ?? new();
_jiHuSelfDrawOnly = jiHuSelfDrawOnly;
_wildcards = wildcards ?? new();
_chiAllowed = phases.Any(p =>
p.OthersReactions.Any(o => o.Action == "chi"));
}
public PhaseConfig? GetPhase(string name) => _phases.FirstOrDefault(p => p.Name == name);