tcg/player_side.gd

221 lines
7.3 KiB
GDScript3
Raw Normal View History

2025-01-25 11:57:55 +07:00
extends Control
signal play_card(card: Card)
signal rps_move(move: String)
@export var player_id: int
@export var deck: Container
@export var energy_label: Label
2025-01-26 01:58:35 +07:00
@export var skip_card_prefab: PackedScene
@export var support_red_card_prefab: PackedScene
@export var support_green_card_prefab: PackedScene
@export var monster_card_prefab: PackedScene
2025-01-26 10:36:55 +07:00
@export var rps_button_container: Container
@export var rps_grayed_color: Color
2025-01-26 01:58:35 +07:00
@onready var monster_card_ui := $"MonsterCard"
@onready var support1_green := $"Support1GreenCard"
@onready var support2_green := $"Support2GreenCard"
@onready var support2_red := $"Support2RedCard"
@onready var incoming_damage_label := $"IncomingDamageLabel"
2025-01-25 11:57:55 +07:00
var match_manager: MatchManager
2025-01-25 18:47:56 +07:00
var show_buttons: bool
var signal_connected: bool
2025-01-26 01:58:35 +07:00
var selected_card: Control
2025-01-25 11:57:55 +07:00
2025-01-26 11:14:32 +07:00
var hovering_cards_this_frame: Array[Control] = []
var hovering_cards_duration: Dictionary = {}
const original_hover_position = 50 # hard coded idk what's a good way to find this value
const hover_animation_time = 0.1
const hover_height_offset = -50
const selected_height_offset = -100
2025-01-25 18:47:56 +07:00
func attach(match_manager: MatchManager, show_buttons: bool = true):
self.show_buttons = show_buttons
2025-01-25 11:57:55 +07:00
self.match_manager = match_manager
2025-01-25 18:47:56 +07:00
if !signal_connected:
match_manager.state_transitioned.connect(_on_update)
signal_connected = true
2025-01-25 11:57:55 +07:00
2025-01-26 01:58:35 +07:00
func _ready():
monster_card_ui.visible = false
support1_green.visible = false
support2_green.visible = false
support2_red.visible = false
incoming_damage_label.visible = false
2025-01-26 02:32:21 +07:00
for child in deck.get_children():
child.queue_free()
2025-01-26 01:58:35 +07:00
2025-01-25 11:57:55 +07:00
func _on_update(transition):
2025-01-26 11:14:32 +07:00
hovering_cards_duration.clear()
2025-01-26 01:58:35 +07:00
selected_card = null
incoming_damage_label.visible = true
2025-01-26 01:58:35 +07:00
2025-01-25 11:57:55 +07:00
for child in deck.get_children():
child.queue_free()
var player: MatchPlayer = match_manager.players.get(player_id) as MatchPlayer
if not player:
return
energy_label.text = "Energy: " + str(player.energy)
2025-01-26 01:58:35 +07:00
2025-01-26 07:15:58 +07:00
if match_manager.players[player.id].active_support_cards.size() > 0:
2025-01-26 01:58:35 +07:00
support1_green.visible = true
2025-01-26 07:15:58 +07:00
support1_green.card = match_manager.players[player.id].active_support_cards[0]
2025-01-26 01:58:35 +07:00
else:
support1_green.visible = false
2025-01-26 07:15:58 +07:00
if match_manager.players[player.id].active_support_cards.size() > 1:
var card: SupportCard = match_manager.players[player.id].active_support_cards[1]
2025-01-26 01:58:35 +07:00
if card.type == "green":
support2_green.visible = true
support2_green.card = card
else:
support2_red.visible = true
support2_red.card = card
else:
support2_green.visible = false
support2_red.visible = false
2025-01-25 11:57:55 +07:00
var monster = player.monster
2025-01-26 01:58:35 +07:00
2025-01-25 11:57:55 +07:00
if monster:
2025-01-26 01:58:35 +07:00
monster_card_ui.visible = true
monster_card_ui.show_monster(monster)
2025-01-26 11:32:17 +07:00
incoming_damage_label.text = "HP " + ("+0" if monster.health_delta == 0 else str(monster.health_delta))
2025-01-26 11:01:55 +07:00
2025-01-26 01:58:35 +07:00
else:
monster_card_ui.visible = false
2025-01-25 11:57:55 +07:00
if match_manager.phase in [Match.Phase.SUMMON, Match.Phase.SUPPORT_1, Match.Phase.SUPPORT_2]:
2025-01-25 18:47:56 +07:00
if (
match_manager.phase != Match.Phase.SUMMON && show_buttons
) or (
match_manager.phase == Match.Phase.SUMMON and player.monster and player.monster.health > 0 && show_buttons
):
2025-01-26 01:58:35 +07:00
var skip_btn:CardBase = skip_card_prefab.instantiate()
skip_btn.left_clicked.connect(func ():
_pop_this_card(skip_btn)
play_card.emit(null))
2025-01-26 11:14:32 +07:00
skip_btn.hovering.connect(func (delta): _do_hover(skip_btn, delta))
2025-01-25 18:47:56 +07:00
deck.add_child(skip_btn)
2025-01-25 11:57:55 +07:00
for card: Card in player.hand:
2025-01-25 18:47:56 +07:00
#if match_manager.phase == Match.Phase.SUMMON and card is not MonsterCard:
#continue
#if (match_manager.phase == Match.Phase.SUPPORT_1 or match_manager.phase == Match.Phase.SUPPORT_2) and card is not SupportCard:
#continue
#if match_manager.phase == Match.Phase.SUPPORT_1 and card.type == "red":
#continue
if !show_buttons :
2025-01-25 11:57:55 +07:00
continue
2025-01-25 18:47:56 +07:00
2025-01-26 01:58:35 +07:00
var is_disabled = (
2025-01-25 11:57:55 +07:00
card is MonsterCard and match_manager.phase != Match.Phase.SUMMON
) or (
card is SupportCard and match_manager.phase != Match.Phase.SUPPORT_1 and match_manager.phase != Match.Phase.SUPPORT_2
) or (
card is SupportCard and card.type == "red" and match_manager.phase != Match.Phase.SUPPORT_2
2025-01-25 18:47:56 +07:00
) or (
card is MonsterCard and match_manager.phase == Match.Phase.SUMMON and player.monster and player.monster.health > 0
2025-01-25 11:57:55 +07:00
)
2025-01-26 01:58:35 +07:00
var btn: CardBase = null
if card is MonsterCard:
var monster_card:MonsterCardUI = monster_card_prefab.instantiate()
monster_card.show_monster(MatchMonster.new(card, card.base_health, 0))
if !is_disabled:
monster_card.left_clicked.connect(func ():
_pop_this_card(monster_card)
play_card.emit(card))
2025-01-26 11:14:32 +07:00
monster_card.hovering.connect(func (delta): _do_hover(monster_card, delta))
2025-01-26 01:58:35 +07:00
deck.add_child(monster_card)
elif card is SupportCard and card.type == "red":
btn = support_red_card_prefab.instantiate()
btn.card = card
deck.add_child(btn)
else:
btn = support_green_card_prefab.instantiate()
btn.card = card
deck.add_child(btn)
if btn and !is_disabled:
btn.left_clicked.connect(func ():
_pop_this_card(btn)
play_card.emit(card))
2025-01-26 11:14:32 +07:00
btn.hovering.connect(func (delta): _do_hover(btn, delta))
2025-01-26 10:36:55 +07:00
if rps_button_container:
rps_button_container.visible = match_manager.phase == Match.Phase.RPS
for button: TextureButton in rps_button_container.get_children():
button.modulate = rps_grayed_color
2025-01-26 01:58:35 +07:00
func _pop_this_card(control: Control):
if selected_card:
2025-01-26 11:14:32 +07:00
selected_card.position = Vector2(selected_card.position.x, original_hover_position)
2025-01-25 11:57:55 +07:00
2025-01-26 01:58:35 +07:00
selected_card = control
2025-01-26 11:14:32 +07:00
selected_card.position = Vector2(selected_card.position.x, original_hover_position + selected_height_offset)
func _do_hover(control: Control, delta: float):
if control == selected_card:
if control in hovering_cards_duration:
hovering_cards_duration.erase(control)
return
var duration: float
if control in hovering_cards_duration:
duration = hovering_cards_duration[control]
duration = clampf(duration + delta, 0, hover_animation_time)
hovering_cards_duration[control] = duration
else:
hovering_cards_duration[control] = delta
duration = delta
var height = lerpf(0, hover_height_offset, duration / hover_animation_time) + original_hover_position
control.position = Vector2(control.position.x, height)
hovering_cards_this_frame.append(control)
func _process(delta):
for card in hovering_cards_duration.keys():
if !card or card in hovering_cards_this_frame:
continue
var duration = hovering_cards_duration[card]
duration = maxf(0, duration - delta)
var height = lerpf(0, hover_height_offset, duration / hover_animation_time) + original_hover_position
card.position = Vector2(card.position.x, height)
if duration == 0:
hovering_cards_duration.erase(card)
else:
hovering_cards_duration[card] = duration
hovering_cards_this_frame.clear()
2025-01-26 10:36:55 +07:00
func _on_kertas_button_button_down() -> void:
rps_move.emit("paper")
for button: TextureButton in rps_button_container.get_children():
button.modulate = rps_grayed_color
rps_button_container.get_node("KertasButton").modulate = Color.WHITE
func _on_gunting_button_button_down() -> void:
rps_move.emit("scissors")
for button: TextureButton in rps_button_container.get_children():
button.modulate = rps_grayed_color
rps_button_container.get_node("GuntingButton").modulate = Color.WHITE
func _on_batu_button_button_down() -> void:
rps_move.emit("rock")
for button: TextureButton in rps_button_container.get_children():
button.modulate = rps_grayed_color
rps_button_container.get_node("BatuButton").modulate = Color.WHITE