fix: add missing constants preload in HandEvaluator

This commit is contained in:
xiaji
2026-05-29 09:47:42 +08:00
parent 07fc763413
commit 09953c98f7

View File

@@ -5,6 +5,7 @@
class_name HandEvaluator class_name HandEvaluator
extends RefCounted extends RefCounted
const _C = preload("res://src/core/constants.gd")
const INVALID := -1 const INVALID := -1
class EvaluatedPlay: class EvaluatedPlay:
@@ -25,24 +26,25 @@ static func evaluate(cards: Array[Card], current_rank: int, config: RuleConfig)
_sort_by_rank_and_suit(sorted) _sort_by_rank_and_suit(sorted)
var n := sorted.size() var n := sorted.size()
if n == 1: if n == 1:
return _make_result(TYPE_SINGLE, sorted[0].rank(), false, sorted) return _make_result(_C.TYPE_SINGLE, sorted[0].rank(), false, sorted)
var wilds: Array[Card] = []
var reals: Array[Card] = [] var wilds: Array[Card] = []
for c in sorted: var reals: Array[Card] = []
if c.is_heart() and c.rank() == current_rank: for c in sorted:
wilds.append(c) if c.is_heart() and c.rank() == current_rank:
else: wilds.append(c)
reals.append(c) else:
var has_wild := wilds.size() > 0 reals.append(c)
if n == 2: var has_wild := wilds.size() > 0
return _eval_two(reals, wilds, has_wild) if n == 2:
if n == 3: return _eval_two(reals, wilds, has_wild)
return _eval_three(reals, wilds, has_wild) if n == 3:
if n == 4: return _eval_three(reals, wilds, has_wild)
var result := _eval_four(reals, wilds, has_wild, current_rank, config) if n == 4:
if result != null: var result := _eval_four(reals, wilds, has_wild, current_rank, config)
return result if result != null:
return _eval_multi(reals, wilds, has_wild, current_rank, n, config) return result
return _eval_multi(reals, wilds, has_wild, current_rank, n, config)
static func _make_result(type: int, primary_rank: int, is_pure: bool, cards1: Array[Card]) -> EvaluatedPlay: static func _make_result(type: int, primary_rank: int, is_pure: bool, cards1: Array[Card]) -> EvaluatedPlay:
var r := EvaluatedPlay.new() var r := EvaluatedPlay.new()
@@ -55,41 +57,41 @@ static func _make_result(type: int, primary_rank: int, is_pure: bool, cards1: Ar
static func _eval_two(reals: Array[Card], wilds: Array[Card], has_wild: bool) -> EvaluatedPlay: static func _eval_two(reals: Array[Card], wilds: Array[Card], has_wild: bool) -> EvaluatedPlay:
if not has_wild: if not has_wild:
if reals.size() == 2 and reals[0].rank() == reals[1].rank(): if reals.size() == 2 and reals[0].rank() == reals[1].rank():
return _make_result(TYPE_PAIR, reals[0].rank(), true, reals) return _make_result(_C.TYPE_PAIR, reals[0].rank(), true, reals)
else: else:
if reals.size() == 1: if reals.size() == 1:
return _make_result(TYPE_PAIR, reals[0].rank(), false, reals + wilds) return _make_result(_C.TYPE_PAIR, reals[0].rank(), false, reals + wilds)
return null return null
static func _eval_three(reals: Array[Card], wilds: Array[Card], has_wild: bool) -> EvaluatedPlay: static func _eval_three(reals: Array[Card], wilds: Array[Card], has_wild: bool) -> EvaluatedPlay:
if not has_wild: if not has_wild:
if reals.size() == 3 and _all_same_rank(reals): if reals.size() == 3 and _all_same_rank(reals):
return _make_result(TYPE_TRIPLE, reals[0].rank(), true, reals) return _make_result(_C.TYPE_TRIPLE, reals[0].rank(), true, reals)
else: else:
if reals.size() == 2 and reals[0].rank() == reals[1].rank(): if reals.size() == 2 and reals[0].rank() == reals[1].rank():
return _make_result(TYPE_TRIPLE, reals[0].rank(), false, reals + wilds) return _make_result(_C.TYPE_TRIPLE, reals[0].rank(), false, reals + wilds)
if reals.size() == 1 and wilds.size() >= 2: if reals.size() == 1 and wilds.size() >= 2:
return _make_result(TYPE_TRIPLE, reals[0].rank(), false, reals + wilds.slice(0, 2)) return _make_result(_C.TYPE_TRIPLE, reals[0].rank(), false, reals + wilds.slice(0, 2))
return null return null
static func _eval_four(reals: Array[Card], wilds: Array[Card], has_wild: bool, current_rank: int, config: RuleConfig) -> EvaluatedPlay: static func _eval_four(reals: Array[Card], wilds: Array[Card], has_wild: bool, current_rank: int, config: RuleConfig) -> EvaluatedPlay:
var all_cards := reals + wilds var all_cards := reals + wilds
if not has_wild and reals.size() == 4: if not has_wild and reals.size() == 4:
if _all_same_rank(reals): if _all_same_rank(reals):
return _make_result(TYPE_BOMB, reals[0].rank(), true, reals) return _make_result(_C.TYPE_BOMB, reals[0].rank(), true, reals)
var sj_count := 0 var sj_count := 0
var bj_count := 0 var bj_count := 0
for c in reals: for c in reals:
if c.rank() == 15: sj_count += 1 if c.rank() == 15: sj_count += 1
if c.rank() == 16: bj_count += 1 if c.rank() == 16: bj_count += 1
if sj_count == 2 and bj_count == 2: if sj_count == 2 and bj_count == 2:
return _make_result(TYPE_ROCKET, 999, true, reals) return _make_result(_C.TYPE_ROCKET, 999, true, reals)
return null return null
if has_wild: if has_wild:
if reals.size() == 3 and _all_same_rank(reals): if reals.size() == 3 and _all_same_rank(reals):
return _make_result(TYPE_BOMB, reals[0].rank(), false, all_cards) return _make_result(_C.TYPE_BOMB, reals[0].rank(), false, all_cards)
if reals.size() == 2 and reals[0].rank() == reals[1].rank(): if reals.size() == 2 and reals[0].rank() == reals[1].rank():
return _make_result(TYPE_BOMB, reals[0].rank(), false, all_cards) return _make_result(_C.TYPE_BOMB, reals[0].rank(), false, all_cards)
return null return null
static func _eval_multi(reals: Array[Card], wilds: Array[Card], has_wild: bool, current_rank: int, n: int, config: RuleConfig) -> EvaluatedPlay: static func _eval_multi(reals: Array[Card], wilds: Array[Card], has_wild: bool, current_rank: int, n: int, config: RuleConfig) -> EvaluatedPlay:
@@ -113,15 +115,15 @@ static func _eval_multi(reals: Array[Card], wilds: Array[Card], has_wild: bool,
static func _eval_pure_multiple(reals: Array[Card], n: int, config: RuleConfig) -> EvaluatedPlay: static func _eval_pure_multiple(reals: Array[Card], n: int, config: RuleConfig) -> EvaluatedPlay:
if n >= 5 and _is_straight(reals, config): if n >= 5 and _is_straight(reals, config):
return _make_result(TYPE_STRAIGHT, reals[n-1].rank(), true, reals) return _make_result(_C.TYPE_STRAIGHT, reals[n-1].rank(), true, reals)
if n >= 6 and n % 2 == 0 and _is_consecutive_pairs(reals, n / 2): if n >= 6 and n % 2 == 0 and _is_consecutive_pairs(reals, n / 2):
return _make_result(TYPE_CONSECUTIVE_PAIRS, reals[n-1].rank(), true, reals) return _make_result(_C.TYPE_CONSECUTIVE_PAIRS, reals[n-1].rank(), true, reals)
if n == 5 and _is_triple_plus_two(reals): if n == 5 and _is_triple_plus_two(reals):
return _make_result(TYPE_TRIPLE_PLUS_TWO, _get_triple_rank(reals), true, reals) return _make_result(_C.TYPE_TRIPLE_PLUS_TWO, _get_triple_rank(reals), true, reals)
if n >= 6 and n % 3 == 0 and _is_steel_plate(reals): if n >= 6 and n % 3 == 0 and _is_steel_plate(reals):
return _make_result(TYPE_STEEL_PLATE, reals[n-1].rank(), true, reals) return _make_result(_C.TYPE_STEEL_PLATE, reals[n-1].rank(), true, reals)
if n >= 5 and _is_straight_flush(reals, config): if n >= 5 and _is_straight_flush(reals, config):
return _make_result(TYPE_STRAIGHT_FLUSH, reals[n-1].rank(), true, reals) return _make_result(_C.TYPE_STRAIGHT_FLUSH, reals[n-1].rank(), true, reals)
return null return null
static func _eval_triple_plus_two(reals: Array[Card], wilds: Array[Card]) -> EvaluatedPlay: static func _eval_triple_plus_two(reals: Array[Card], wilds: Array[Card]) -> EvaluatedPlay:
@@ -129,7 +131,7 @@ static func _eval_triple_plus_two(reals: Array[Card], wilds: Array[Card]) -> Eva
if reals.is_empty(): return null if reals.is_empty(): return null
var rank_counts := _rank_counts(reals) var rank_counts := _rank_counts(reals)
if rank_counts.values().has(3): if rank_counts.values().has(3):
return _make_result(TYPE_TRIPLE_PLUS_TWO, _get_triple_rank(reals), wilds.is_empty(), reals + wilds) return _make_result(_C.TYPE_TRIPLE_PLUS_TWO, _get_triple_rank(reals), wilds.is_empty(), reals + wilds)
return null return null
static func _eval_straight(reals: Array[Card], wilds: Array[Card], n: int, config: RuleConfig) -> EvaluatedPlay: static func _eval_straight(reals: Array[Card], wilds: Array[Card], n: int, config: RuleConfig) -> EvaluatedPlay:
@@ -147,19 +149,19 @@ static func _eval_straight(reals: Array[Card], wilds: Array[Card], n: int, confi
if total_gaps == w or (total_gaps <= w and w >= total_gaps): if total_gaps == w or (total_gaps <= w and w >= total_gaps):
var max_rank := sorted[sorted.size()-1].rank() var max_rank := sorted[sorted.size()-1].rank()
if not config.straight_extends_to_ace and max_rank > 14: return null if not config.straight_extends_to_ace and max_rank > 14: return null
return _make_result(TYPE_STRAIGHT, max_rank, w == 0, reals + wilds) return _make_result(_C.TYPE_STRAIGHT, max_rank, w == 0, reals + wilds)
return null return null
static func _eval_consecutive_pairs(reals: Array[Card], wilds: Array[Card], pair_count: int, config: RuleConfig) -> EvaluatedPlay: static func _eval_consecutive_pairs(reals: Array[Card], wilds: Array[Card], pair_count: int, config: RuleConfig) -> EvaluatedPlay:
if reals.size() + wilds.size() != pair_count * 2: return null if reals.size() + wilds.size() != pair_count * 2: return null
if wilds.is_empty() and _is_consecutive_pairs(reals, pair_count): if wilds.is_empty() and _is_consecutive_pairs(reals, pair_count):
return _make_result(TYPE_CONSECUTIVE_PAIRS, reals[reals.size()-1].rank(), true, reals) return _make_result(_C.TYPE_CONSECUTIVE_PAIRS, reals[reals.size()-1].rank(), true, reals)
return null return null
static func _eval_steel_plate(reals: Array[Card], wilds: Array[Card], triple_count: int, config: RuleConfig) -> EvaluatedPlay: static func _eval_steel_plate(reals: Array[Card], wilds: Array[Card], triple_count: int, config: RuleConfig) -> EvaluatedPlay:
if reals.size() + wilds.size() != triple_count * 3: return null if reals.size() + wilds.size() != triple_count * 3: return null
if wilds.is_empty() and _is_steel_plate(reals): if wilds.is_empty() and _is_steel_plate(reals):
return _make_result(TYPE_STEEL_PLATE, reals[reals.size()-1].rank(), true, reals) return _make_result(_C.TYPE_STEEL_PLATE, reals[reals.size()-1].rank(), true, reals)
return null return null
static func _all_same_rank(cards: Array[Card]) -> bool: static func _all_same_rank(cards: Array[Card]) -> bool: