diff --git a/growth/BaseCard/BaseCard.gd b/growth/BaseCard/BaseCard.gd index 6997bb3..d1c20d2 100644 --- a/growth/BaseCard/BaseCard.gd +++ b/growth/BaseCard/BaseCard.gd @@ -19,3 +19,13 @@ func activate(world, activator): for behavior in $Behaviors.get_children(): behavior.activate(world, activator) +func discard(world, activator): + for behavior in $Behaviors.get_children(): + behavior.discard(world, activator) + behavior.ammo = behavior.max_ammo + +func get_ammo(): + for behavior in $Behaviors.get_children(): + if behavior.has_method("get_ammo"): + return behavior.get_ammo() + return -1 diff --git a/growth/hand.gd b/growth/hand.gd index 1061c23..0070a3d 100644 --- a/growth/hand.gd +++ b/growth/hand.gd @@ -2,31 +2,33 @@ extends Control @export var player: NodePath @export var world: NodePath -@export var drawpile: Array[PackedScene] = [ - preload("res://Cards/FirewallCard.tscn"), - preload("res://Cards/FirewallCard.tscn"), - preload("res://Cards/CursorGunCard.tscn"), - preload("res://Cards/CursorGunCard.tscn"), - preload("res://Cards/DashCard.tscn"), - preload("res://Cards/DashCard.tscn"), - #preload("res://Cards/ShieldCard.tscn"), - #preload("res://Cards/ShieldCard.tscn"), - #preload("res://Cards/OverclockCard.tscn"), - #preload("res://Cards/OverclockCard.tscn"), +@export var hand_size = 3 +@export var drawpile: Array = [ + preload("res://Cards/FirewallCard.tscn").instantiate(), + preload("res://Cards/FirewallCard.tscn").instantiate(), + preload("res://Cards/CursorGunCard.tscn").instantiate(), + preload("res://Cards/CursorGunCard.tscn").instantiate(), + preload("res://Cards/DashCard.tscn").instantiate(), + preload("res://Cards/DashCard.tscn").instantiate(), + #preload("res://Cards/ShieldCard.tscn").instantiate(), + #preload("res://Cards/ShieldCard.tscn").instantiate(), + #preload("res://Cards/OverclockCard.tscn").instantiate(), + #preload("res://Cards/OverclockCard.tscn").instantiate(), ] - + var active_card_index = 0 -const discard_pile = []; +var discard_pile = []; func _ready() -> void: - for card in drawpile: - card.instantiate() drawpile.shuffle(); - #for i in range(get_node(player).hand_size): - #draw_card() + print_debug("Shuffled deck, drawpile size: " + str(drawpile.size())) + print_debug("Empty card slots: " + str(hand_size) + " - " + str(get_cards().size()) + " = " + str(hand_size - get_cards().size())) + # print_debug("Drawing initial hand") + for i in range(hand_size - get_cards().size()): + draw_card() -func _process(delta): +func _process(_delta): if Input.is_action_pressed("play_card"): play_card() if Input.is_action_just_pressed("cycle_card_left"): @@ -39,35 +41,52 @@ func play_card(): if active_card_index >= 0 and active_card_index < slots.size(): var card = slots[active_card_index].get_node("Card") card.activate(get_node(world), get_node(player)); + if card.ammo <= 0: + discard(false); + print(active_card_index) -func discard(): +func discard(do_ability = true): var cards = get_cards(); if active_card_index >= 0 and active_card_index < cards.size(): var card = cards[active_card_index] - card.discard(get_node(world), get_node(player)) + if do_ability: + card.discard(get_node(world), get_node(player)) discard_pile.append(card) - get_card_container().remove_child(card) + card.get_parent().remove_child(card) #active_card_index = min(active_card_index, hand.size() - 1); draw_card(); func cycle_card(index_shift): - #if hand.size() > 0: - #active_card_index = (active_card_index + index_shift) % hand.size(); - #else: - #draw_card(); - pass + if get_cards().size() > 0: + active_card_index = (active_card_index + index_shift) % get_cards().size(); + else: + draw_card(); func draw_card(): - if drawpile.size() == 0: + print_debug("Drawing card") + var held_card_count = get_cards().size() + if held_card_count == 0: shuffle_deck(); - if drawpile.size() > 0 and get_cards().size() < get_node(player).hand_size: - var card = drawpile.pop_back(); - if active_card_index == -1: - active_card_index = 0; - get_card_container().add_child(card) + if drawpile.size() > 0 and held_card_count < hand_size: + for i in range(hand_size - held_card_count): + var card = drawpile.pop_back(); + if active_card_index == -1: + active_card_index = 0; + print_debug("Instantiating card from drawpile, remaining size: " + str(drawpile.size())) + var empty_slots = get_card_container().get_children().filter(func(slot): return not slot.has_method("get_node") or slot.get_node_or_null("Card") == null) + if empty_slots.size() > 0: + empty_slots[0].add_child(card) + else: + var first_filled_slot_index = -1 + var slots = get_card_container().get_children() + for i in range(slots.size()): + if slots[i].has_method("get_node") and slots[i].get_node_or_null("Card") != null: + first_filled_slot_index = i + break + active_card_index = first_filled_slot_index # TODO: Reboot mechanics func shuffle_deck(): @@ -77,7 +96,7 @@ func shuffle_deck(): active_card_index = 0; func get_cards() -> Array: - return get_card_container().get_children() + return get_card_container().get_children().map(func(c): return c.get_node_or_null("Card")).filter(func(c): return c != null) func get_card_container(): return $HBoxContainer diff --git a/growth/hand.tscn b/growth/hand.tscn index 251e315..69724f0 100644 --- a/growth/hand.tscn +++ b/growth/hand.tscn @@ -1,8 +1,6 @@ -[gd_scene load_steps=4 format=3 uid="uid://co8jnr2dew5ts"] +[gd_scene load_steps=2 format=3 uid="uid://cpp7v4jp8kt74"] [ext_resource type="Script" uid="uid://bykc0ufv25ij5" path="res://hand.gd" id="1_u4p2i"] -[ext_resource type="PackedScene" uid="uid://cmuig2rqt65f3" path="res://Cards/CursorGunCard.tscn" id="2_bfasp"] -[ext_resource type="PackedScene" uid="uid://dck7bp1b7553t" path="res://Cards/MineCard.tscn" id="2_e75s6"] [node name="Hand" type="Control"] layout_mode = 3 @@ -38,17 +36,8 @@ grow_vertical = 0 [node name="Slot1" type="PanelContainer" parent="HBoxContainer"] layout_mode = 2 -[node name="Card" parent="HBoxContainer/Slot1" instance=ExtResource("2_e75s6")] -layout_mode = 2 - [node name="Slot2" type="PanelContainer" parent="HBoxContainer"] layout_mode = 2 -[node name="Card" parent="HBoxContainer/Slot2" instance=ExtResource("2_bfasp")] -layout_mode = 2 - [node name="Slot3" type="PanelContainer" parent="HBoxContainer"] layout_mode = 2 - -[node name="Card" parent="HBoxContainer/Slot3" instance=ExtResource("2_bfasp")] -layout_mode = 2 diff --git a/growth/level.tscn b/growth/level.tscn index e019d92..ad366e0 100644 --- a/growth/level.tscn +++ b/growth/level.tscn @@ -4,7 +4,7 @@ [ext_resource type="PackedScene" uid="uid://bsv3h2lpv7h77" path="res://virus.tscn" id="2_oi3di"] [ext_resource type="PackedScene" uid="uid://bldi3fw0vmlu3" path="res://music.tscn" id="3_oi3di"] [ext_resource type="TileSet" uid="uid://c20bl25rqyf68" path="res://assets/tiles/new_tile_set.tres" id="4_0b4ue"] -[ext_resource type="PackedScene" uid="uid://co8jnr2dew5ts" path="res://hand.tscn" id="5_f2txt"] +[ext_resource type="PackedScene" uid="uid://cpp7v4jp8kt74" path="res://hand.tscn" id="5_f2txt"] [node name="Level" type="Node2D"] @@ -15,7 +15,6 @@ tile_set = ExtResource("4_0b4ue") [node name="Player" parent="." instance=ExtResource("1_vonw3")] position = Vector2(-1200, 0) -hand = [null] [node name="Virus" parent="." instance=ExtResource("2_oi3di")] @@ -25,3 +24,4 @@ scale = Vector2(2, 2) [node name="CanvasLayer" type="CanvasLayer" parent="."] [node name="Hand" parent="CanvasLayer" instance=ExtResource("5_f2txt")] +unique_name_in_owner = true diff --git a/growth/player.gd b/growth/player.gd index c41b943..4d8d171 100644 --- a/growth/player.gd +++ b/growth/player.gd @@ -6,16 +6,15 @@ enum MoveState {Still, Moving, Dashing, Knockback} @export var speed = 200 # How fast the player will move (pixels/sec). @export var dash_cooldown = 0.3 -@export var hand_size = 3 @onready var camera: Camera2D = %PlayerCamera @onready var sprite: AnimatedSprite2D = $PlayerSprite +@onready var hand: Control = %Hand; var shield_active = true; var move_direction = Vector2.ZERO; var target = Vector2.ZERO # The position of the player's cursor. -@export var hand: Control; var screen_size # Size of the game window. var action_state = ActionState.None @@ -65,27 +64,14 @@ func charge(): charge_level = max(charge_level - charge_rate * 2, 0); func dash(): - var card = hand.get_active_card(); - if not card or dash_on_cooldown: + if dash_on_cooldown: return; - hand.discard(self); # Must set move_state at start and end of dash + hand.discard(); # Must set move_state at start and end of dash dash_on_cooldown = true; -func draw_card(): - #if drawpile.size() == 0: - #shuffle_deck(); - #if drawpile.size() > 0 and hand.size() < hand_size: - #var card = drawpile.pop_back(); - #hand.append(card); - #if active_card_index == -1: - #active_card_index = 0; - pass - func _ready(): screen_size = get_viewport_rect().size - #while (hand.size() < hand_size and drawpile.size() > 0): - #draw_card(); func _process(delta): update_target_coords();