fix: resolve GDScript type errors and warnings
- Fix Array[Card] type mismatch in move_generator.gd (rank_counts arrays) - Fix shadowed variables in card.gd (create, from_packed parameters) - Fix integer division warning in deck.gd (/ → //) - Fix unused_signal warnings in event_bus.gd (per-signal annotations) - Fix unused_parameter warning in audio_manager.gd - Normalize whitespace in training_controller.gd
This commit is contained in:
@@ -11,8 +11,10 @@ config_version=5
|
|||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="Guandan Card Game"
|
config/name="Guandan Card Game"
|
||||||
config/version="0.1.0"
|
|
||||||
config/description="掼蛋卡牌训练模式"
|
config/description="掼蛋卡牌训练模式"
|
||||||
|
config/version="0.1.0"
|
||||||
|
run/main_scene="res://src/ui/scenes/main_menu.tscn"
|
||||||
|
config/features=PackedStringArray("4.6")
|
||||||
|
|
||||||
[autoload]
|
[autoload]
|
||||||
|
|
||||||
|
|||||||
@@ -2,19 +2,19 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
func play_card_place() -> void:
|
func play_card_place() -> void:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
func play_bomb() -> void:
|
func play_bomb() -> void:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
func play_pass() -> void:
|
func play_pass() -> void:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
func play_victory() -> void:
|
func play_victory() -> void:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
func play_tribute() -> void:
|
func play_tribute() -> void:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
func set_muted(muted: bool) -> void:
|
func set_muted(_muted: bool) -> void:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
# src/autoload/event_bus.gd
|
# src/autoload/event_bus.gd
|
||||||
@warning_ignore("unused_signal")
|
|
||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
|
@warning_ignore("unused_signal")
|
||||||
signal player_played_cards(player_idx: int, play_type: int, cards: Array)
|
signal player_played_cards(player_idx: int, play_type: int, cards: Array)
|
||||||
|
@warning_ignore("unused_signal")
|
||||||
signal bomb_detonated(player_idx: int, rank: int)
|
signal bomb_detonated(player_idx: int, rank: int)
|
||||||
|
@warning_ignore("unused_signal")
|
||||||
signal player_finished(player_idx: int, position: int)
|
signal player_finished(player_idx: int, position: int)
|
||||||
|
@warning_ignore("unused_signal")
|
||||||
signal turn_changed(player_idx: int)
|
signal turn_changed(player_idx: int)
|
||||||
|
@warning_ignore("unused_signal")
|
||||||
signal game_over(winner_team: int, reason: String)
|
signal game_over(winner_team: int, reason: String)
|
||||||
|
|||||||
@@ -12,59 +12,59 @@ var original_id: int
|
|||||||
var _suit: int
|
var _suit: int
|
||||||
var _rank: int
|
var _rank: int
|
||||||
|
|
||||||
static func create(original_id: int, suit: int, rank: int) -> Card:
|
static func create(p_original_id: int, p_suit: int, p_rank: int) -> Card:
|
||||||
var c := Card.new()
|
var c := Card.new()
|
||||||
c.original_id = original_id
|
c.original_id = p_original_id
|
||||||
c._suit = suit
|
c._suit = p_suit
|
||||||
c._rank = rank
|
c._rank = p_rank
|
||||||
c.card_id = original_id
|
c.card_id = p_original_id
|
||||||
return c
|
return c
|
||||||
|
|
||||||
static func make_full_deck_ids() -> Array[int]:
|
static func make_full_deck_ids() -> Array[int]:
|
||||||
var ids: Array[int] = []
|
var ids: Array[int] = []
|
||||||
for i in range(108):
|
for i in range(108):
|
||||||
ids.append(i)
|
ids.append(i)
|
||||||
return ids
|
return ids
|
||||||
|
|
||||||
static func card_id_from_deck(original_id: int, deck_index: int) -> int:
|
static func card_id_from_deck(p_original_id: int, deck_index: int) -> int:
|
||||||
return original_id + deck_index * 54
|
return p_original_id + deck_index * 54
|
||||||
|
|
||||||
func suit() -> int:
|
func suit() -> int:
|
||||||
return _suit
|
return _suit
|
||||||
|
|
||||||
func rank() -> int:
|
func rank() -> int:
|
||||||
return _rank
|
return _rank
|
||||||
|
|
||||||
func card_value() -> int:
|
func card_value() -> int:
|
||||||
return _suit * 20 + _rank
|
return _suit * 20 + _rank
|
||||||
|
|
||||||
func is_joker() -> bool:
|
func is_joker() -> bool:
|
||||||
return _rank == 15 or _rank == 16
|
return _rank == 15 or _rank == 16
|
||||||
|
|
||||||
func is_heart() -> bool:
|
func is_heart() -> bool:
|
||||||
return _suit == 1
|
return _suit == 1
|
||||||
|
|
||||||
func matches(other: Card) -> bool:
|
func matches(other: Card) -> bool:
|
||||||
return card_value() == other.card_value()
|
return card_value() == other.card_value()
|
||||||
|
|
||||||
func equals(other: Card) -> bool:
|
func equals(other: Card) -> bool:
|
||||||
return card_id == other.card_id
|
return card_id == other.card_id
|
||||||
|
|
||||||
func compare_to(other: Card) -> int:
|
func compare_to(other: Card) -> int:
|
||||||
var r := _rank - other._rank
|
var r := _rank - other._rank
|
||||||
if r != 0:
|
if r != 0:
|
||||||
return r
|
return r
|
||||||
return _suit - other._suit
|
return _suit - other._suit
|
||||||
|
|
||||||
func to_packed() -> int:
|
func to_packed() -> int:
|
||||||
return (_suit << 8) | (_rank & 0xFF)
|
return (_suit << 8) | (_rank & 0xFF)
|
||||||
|
|
||||||
static func from_packed(packed: int) -> Card:
|
static func from_packed(packed: int) -> Card:
|
||||||
var suit := (packed >> 8) & 0xFF
|
var p_suit := (packed >> 8) & 0xFF
|
||||||
var rank := packed & 0xFF
|
var p_rank := packed & 0xFF
|
||||||
return Card.create(0, suit, rank)
|
return Card.create(0, p_suit, p_rank)
|
||||||
|
|
||||||
func _to_string() -> String:
|
func _to_string() -> String:
|
||||||
var suits := ["S", "H", "C", "D", "SJ", "BJ"]
|
var suits := ["S", "H", "C", "D", "SJ", "BJ"]
|
||||||
var ranks := ["", "", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "SJ", "BJ"]
|
var ranks := ["", "", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "SJ", "BJ"]
|
||||||
return "%s%s" % [suits[_suit], ranks[_rank]]
|
return "%s%s" % [suits[_suit], ranks[_rank]]
|
||||||
|
|||||||
@@ -5,54 +5,54 @@ extends RefCounted
|
|||||||
var _cards: Array[Card] = []
|
var _cards: Array[Card] = []
|
||||||
|
|
||||||
static func _suit_for(original_id: int) -> int:
|
static func _suit_for(original_id: int) -> int:
|
||||||
if original_id == 52:
|
if original_id == 52:
|
||||||
return 4
|
return 4
|
||||||
if original_id == 53:
|
if original_id == 53:
|
||||||
return 5
|
return 5
|
||||||
return original_id % 4
|
return original_id % 4
|
||||||
|
|
||||||
static func _rank_for(original_id: int) -> int:
|
static func _rank_for(original_id: int) -> int:
|
||||||
if original_id == 52:
|
if original_id == 52:
|
||||||
return 15
|
return 15
|
||||||
if original_id == 53:
|
if original_id == 53:
|
||||||
return 16
|
return 16
|
||||||
return 2 + (original_id / 4)
|
return 2 + (original_id // 4)
|
||||||
|
|
||||||
static func create(seed: int = -1) -> Deck:
|
static func create(seed: int = -1) -> Deck:
|
||||||
var d := Deck.new()
|
var d := Deck.new()
|
||||||
d._cards = []
|
d._cards = []
|
||||||
for deck_idx in range(2):
|
for deck_idx in range(2):
|
||||||
for orig_id in range(54):
|
for orig_id in range(54):
|
||||||
var global_id := Card.card_id_from_deck(orig_id, deck_idx)
|
var global_id := Card.card_id_from_deck(orig_id, deck_idx)
|
||||||
var suit := _suit_for(orig_id)
|
var suit := _suit_for(orig_id)
|
||||||
var rank := _rank_for(orig_id)
|
var rank := _rank_for(orig_id)
|
||||||
var c := Card.create(orig_id, suit, rank)
|
var c := Card.create(orig_id, suit, rank)
|
||||||
c.card_id = global_id
|
c.card_id = global_id
|
||||||
d._cards.append(c)
|
d._cards.append(c)
|
||||||
if seed >= 0:
|
if seed >= 0:
|
||||||
d._shuffle_with_seed(seed)
|
d._shuffle_with_seed(seed)
|
||||||
else:
|
else:
|
||||||
d._shuffle_random()
|
d._shuffle_random()
|
||||||
return d
|
return d
|
||||||
|
|
||||||
func _shuffle_with_seed(seed: int) -> void:
|
func _shuffle_with_seed(seed: int) -> void:
|
||||||
var rng := RandomNumberGenerator.new()
|
var rng := RandomNumberGenerator.new()
|
||||||
rng.seed = seed
|
rng.seed = seed
|
||||||
for i in range(_cards.size() - 1, 0, -1):
|
for i in range(_cards.size() - 1, 0, -1):
|
||||||
var j := rng.randi_range(0, i)
|
var j := rng.randi_range(0, i)
|
||||||
var tmp := _cards[i]
|
var tmp := _cards[i]
|
||||||
_cards[i] = _cards[j]
|
_cards[i] = _cards[j]
|
||||||
_cards[j] = tmp
|
_cards[j] = tmp
|
||||||
|
|
||||||
func _shuffle_random() -> void:
|
func _shuffle_random() -> void:
|
||||||
_shuffle_with_seed(Time.get_unix_time_from_system() as int)
|
_shuffle_with_seed(Time.get_unix_time_from_system() as int)
|
||||||
|
|
||||||
func deal(count: int) -> Array[Card]:
|
func deal(count: int) -> Array[Card]:
|
||||||
var result: Array[Card] = []
|
var result: Array[Card] = []
|
||||||
var actual := mini(count, _cards.size())
|
var actual := mini(count, _cards.size())
|
||||||
for _i in range(actual):
|
for _i in range(actual):
|
||||||
result.append(_cards.pop_back())
|
result.append(_cards.pop_back())
|
||||||
return result
|
return result
|
||||||
|
|
||||||
func remaining() -> int:
|
func remaining() -> int:
|
||||||
return _cards.size()
|
return _cards.size()
|
||||||
|
|||||||
@@ -42,10 +42,10 @@ static func _gen_pairs(sorted: Array[Card], results: Array[HandEvaluator.Evaluat
|
|||||||
var rank_counts := {}
|
var rank_counts := {}
|
||||||
for c in sorted:
|
for c in sorted:
|
||||||
var rk := c.rank()
|
var rk := c.rank()
|
||||||
if not rank_counts.has(rk): rank_counts[rk] = []
|
if not rank_counts.has(rk): rank_counts[rk] = [] as Array[Card]
|
||||||
rank_counts[rk].append(c)
|
rank_counts[rk].append(c)
|
||||||
for rk in rank_counts:
|
for rk in rank_counts:
|
||||||
var cards: Array = rank_counts[rk]
|
var cards: Array[Card] = rank_counts[rk]
|
||||||
if cards.size() >= 2:
|
if cards.size() >= 2:
|
||||||
var ep := HandEvaluator.evaluate(cards.slice(0, 2), current_rank, config)
|
var ep := HandEvaluator.evaluate(cards.slice(0, 2), current_rank, config)
|
||||||
if ep != null: results.append(ep)
|
if ep != null: results.append(ep)
|
||||||
@@ -54,10 +54,10 @@ static func _gen_triples(sorted: Array[Card], results: Array[HandEvaluator.Evalu
|
|||||||
var rank_counts := {}
|
var rank_counts := {}
|
||||||
for c in sorted:
|
for c in sorted:
|
||||||
var rk := c.rank()
|
var rk := c.rank()
|
||||||
if not rank_counts.has(rk): rank_counts[rk] = []
|
if not rank_counts.has(rk): rank_counts[rk] = [] as Array[Card]
|
||||||
rank_counts[rk].append(c)
|
rank_counts[rk].append(c)
|
||||||
for rk in rank_counts:
|
for rk in rank_counts:
|
||||||
var cards: Array = rank_counts[rk]
|
var cards: Array[Card] = rank_counts[rk]
|
||||||
if cards.size() >= 3:
|
if cards.size() >= 3:
|
||||||
var ep := HandEvaluator.evaluate(cards.slice(0, 3), current_rank, config)
|
var ep := HandEvaluator.evaluate(cards.slice(0, 3), current_rank, config)
|
||||||
if ep != null: results.append(ep)
|
if ep != null: results.append(ep)
|
||||||
@@ -77,10 +77,10 @@ static func _gen_bombs(sorted: Array[Card], results: Array[HandEvaluator.Evaluat
|
|||||||
var rank_counts := {}
|
var rank_counts := {}
|
||||||
for c in sorted:
|
for c in sorted:
|
||||||
var rk := c.rank()
|
var rk := c.rank()
|
||||||
if not rank_counts.has(rk): rank_counts[rk] = []
|
if not rank_counts.has(rk): rank_counts[rk] = [] as Array[Card]
|
||||||
rank_counts[rk].append(c)
|
rank_counts[rk].append(c)
|
||||||
for rk in rank_counts:
|
for rk in rank_counts:
|
||||||
var cards: Array = rank_counts[rk]
|
var cards: Array[Card] = rank_counts[rk]
|
||||||
if cards.size() >= 4:
|
if cards.size() >= 4:
|
||||||
var ep := HandEvaluator.evaluate(cards.slice(0, 4), current_rank, config)
|
var ep := HandEvaluator.evaluate(cards.slice(0, 4), current_rank, config)
|
||||||
if ep != null: results.append(ep)
|
if ep != null: results.append(ep)
|
||||||
@@ -112,16 +112,16 @@ static func _gen_rocket(sorted: Array[Card], results: Array[HandEvaluator.Evalua
|
|||||||
var ep := HandEvaluator.evaluate(cards, current_rank, config)
|
var ep := HandEvaluator.evaluate(cards, current_rank, config)
|
||||||
if ep != null: results.append(ep)
|
if ep != null: results.append(ep)
|
||||||
|
|
||||||
static func _find_pairs(hand: Array[Card]) -> Array:
|
static func _find_pairs(hand: Array[Card]) -> Array[Array]:
|
||||||
var result := []
|
var result: Array[Array] = []
|
||||||
var rank_groups := {}
|
var rank_groups := {}
|
||||||
for c in hand:
|
for c in hand:
|
||||||
var rk := c.rank()
|
var rk := c.rank()
|
||||||
if not rank_groups.has(rk): rank_groups[rk] = []
|
if not rank_groups.has(rk): rank_groups[rk] = [] as Array[Card]
|
||||||
rank_groups[rk].append(c)
|
rank_groups[rk].append(c)
|
||||||
for rk in rank_groups:
|
for rk in rank_groups:
|
||||||
if rank_groups[rk].size() >= 2:
|
if rank_groups[rk].size() >= 2:
|
||||||
result.append(rank_groups[rk].slice(0, 2))
|
result.append(rank_groups[rk].slice(0, 2) as Array[Card])
|
||||||
return result
|
return result
|
||||||
|
|
||||||
static func _card_in(cards: Array[Card], target: Card) -> bool:
|
static func _card_in(cards: Array[Card], target: Card) -> bool:
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ extends GameController
|
|||||||
var _current_hint: HandEvaluator.EvaluatedPlay = null
|
var _current_hint: HandEvaluator.EvaluatedPlay = null
|
||||||
|
|
||||||
func get_hint() -> HandEvaluator.EvaluatedPlay:
|
func get_hint() -> HandEvaluator.EvaluatedPlay:
|
||||||
var hand := game_state.get_hand(game_state.round.active_player_idx)
|
var hand := game_state.get_hand(game_state.round.active_player_idx)
|
||||||
if hand.is_empty():
|
if hand.is_empty():
|
||||||
return null
|
return null
|
||||||
var ai := L2RuleAI.new()
|
var ai := L2RuleAI.new()
|
||||||
return ai.decide(hand, game_state.round.table, game_state.current_rank, game_state.rule_config)
|
return ai.decide(hand, game_state.round.table, game_state.current_rank, game_state.rule_config)
|
||||||
|
|
||||||
func get_all_legal_moves() -> Array:
|
func get_all_legal_moves() -> Array:
|
||||||
var hand := game_state.get_hand(game_state.round.active_player_idx)
|
var hand := game_state.get_hand(game_state.round.active_player_idx)
|
||||||
return MoveGenerator.generate(hand, game_state.current_rank, game_state.rule_config)
|
return MoveGenerator.generate(hand, game_state.current_rank, game_state.rule_config)
|
||||||
|
|||||||
Reference in New Issue
Block a user