135 lines
4.2 KiB
GDScript
135 lines
4.2 KiB
GDScript
extends Control
|
|
class_name DemoGame
|
|
|
|
signal own_played_card(card: Card)
|
|
signal opponent_played_card(card: Card)
|
|
signal own_played_rts(move: String)
|
|
signal opponent_played_rts(move: String)
|
|
|
|
@export var player_1_deck: Array[Card]
|
|
@export var player_2_deck: Array[Card]
|
|
|
|
@onready var match_manager: MatchManager = $MatchManager
|
|
@onready var own_side = $Own
|
|
@onready var opponent_side = $Opponent
|
|
@onready var start_game_btn = $StartGameButton
|
|
@onready var win_lose_tie_label: Label = $"Win-Lose-Tie"
|
|
|
|
var id_to_card: Dictionary = {}
|
|
|
|
var player_action_queue: Dictionary
|
|
var player_1_action: Action:
|
|
get:
|
|
return player_action_queue.get(own_side.player_id)
|
|
set(value):
|
|
player_action_queue[own_side.player_id] = value
|
|
var player_2_action: Action:
|
|
get:
|
|
return player_action_queue.get(opponent_side.player_id)
|
|
set(value):
|
|
player_action_queue[opponent_side.player_id] = value
|
|
|
|
var id
|
|
var signal_connected := false
|
|
|
|
func _ready() -> void:
|
|
_update_phase_info(Match.Phase.PREGAME)
|
|
|
|
func init(player_id: int) -> void:
|
|
id = player_id
|
|
|
|
own_side.player_id = player_id
|
|
opponent_side.player_id = MatchManager.PLAYER_2_ID if player_id == MatchManager.PLAYER_1_ID else MatchManager.PLAYER_1_ID
|
|
|
|
id_to_card.clear()
|
|
|
|
var cards = player_1_deck.duplicate()
|
|
cards.append_array(player_2_deck)
|
|
for card in cards:
|
|
if card.id not in id_to_card:
|
|
id_to_card[card.id] = card
|
|
|
|
print(match_manager.phase)
|
|
match_manager.init({
|
|
MatchManager.PLAYER_1_ID: player_1_deck,
|
|
MatchManager.PLAYER_2_ID: player_2_deck
|
|
}, own_side.player_id, opponent_side.player_id)
|
|
own_side.attach(match_manager, true)
|
|
opponent_side.attach(match_manager, false)
|
|
|
|
if !signal_connected:
|
|
match_manager.state_transitioned.connect(_on_match_manager_state_transitioned)
|
|
signal_connected = true
|
|
|
|
var transition_history: Array[PhaseTransition] = []
|
|
func _on_match_manager_state_transitioned(transition: PhaseTransition):
|
|
start_game_btn.visible = match_manager.phase == Match.Phase.PREGAME
|
|
transition_history.append(transition)
|
|
_update_phase_info(transition.to)
|
|
if transition.to == Match.Phase.END:
|
|
var game_ended_event: EventGameEnded = transition.events.filter(func (it): return it is EventGameEnded)[0]
|
|
win_lose_tie_label.text = "TIE" if game_ended_event.winner_player_id == -1 else "YOU WON!" if game_ended_event.winner_player_id == id else "YOU LOST!"
|
|
win_lose_tie_label.visible = true
|
|
print("Phase: ", Match.phase_to_str(transition.from), " -> ", Match.phase_to_str(transition.to))
|
|
|
|
func _on_start_game_button_button_up() -> void:
|
|
#match_manager.resolve({})
|
|
pass
|
|
|
|
func rpc_start_game() -> void:
|
|
match_manager.resolve({})
|
|
|
|
func _on_own_play_card(card: Card) -> void:
|
|
if card:
|
|
player_1_action = ActionPlayCard.new(card)
|
|
own_played_card.emit(card)
|
|
else:
|
|
player_1_action = ActionSkipCard.new()
|
|
own_played_card.emit(null)
|
|
|
|
print(id, " _on_own_play_card", player_1_action, player_2_action)
|
|
|
|
if player_2_action:
|
|
match_manager.resolve(player_action_queue)
|
|
player_action_queue.clear()
|
|
|
|
func rpc_opponent_play_card(id: String) -> void:
|
|
if !id.is_empty():
|
|
var card = id_to_card[id]
|
|
player_2_action = ActionPlayCard.new(card)
|
|
else:
|
|
player_2_action = ActionSkipCard.new()
|
|
|
|
print(self.id , " rpc_opponent_play_card", player_1_action, player_2_action)
|
|
|
|
if player_1_action:
|
|
match_manager.resolve(player_action_queue)
|
|
player_action_queue.clear()
|
|
|
|
func _on_own_rps_move(move: String) -> void:
|
|
player_1_action = ActionRPSMove.new(move)
|
|
own_played_rts.emit(move)
|
|
|
|
print(id, " _on_own_rps_move", player_1_action, player_2_action, move)
|
|
|
|
if player_2_action:
|
|
match_manager.resolve(player_action_queue)
|
|
player_action_queue.clear()
|
|
|
|
func rpc_opponent_rps_move(move: String) -> void:
|
|
player_2_action = ActionRPSMove.new(move)
|
|
|
|
print(id, " rpc_opponent_rps_move", player_1_action, player_2_action, move)
|
|
|
|
if player_1_action:
|
|
match_manager.resolve(player_action_queue)
|
|
player_action_queue.clear()
|
|
|
|
func _update_phase_info(phase: Match.Phase):
|
|
var phaseHeaders: Container = get_node("%PhaseInfo/PhaseHeader")
|
|
for child: Label in phaseHeaders.get_children():
|
|
child.modulate = Color.DIM_GRAY
|
|
var target = phaseHeaders.get_node(Match.phase_to_str(phase))
|
|
phaseHeaders.visible = target != null
|
|
if target:
|
|
target.modulate = Color.WHITE
|