diff --git a/collector/universal_collector.gd b/collector/universal_collector.gd new file mode 100644 index 0000000..903f8ef --- /dev/null +++ b/collector/universal_collector.gd @@ -0,0 +1,30 @@ +extends Area2D +class_name UniversalCollector +## Area that will pick up all [Collectible]s which enter inside it. + + +## The current amount of collected entities. +var collected_count: int = 0 + +## The goal amount of entities to collect. +## +## When [collected_count] reaches it, it will be reset to zero, and the "goal" signal will be emitted. +@export var collecting_amount: int + +## The collector has picked up an object. +signal collected(body: PhysicsBody2D) + +## The collector has received its collection goal and is about to reset. +signal goal + + +func _on_body_entered(body: Node2D): + if body is PhysicsBody2D: + var collectible: Collectible = body.find_child("Collectible") + if collectible: + collected_count += 1 + collectible.collect() + emit_signal("collected", body) + if collected_count >= collecting_amount: + emit_signal("goal") + collected_count = 0 diff --git a/collector/universal_collector.tscn b/collector/universal_collector.tscn new file mode 100644 index 0000000..488c7a0 --- /dev/null +++ b/collector/universal_collector.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://c2rlx7egl7xiv"] + +[ext_resource type="Script" path="res://collector/universal_collector.gd" id="1_xn6rb"] + +[node name="UniversalCollector" type="Area2D"] +script = ExtResource("1_xn6rb") + +[connection signal="body_entered" from="." to="." method="_on_body_entered"] diff --git a/entity/diamond.png b/entity/gem/diamond.png similarity index 100% rename from entity/diamond.png rename to entity/gem/diamond.png diff --git a/entity/diamond.png.import b/entity/gem/diamond.png.import similarity index 72% rename from entity/diamond.png.import rename to entity/gem/diamond.png.import index 56ce840..8abbbb8 100644 --- a/entity/diamond.png.import +++ b/entity/gem/diamond.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bquk2q5g6bst5" -path="res://.godot/imported/diamond.png-e255ab09d23a24a6563c34236c6422d4.ctex" +path="res://.godot/imported/diamond.png-0575d649be1d35db3ad92a77f7f138c4.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://entity/diamond.png" -dest_files=["res://.godot/imported/diamond.png-e255ab09d23a24a6563c34236c6422d4.ctex"] +source_file="res://entity/gem/diamond.png" +dest_files=["res://.godot/imported/diamond.png-0575d649be1d35db3ad92a77f7f138c4.ctex"] [params] diff --git a/entity/gemstone.png b/entity/gem/gemstone.png similarity index 100% rename from entity/gemstone.png rename to entity/gem/gemstone.png diff --git a/entity/gemstone.png.import b/entity/gem/gemstone.png.import similarity index 72% rename from entity/gemstone.png.import rename to entity/gem/gemstone.png.import index 54c98b2..34e201a 100644 --- a/entity/gemstone.png.import +++ b/entity/gem/gemstone.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://b21bsbo5f0ed7" -path="res://.godot/imported/gemstone.png-9e77a54275f3114b69765356c5f68288.ctex" +path="res://.godot/imported/gemstone.png-bc91c9206ee29218d6a2eefb5595b7d3.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://entity/gemstone.png" -dest_files=["res://.godot/imported/gemstone.png-9e77a54275f3114b69765356c5f68288.ctex"] +source_file="res://entity/gem/gemstone.png" +dest_files=["res://.godot/imported/gemstone.png-bc91c9206ee29218d6a2eefb5595b7d3.ctex"] [params] diff --git a/game/game.tscn b/game/game.tscn index b1730d2..6ea6219 100644 --- a/game/game.tscn +++ b/game/game.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://c3rxmcwa5nqng"] +[gd_scene load_steps=13 format=3 uid="uid://c3rxmcwa5nqng"] [ext_resource type="Script" path="res://game/game.gd" id="1_i3ly0"] [ext_resource type="PackedScene" uid="uid://bllsprv8orpn4" path="res://bottle/bottle.tscn" id="1_y7o2l"] @@ -8,6 +8,7 @@ [ext_resource type="PackedScene" uid="uid://beg758fa6o0cs" path="res://value/evaluator.tscn" id="6_my6nv"] [ext_resource type="PackedScene" uid="uid://ratkps4plkhl" path="res://converters/copper_to_silver/copper_converter.tscn" id="7_ipeok"] [ext_resource type="PackedScene" uid="uid://but1bdslxp5jl" path="res://converters/silver_to_gold/silver_converter.tscn" id="8_0bbpi"] +[ext_resource type="PackedScene" uid="uid://c2rlx7egl7xiv" path="res://collector/universal_collector.tscn" id="9_7op48"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_4uksi"] size = Vector2(80, 80) @@ -15,6 +16,9 @@ size = Vector2(80, 80) [sub_resource type="RectangleShape2D" id="RectangleShape2D_rh35r"] size = Vector2(240, 384) +[sub_resource type="RectangleShape2D" id="RectangleShape2D_auxq0"] +size = Vector2(270, 270) + [node name="Game" type="Node2D"] texture_filter = 1 script = ExtResource("1_i3ly0") @@ -73,6 +77,12 @@ rotation = -1.57079 [node name="Spawner" parent="SilverConverter" index="6" node_paths=PackedStringArray("target")] target = NodePath("../..") +[node name="UniversalCollector" parent="." instance=ExtResource("9_7op48")] +position = Vector2(135, -135) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="UniversalCollector"] +shape = SubResource("RectangleShape2D_auxq0") + [connection signal="timeout" from="TimeSpawner/Timer" to="TimeSpawner" method="spawn"] [connection signal="changed" from="Evaluator" to="." method="_on_score_changed"] diff --git a/interface/purchasable_item.tscn b/interface/purchasable_item.tscn index 8e9b56b..a1a7722 100644 --- a/interface/purchasable_item.tscn +++ b/interface/purchasable_item.tscn @@ -10,6 +10,7 @@ anchors_preset = 10 anchor_right = 1.0 grow_horizontal = 2 size_flags_horizontal = 3 +mouse_filter = 1 theme = ExtResource("1_r2qbu") script = ExtResource("1_h8jix") @@ -24,24 +25,27 @@ grow_vertical = 2 [node name="HeaderPaddingTop" type="Control" parent="Contents"] custom_minimum_size = Vector2(0, 4) layout_mode = 2 +mouse_filter = 1 [node name="Header" type="HBoxContainer" parent="Contents"] layout_mode = 2 size_flags_vertical = 8 [node name="IconPaddingLeft" type="Control" parent="Contents/Header"] -custom_minimum_size = Vector2(8, 0) +custom_minimum_size = Vector2(4, 0) layout_mode = 2 +mouse_filter = 1 [node name="IconRect" type="TextureRect" parent="Contents/Header"] -custom_minimum_size = Vector2(54, 54) +custom_minimum_size = Vector2(50, 50) layout_mode = 2 texture = ExtResource("1_drwcj") expand_mode = 2 [node name="IconNameSeparator" type="Control" parent="Contents/Header"] -custom_minimum_size = Vector2(8, 0) +custom_minimum_size = Vector2(4, 0) layout_mode = 2 +mouse_filter = 1 [node name="NameLabel" type="Label" parent="Contents/Header"] layout_mode = 2 @@ -51,13 +55,15 @@ text = "ITEMNAME" uppercase = true [node name="NamePaddingRight" type="Control" parent="Contents/Header"] -custom_minimum_size = Vector2(8, 0) +custom_minimum_size = Vector2(4, 0) layout_mode = 2 +mouse_filter = 1 [node name="HeaderDescriptionPadding" type="Control" parent="Contents"] custom_minimum_size = Vector2(0, 4) layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 1 [node name="Description" type="HBoxContainer" parent="Contents"] layout_mode = 2 @@ -66,10 +72,12 @@ size_flags_vertical = 4 [node name="DescriptionPaddingLeft" type="Control" parent="Contents/Description"] custom_minimum_size = Vector2(8, 0) layout_mode = 2 +mouse_filter = 1 [node name="DescriptionLabel" type="Label" parent="Contents/Description"] layout_mode = 2 size_flags_horizontal = 3 +mouse_filter = 1 theme_override_font_sizes/font_size = 16 text = "What does this item do? Nobody knows." autowrap_mode = 2 @@ -77,11 +85,13 @@ autowrap_mode = 2 [node name="DescriptionPaddingRight" type="Control" parent="Contents/Description"] custom_minimum_size = Vector2(8, 0) layout_mode = 2 +mouse_filter = 1 [node name="DescriptionActionPadding" type="Control" parent="Contents"] custom_minimum_size = Vector2(0, 4) layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 1 [node name="Action" type="HBoxContainer" parent="Contents"] layout_mode = 2 @@ -90,6 +100,7 @@ size_flags_vertical = 0 [node name="BuyButtonPaddingLeft" type="Control" parent="Contents/Action"] custom_minimum_size = Vector2(8, 0) layout_mode = 2 +mouse_filter = 1 [node name="BuyButton" type="Button" parent="Contents/Action"] layout_mode = 2 @@ -98,10 +109,12 @@ text = "Buy" [node name="BuyCostPadding" type="Control" parent="Contents/Action"] custom_minimum_size = Vector2(8, 0) layout_mode = 2 +mouse_filter = 1 [node name="CostLabel" type="Label" parent="Contents/Action"] layout_mode = 2 size_flags_horizontal = 10 +mouse_filter = 1 theme_override_font_sizes/font_size = 16 text = "3 fiorygi" horizontal_alignment = 2 @@ -110,9 +123,11 @@ vertical_alignment = 1 [node name="CostLabelPaddingRight" type="Control" parent="Contents/Action"] custom_minimum_size = Vector2(8, 0) layout_mode = 2 +mouse_filter = 1 [node name="ActionPaddingBottom" type="Control" parent="Contents"] custom_minimum_size = Vector2(0, 4) layout_mode = 2 +mouse_filter = 1 [connection signal="pressed" from="Contents/Action/BuyButton" to="." method="_on_buy_button_pressed"] diff --git a/interface/purchasable_item_padding.tscn b/interface/purchasable_item_padding.tscn index a249774..ce48e84 100644 --- a/interface/purchasable_item_padding.tscn +++ b/interface/purchasable_item_padding.tscn @@ -4,3 +4,4 @@ custom_minimum_size = Vector2(0, 8) layout_mode = 3 anchors_preset = 0 +mouse_filter = 1 diff --git a/interface/score_button.tscn b/interface/score_button.tscn index 113fd36..8774234 100644 --- a/interface/score_button.tscn +++ b/interface/score_button.tscn @@ -7,6 +7,6 @@ custom_minimum_size = Vector2(72, 0) offset_right = 72.0 offset_bottom = 54.0 size_flags_horizontal = 0 -text = "$0" +text = "$0.00" alignment = 0 script = ExtResource("1_ol56t") diff --git a/interface/shop_ui.gd b/interface/shop_ui.gd index b17c66c..ff8a913 100644 --- a/interface/shop_ui.gd +++ b/interface/shop_ui.gd @@ -1,6 +1,8 @@ extends Panel class_name ShopUI +@export var score_button: ScoreButton + ## Emitted when the Score button is pressed. signal score_button_pressed @@ -61,6 +63,9 @@ func _on_any_purchase_success(what: Node): continue item.can_buy = true +func _on_game_score_changed(total: int): + score_button.set_score(total) + func _on_score_button_pressed(): score_button_pressed.emit() diff --git a/interface/shop_ui.tscn b/interface/shop_ui.tscn index 7e8e7ef..0b3158e 100644 --- a/interface/shop_ui.tscn +++ b/interface/shop_ui.tscn @@ -1,12 +1,14 @@ -[gd_scene load_steps=6 format=3 uid="uid://cklkdygv61bny"] +[gd_scene load_steps=8 format=3 uid="uid://cklkdygv61bny"] [ext_resource type="Theme" uid="uid://ba5utvfhnxa5i" path="res://interface/interface_theme.tres" id="1_qdf0y"] [ext_resource type="PackedScene" uid="uid://dul1fpyh733t7" path="res://interface/purchasable_item.tscn" id="2_2dtc0"] [ext_resource type="Script" path="res://interface/shop_ui.gd" id="2_iyr7m"] [ext_resource type="PackedScene" uid="uid://wodgj6rp2ewm" path="res://interface/purchasable_item_padding.tscn" id="3_4feaj"] -[ext_resource type="Texture2D" uid="uid://pj3ip6vlatms" path="res://entity/copper_converter.png" id="5_lu2tr"] +[ext_resource type="PackedScene" uid="uid://bey5lilvteg32" path="res://interface/score_button.tscn" id="3_7vro3"] +[ext_resource type="Texture2D" uid="uid://pj3ip6vlatms" path="res://converters/copper_to_silver/copper_converter.png" id="5_lu2tr"] +[ext_resource type="Texture2D" uid="uid://bnctqi24r6ycr" path="res://converters/silver_to_gold/silver_converter.png" id="6_70u64"] -[node name="ShopUI" type="Panel"] +[node name="ShopUI" type="Panel" node_paths=PackedStringArray("score_button")] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -14,6 +16,7 @@ grow_horizontal = 2 grow_vertical = 2 theme = ExtResource("1_qdf0y") script = ExtResource("2_iyr7m") +score_button = NodePath("Rows/UpperButtons/ScoreButton") [node name="Rows" type="VBoxContainer" parent="."] layout_mode = 1 @@ -27,12 +30,8 @@ grow_vertical = 2 custom_minimum_size = Vector2(0, 54) layout_mode = 2 -[node name="ScoreButton" type="Button" parent="Rows/UpperButtons"] -custom_minimum_size = Vector2(72, 0) +[node name="ScoreButton" parent="Rows/UpperButtons" instance=ExtResource("3_7vro3")] layout_mode = 2 -size_flags_horizontal = 0 -text = "$0" -alignment = 0 [node name="UpperButtonsSpacerLeft" type="Control" parent="Rows/UpperButtons"] layout_mode = 2 @@ -56,6 +55,7 @@ text = "Back" alignment = 2 [node name="PaddedScrollable" type="HBoxContainer" parent="Rows"] +clip_contents = true layout_mode = 2 size_flags_vertical = 3 @@ -109,6 +109,7 @@ layout_mode = 2 [node name="BuyGoldenser" parent="Rows/PaddedScrollable/Scrollable/ScrollableItems/ConvertCategory" instance=ExtResource("2_2dtc0")] layout_mode = 2 +item_icon = ExtResource("6_70u64") item_name = "Goldenser" item_description = "Trades in ten silver coins for a sparkly gold coin!" item_cost_text = "??" @@ -234,7 +235,7 @@ layout_mode = 2 [node name="EarnCoinsLabel" type="Label" parent="Rows/PaddedScrollable/Scrollable/ScrollableItems/AutomaticCategory"] layout_mode = 2 theme_override_font_sizes/font_size = 24 -text = "Automatic coin dropper" +text = "Be more efficient!" horizontal_alignment = 1 vertical_alignment = 1 autowrap_mode = 2 diff --git a/main.tscn b/main.tscn index 9b5f798..9f1ad77 100644 --- a/main.tscn +++ b/main.tscn @@ -28,13 +28,16 @@ script = ExtResource("3_xav0n") [node name="GameWorld" type="CenterContainer" parent="CustomUI"] custom_minimum_size = Vector2(270, 480) layout_mode = 1 -anchors_preset = 5 +anchors_preset = 7 anchor_left = 0.5 +anchor_top = 1.0 anchor_right = 0.5 +anchor_bottom = 1.0 offset_left = -135.0 +offset_top = -480.0 offset_right = 135.0 -offset_bottom = 480.0 grow_horizontal = 2 +grow_vertical = 0 [node name="GameViewport" type="SubViewportContainer" parent="CustomUI/GameWorld"] layout_mode = 2 @@ -68,6 +71,7 @@ visible = false layout_mode = 2 [connection signal="score_changed" from="CustomUI/GameWorld/GameViewport/Viewport/Game" to="CustomUI/SafeUI/GameUI" method="_on_game_score_changed"] +[connection signal="score_changed" from="CustomUI/GameWorld/GameViewport/Viewport/Game" to="CustomUI/SafeUI/ShopUI" method="_on_game_score_changed"] [connection signal="score_button_pressed" from="CustomUI/SafeUI/GameUI" to="." method="_on_game_ui_score_button_pressed"] [connection signal="shop_button_pressed" from="CustomUI/SafeUI/GameUI" to="." method="_on_game_ui_shop_button_pressed"] [connection signal="spawn_button_pressed" from="CustomUI/SafeUI/GameUI" to="CustomUI/GameWorld/GameViewport/Viewport/Game" method="trigger_spawn"]