Added Card Preview

This commit is contained in:
2ManyProjects 2025-03-02 23:12:40 -06:00
parent 425819641d
commit 3d5aa8ade7
6 changed files with 245 additions and 4 deletions

View file

@ -0,0 +1,83 @@
extends Panel
class_name CardPreviewPanel
# Node references
@onready var card_name_label = $CardContent/CardNameLabel
@onready var rank_label = $CardContent/RankLabel
@onready var description_label = $CardContent/DescriptionLabel
@onready var unit_list_label = $CardContent/UnitListLabel
@onready var effect_type_label = $CardContent/EffectTypeLabel
@onready var duration_label = $CardContent/DurationLabel
# Card rank colors (same as other card components)
var rank_colors = {
Card.Rank.RANK_0: Color(0.9, 0.1, 0.1, 1.0), # Red
Card.Rank.RANK_1: Color(0.9, 0.6, 0.1, 1.0), # Orange
Card.Rank.RANK_2: Color(0.1, 0.7, 0.1, 1.0), # Green
Card.Rank.RANK_3: Color(0.1, 0.7, 0.9, 1.0) # Blue
}
# Effect type descriptions
var effect_type_names = {
Card.EffectType.MOVEMENT_MODIFIER: "Movement Modifier",
Card.EffectType.BOARD_EFFECT: "Board Effect",
Card.EffectType.PIECE_EFFECT: "Piece Effect",
Card.EffectType.SPECIAL_ACTION: "Special Action"
}
func _ready():
# Hide the preview initially
visible = false
func preview_card(card: Card):
if !card:
hide_preview()
return
# Update all card information
card_name_label.text = card.cardName
# Set rank information
var rank_text = "Rank " + str(card.rank)
match card.rank:
Card.Rank.RANK_0:
rank_text += " (One-time use, removed from deck)"
Card.Rank.RANK_1:
rank_text += " (Once per match)"
Card.Rank.RANK_2:
rank_text += " (Discarded after use)"
Card.Rank.RANK_3:
rank_text += " (Reused)"
rank_label.text = rank_text
# Set rank color
if card.rank in rank_colors:
rank_label.add_theme_color_override("font_color", rank_colors[card.rank])
card_name_label.add_theme_color_override("font_color", rank_colors[card.rank])
# Set description
description_label.text = card.description
# Set unit whitelist
if card.unitWhitelist.is_empty():
unit_list_label.text = "Can be applied to: Any piece"
else:
unit_list_label.text = "Can be applied to: " + ", ".join(card.unitWhitelist)
# Set effect type
if card.effectType in effect_type_names:
effect_type_label.text = "Effect Type: " + effect_type_names[card.effectType]
else:
effect_type_label.text = "Effect Type: Unknown"
# Set duration
if card.duration > 0:
duration_label.text = "Duration: " + str(card.duration) + " turns"
else:
duration_label.text = "Duration: Instant"
# Show the preview
visible = true
func hide_preview():
visible = false

View file

@ -19,10 +19,18 @@ var rank_colors = {
func _ready():
# Connect signals for interaction
custom_minimum_size = Vector2(0, 40) # Ensure it has enough height
size_flags_horizontal = SIZE_EXPAND_FILL
mouse_filter = Control.MOUSE_FILTER_STOP
gui_input.connect(_on_gui_input)
if card_frame:
card_frame.mouse_filter = Control.MOUSE_FILTER_PASS
if rank_label:
rank_label.mouse_filter = Control.MOUSE_FILTER_PASS
if card_name_label:
card_name_label.mouse_filter = Control.MOUSE_FILTER_PASS
# Connect GUI input signal
gui_input.connect(_on_gui_input)
func set_card(card):
current_card = card

View file

@ -29,6 +29,10 @@ func _ready():
gui_input.connect(_on_gui_input)
if card_border:
card_border.mouse_filter = Control.MOUSE_FILTER_PASS
for child in get_children():
if child is Control:
child.mouse_filter = Control.MOUSE_FILTER_PASS
func set_card(card):
current_card = card

View file

@ -7,6 +7,7 @@ signal back_pressed
@onready var deckGrid = $MainContainer/GridScrollContainer/GridContainer
@onready var bankContainer = $MainContainer/BankContainer/ScrollContainer/VBoxContainer
@onready var backButton = $BackButton
@onready var card_preview = $CardPreviewPanel
# Default deck size (can be overridden via options)
var maxDeckSize = 35
@ -15,12 +16,16 @@ var bankCards = [] # Cards available but not in deck
# The current deck
var currentDeck = []
var current_preview_card = null
func _ready():
# Connect back button
if backButton:
backButton.connect("pressed", Callable(self, "_on_backButton_pressed"))
if card_preview:
card_preview.visible = false
func initialize(options = null):
# Process options if provided
@ -68,7 +73,7 @@ func setupDeckGrid():
child.queue_free()
# Calculate grid dimensions
var cols = 7 #check screen to deteremine
var cols = 4 #check screen to deteremine
var rows = maxDeckSize / cols
deckGrid.columns = cols
@ -79,6 +84,7 @@ func setupDeckGrid():
# Connect signals
card_slot.connect("card_selected", Callable(self, "_on_deck_card_selected"))
_connect_hover_signals(card_slot)
# Set card if available
if i < currentDeck.size():
@ -86,6 +92,13 @@ func setupDeckGrid():
else:
card_slot.clear()
func _connect_hover_signals(node):
# Add hover signals for preview functionality
if node.is_class("Control"):
node.mouse_entered.connect(Callable(self, "_on_card_mouse_entered").bind(node))
# node.mouse_exited.connect(Callable(self, "_on_card_mouse_exited").bind(node))
func populateBank():
# Clear existing children
for child in bankContainer.get_children():
@ -97,6 +110,7 @@ func populateBank():
bankContainer.add_child(card_item)
card_item.set_card(card)
card_item.connect("card_selected", Callable(self, "_on_bank_card_selected"))
_connect_hover_signals(card_item)
func _on_deck_card_selected(card_slot, card):
if card:
@ -111,6 +125,8 @@ func _on_deck_card_selected(card_slot, card):
# Update UI
card_slot.clear()
populateBank()
if current_preview_card == card:
hide_card_preview()
func _on_bank_card_selected(card_item, card):
print("_on_bank_card_selected")
@ -135,6 +151,39 @@ func _on_bank_card_selected(card_item, card):
deckGrid.get_child(empty_slot_index).set_card(card)
populateBank()
func _on_card_mouse_entered(node):
var card = null
# Get the card from the node
if node.has_method("has_card") and node.has_card():
# This is a CardSlot
card = node.current_card
elif node.has_method("set_card") and node.current_card:
# This is a CardBankItem
card = node.current_card
if card:
show_card_preview(card)
# func _on_card_mouse_exited(node):
# # Add a short delay before hiding the preview
# # This prevents flickering when moving between cards
# await get_tree().create_timer(0.1).timeout
# # Only hide if we're not hovering over another card that shows the same preview
# if current_preview_card:
# hide_card_preview()
func show_card_preview(card):
if card_preview and card:
current_preview_card = card
card_preview.preview_card(card)
func hide_card_preview():
if card_preview:
current_preview_card = null
card_preview.hide_preview()
func saveDeck():
if deckManager:
# Save the current deck to the deck manager

84
card_preview_panel.tscn Normal file
View file

@ -0,0 +1,84 @@
[gd_scene load_steps=3 format=3 uid="uid://xxxxxxxx"]
[ext_resource type="Script" path="res://Systems/CardPreviewPanel.gd" id="1_ykslh"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ykslh"]
bg_color = Color(0.08, 0.08, 0.12, 0.95)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(0.2, 0.2, 0.25, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[node name="CardPreviewPanel" type="Panel"]
custom_minimum_size = Vector2(300, 400)
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = -900.0
offset_bottom = -320.0
grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_ykslh")
script = ExtResource("1_ykslh")
[node name="CardContent" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 20.0
offset_top = 20.0
offset_right = -20.0
offset_bottom = -20.0
grow_horizontal = 2
grow_vertical = 2
[node name="CardNameLabel" type="Label" parent="CardContent"]
layout_mode = 2
theme_override_font_sizes/font_size = 24
text = "Card Name"
horizontal_alignment = 1
[node name="HSeparator" type="HSeparator" parent="CardContent"]
layout_mode = 2
[node name="RankLabel" type="Label" parent="CardContent"]
layout_mode = 2
theme_override_font_sizes/font_size = 18
text = "Rank 3 (Reused)"
horizontal_alignment = 1
autowrap_mode = 3
[node name="HSeparator2" type="HSeparator" parent="CardContent"]
layout_mode = 2
theme_override_constants/separation = 10
[node name="DescriptionLabel" type="RichTextLabel" parent="CardContent"]
layout_mode = 2
size_flags_vertical = 3
theme_override_font_sizes/normal_font_size = 16
text = "Card description goes here. This will explain what the card does when played."
fit_content = true
[node name="HSeparator3" type="HSeparator" parent="CardContent"]
layout_mode = 2
theme_override_constants/separation = 10
[node name="EffectTypeLabel" type="Label" parent="CardContent"]
layout_mode = 2
text = "Effect Type: Movement Modifier"
[node name="UnitListLabel" type="Label" parent="CardContent"]
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
text = "Can be applied to: Any piece"
autowrap_mode = 3
[node name="DurationLabel" type="Label" parent="CardContent"]
layout_mode = 2
text = "Duration: 3 turns"

View file

@ -1,6 +1,7 @@
[gd_scene load_steps=3 format=3 uid="uid://c7uqbcxdjoais"]
[gd_scene load_steps=4 format=3 uid="uid://c7uqbcxdjoais"]
[ext_resource type="Script" path="res://Systems/Game/DeckManagerScreen.gd" id="1_gokg4"]
[ext_resource type="PackedScene" uid="uid://xxxxxxxx" path="res://card_preview_panel.tscn" id="3_abcde"]
[ext_resource type="Script" path="res://Systems/Game/GameMenuButton.gd" id="4_gokg4"]
[node name="DeckManagerScreen" type="Control"]
@ -32,12 +33,24 @@ theme_override_font_sizes/font_size = 36
text = "DECK MANAGER"
horizontal_alignment = 1
[node name="CardPreviewPanel" parent="." instance=ExtResource("3_abcde")]
layout_mode = 2
anchors_preset = 0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 20.0
offset_top = 100.0
offset_right = 320.0
offset_bottom = 588.0
grow_horizontal = 1
grow_vertical = 1
[node name="MainContainer" type="HBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 20.0
offset_left = 325.0
offset_top = 100.0
offset_right = -20.0
offset_bottom = -60.0