From e4b6b5252bd050d8c07d174a5edf88fdc56084b6 Mon Sep 17 00:00:00 2001 From: Ross M Karchner Date: Fri, 16 Aug 2024 23:41:00 -0400 Subject: [PATCH] more like a game now --- ATTRIBUTION.md | 18 ++-- assets/fonts/Quit 13.ttf | Bin 0 -> 898656 bytes assets/fonts/Quit 13.ttf.import | 34 ++++++++ project.godot | 10 +++ scenes/Credits/Credits.tscn | 2 +- scenes/GameScene/game.gd | 32 +++++++- scenes/GameScene/game.tscn | 11 +++ scenes/GameScene/light.gd | 6 +- scenes/GameScene/segment.gd | 8 +- scenes/Levels/level_2.tscn | 47 +++++------ scenes/Levels/level_3.tscn | 77 ++++++++++++------ .../MainMenu/MainMenuWithAnimations.tscn | 2 +- scenes/dialog/level_complete_dialog.gd | 19 +++++ scenes/dialog/level_complete_dialog.tscn | 69 ++++++++++++++++ scenes/gamepiece_spawner.gd | 9 ++ scenes/power_source.gd | 23 ++++++ scenes/power_source.tscn | 4 +- 17 files changed, 302 insertions(+), 69 deletions(-) create mode 100644 assets/fonts/Quit 13.ttf create mode 100644 assets/fonts/Quit 13.ttf.import create mode 100644 scenes/dialog/level_complete_dialog.gd create mode 100644 scenes/dialog/level_complete_dialog.tscn create mode 100644 scenes/power_source.gd diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index c6734d3..3d96b1a 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -1,23 +1,19 @@ # Attribution -## Collaborators + +Made by Ross Karchner in 2024 + ### Godot Game Template Author: [Marek Belski and contributors](https://github.com/Maaack/Godot-Game-Template/graphs/contributors) Source: [github: Godot-Game-Template](https://github.com/Maaack/Godot-Game-Template) License: [MIT License](LICENSE.txt) +### "Quit" Font +Author: [somepx](https://somepx.itch.io/) +License: Purchased and use according to license. + ## Tools #### Godot Author: [Juan Linietsky, Ariel Manzur, and contributors](https://godotengine.org/contact) Source: [godotengine.org](https://godotengine.org/) License: [MIT License](https://github.com/godotengine/godot/blob/master/LICENSE.txt) - -#### Visual Studio Code -Author: [Microsoft](https://opensource.microsoft.com/) -Source: [github: vscode](https://github.com/microsoft/vscode) -License: [MIT License](https://github.com/microsoft/vscode/blob/main/LICENSE.txt) - -#### Git -Author: [Linus Torvalds](https://github.com/torvalds) -Source: [git-scm.com](https://git-scm.com/downloads) -License: [GNU General Public License version 2](https://opensource.org/licenses/GPL-2.0) diff --git a/assets/fonts/Quit 13.ttf b/assets/fonts/Quit 13.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bdd274962338dc22164561066a48ecfeaf8db6b1 GIT binary patch literal 898656 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

L&f@^$n+C$(KFPiKj(PqC;AvtjF!i<8GX%UT%g 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%0A`(D$(?cee5`d|8A`Ct3r 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Quit 13.ttf.import b/assets/fonts/Quit 13.ttf.import new file mode 100644 index 0000000..50a2243 --- /dev/null +++ b/assets/fonts/Quit 13.ttf.import @@ -0,0 +1,34 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://bgo6tp8of0gef" +path="res://.godot/imported/Quit 13.ttf-06997ae2f9cd9b4a4543265623a416ca.fontdata" + +[deps] + +source_file="res://assets/fonts/Quit 13.ttf" +dest_files=["res://.godot/imported/Quit 13.ttf-06997ae2f9cd9b4a4543265623a416ca.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +hinting=1 +subpixel_positioning=1 +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/project.godot b/project.godot index 40146e9..c12bc6b 100644 --- a/project.godot +++ b/project.godot @@ -77,6 +77,16 @@ click={ "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(82, 23),"global_position":Vector2(94, 80),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } +skip_level={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":76,"key_label":0,"unicode":108,"location":0,"echo":false,"script":null) +] +} +cheat={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":67,"location":0,"echo":false,"script":null) +] +} [internationalization] diff --git a/scenes/Credits/Credits.tscn b/scenes/Credits/Credits.tscn index f50d027..8a62d4b 100644 --- a/scenes/Credits/Credits.tscn +++ b/scenes/Credits/Credits.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://diut1db2bsqla"] -[ext_resource type="PackedScene" path="res://addons/maaacks_game_template/base/scenes/Credits/Credits.tscn" id="1_s3dg4"] +[ext_resource type="PackedScene" uid="uid://t2dui8ppm3a4" path="res://addons/maaacks_game_template/base/scenes/Credits/Credits.tscn" id="1_s3dg4"] [ext_resource type="Script" path="res://scenes/Credits/Credits.gd" id="2_lkit1"] [node name="Credits" instance=ExtResource("1_s3dg4")] diff --git a/scenes/GameScene/game.gd b/scenes/GameScene/game.gd index 62a1fd5..89ed99c 100644 --- a/scenes/GameScene/game.gd +++ b/scenes/GameScene/game.gd @@ -7,12 +7,25 @@ var current_level_instance = null @onready var piece_spawner = $GamepieceSpawner @onready var level_container = $LevelContainer +@onready var level_complete_scene = preload("res://scenes/dialog/level_complete_dialog.tscn") # Called when the node enters the scene tree for the first time. func _ready() -> void: - NetworkEvents.circuit_complete.connect(advance_level) + NetworkEvents.circuit_complete.connect(level_complete) load_current_level() +func level_complete(): + var level_complete_dialog = level_complete_scene.instantiate() + var remaining_levels = 2 - current_level + level_complete_dialog.remaining_levels = remaining_levels + if remaining_levels > 0: + level_complete_dialog.clicked_next_level.connect(advance_level) + else: + level_complete_dialog.clicked_next_level.connect(func(): + get_tree().change_scene_to_file("res://scenes/Credits/Credits.tscn") + ) + $HUD.add_child(level_complete_dialog) + func advance_level(): current_level_instance.queue_free() current_level +=1 @@ -26,6 +39,23 @@ func load_current_level(): piece_spawner.reveal_next_piece() +func _input(event: InputEvent) -> void: + if event.is_action_pressed("skip_level"): + advance_level() + if event.is_action_pressed("cheat"): + level_complete() func _on_undo_button_pressed() -> void: piece_spawner.undo() + + +func _on_gamepiece_spawner_piece_count_changed(history_depth: Variant, remaining_pices: Variant) -> void: + if history_depth == 0: + %UndoButton.disabled = true + else: + %UndoButton.disabled = false + + +func _on_start_over_button_pressed() -> void: + current_level_instance.queue_free() + load_current_level() diff --git a/scenes/GameScene/game.tscn b/scenes/GameScene/game.tscn index 275fec4..e0383e5 100644 --- a/scenes/GameScene/game.tscn +++ b/scenes/GameScene/game.tscn @@ -21,10 +21,21 @@ position = Vector2(18, 123) [node name="HUD" type="CanvasLayer" parent="."] [node name="UndoButton" type="Button" parent="HUD"] +unique_name_in_owner = true offset_left = 774.0 offset_top = 60.0 offset_right = 824.0 offset_bottom = 91.0 text = "Undo" +[node name="StartOverButton" type="Button" parent="HUD"] +unique_name_in_owner = true +offset_left = 844.0 +offset_top = 60.0 +offset_right = 894.0 +offset_bottom = 91.0 +text = "Start Over" + +[connection signal="piece_count_changed" from="GamepieceSpawner" to="." method="_on_gamepiece_spawner_piece_count_changed"] [connection signal="pressed" from="HUD/UndoButton" to="." method="_on_undo_button_pressed"] +[connection signal="pressed" from="HUD/StartOverButton" to="." method="_on_start_over_button_pressed"] diff --git a/scenes/GameScene/light.gd b/scenes/GameScene/light.gd index 35b585b..fbbf381 100644 --- a/scenes/GameScene/light.gd +++ b/scenes/GameScene/light.gd @@ -2,6 +2,7 @@ extends Node2D class_name Light +var triggered = false @onready var connection_point1 = $ConnectionPoint1 @onready var connection_point2 = $ConnectionPoint2 @@ -9,6 +10,9 @@ class_name Light var is_on = false: set(status): is_on = status + if status and not triggered: + NetworkEvents.circuit_complete.emit() + triggered = true update_display() @@ -27,7 +31,7 @@ func update_display() -> void: if is_on: $OnSprite.show() $OffSprite.hide() - NetworkEvents.circuit_complete.emit() + else: $OnSprite.hide() $OffSprite.show() diff --git a/scenes/GameScene/segment.gd b/scenes/GameScene/segment.gd index 19926d5..20b9e89 100644 --- a/scenes/GameScene/segment.gd +++ b/scenes/GameScene/segment.gd @@ -11,6 +11,8 @@ var dragStartPosition: Vector2 var dragging = false var drop_target:Area2D +var wire_colors = [Color.BLACK, Color.CORAL, Color.DARK_GREEN] + var connection_point_scene=preload("res://scenes/GameScene/connection_point.tscn") var connection_points = [] @@ -60,11 +62,13 @@ func create_connection_pair(position1, position2): add_child(connector2) func _draw() -> void: + var i = 0 for pair in connection_pairs: var position1 = positions[pair[0]] var position2 = positions[pair[1]] - draw_line(position1 - Vector2i(46,46),Vector2.ZERO,Color.BLACK,2.0) - draw_line(position2 - Vector2i(46,46),Vector2.ZERO,Color.BLACK,2.0) + draw_line(position1 - Vector2i(46,46),Vector2.ZERO,wire_colors[i],3.0) + draw_line(position2 - Vector2i(46,46),Vector2.ZERO,wire_colors[i],3.0) + i+=1 # Called when the node enters the scene tree for the first time. func _ready() -> void: diff --git a/scenes/Levels/level_2.tscn b/scenes/Levels/level_2.tscn index f1992f0..b083e21 100644 --- a/scenes/Levels/level_2.tscn +++ b/scenes/Levels/level_2.tscn @@ -19,58 +19,49 @@ sources/0 = SubResource("TileSetScenesCollectionSource_ie45y") [node name="Level2" type="Node2D"] [node name="Tiles" type="TileMapLayer" parent="."] -position = Vector2(619, 3) -tile_map_data = PackedByteArray("AAD//wMAAAAAAAAAAQAAAAMAAAAAAAAAAQAAAAIAAAAAAAAAAQD+/wEAAAAAAAAAAQD+/wMAAAAAAAAAAQD//wQAAAAAAAAAAQAAAAQAAAAAAAAAAQABAAQAAAAAAAAAAQABAAMAAAAAAAAAAQAAAAEAAAAAAAAAAQD+/wIAAAAAAAAAAQD9/wMAAAAAAAAAAQD9/wQAAAAAAAAAAQD+/wQAAAAAAAAAAQD9/wUAAAAAAAAAAQD+/wUAAAAAAAAAAQD//wUAAAAAAAAAAQD9/wEAAAAAAAAAAQD//wEAAAAAAAAAAQACAAIAAAAAAAAAAQD8/wUAAAAAAAAAAgABAAEAAAAAAAAAAwABAAAAAAAAAAAAAQA=") +position = Vector2(637, -162) +tile_map_data = PackedByteArray("AAD//wQAAAAAAAAAAQD9/wQAAAAAAAAAAQD9/wUAAAAAAAAAAQD+/wUAAAAAAAAAAQD8/wUAAAAAAAAAAgD9/wYAAAAAAAAAAQD+/wYAAAAAAAAAAQABAAQAAAAAAAAAAwAAAAQAAAAAAAAAAQAAAAUAAAAAAAAAAQAAAAMAAAAAAAAAAQD//wUAAAAAAAAAAQA=") tile_set = SubResource("TileSet_f5i1a") [node name="PossibleSolution" type="Node2D" parent="."] -visible = false -position = Vector2(581, 178) +position = Vector2(599, 13) [node name="Segment" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(-316, 142) -connection_pairs = Array[Vector2i]([Vector2i(2, -2)]) +position = Vector2(-197, 155) +connection_pairs = Array[Vector2i]([Vector2i(4, 3)]) [node name="Segment2" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(-260, 28) -connection_pairs = Array[Vector2i]([Vector2i(5, 2)]) - -[node name="Segment11" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(-188, 159) -connection_pairs = Array[Vector2i]([Vector2i(5, 2)]) +position = Vector2(38, 225) +connection_pairs = Array[Vector2i]([Vector2i(5, 2), Vector2i(0, 1)]) [node name="Segment12" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(-88, 334) -connection_pairs = Array[Vector2i]([Vector2i(5, 2)]) +position = Vector2(-57, 226) +connection_pairs = Array[Vector2i]([Vector2i(5, 1), Vector2i(4, 2)]) [node name="Segment3" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(192, 11) -connection_pairs = Array[Vector2i]([Vector2i(5, 3)]) +position = Vector2(132, 226) +connection_pairs = Array[Vector2i]([Vector2i(5, 1)]) [node name="Segment4" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(-247, 297) +position = Vector2(-195, 295) connection_pairs = Array[Vector2i]([Vector2i(0, 1)]) [node name="Segment10" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(291, 206) +position = Vector2(-102, 293) connection_pairs = Array[Vector2i]([Vector2i(0, 1)]) [node name="Segment5" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(55, -24) -connection_pairs = Array[Vector2i]([Vector2i(4, 2)]) +position = Vector2(85, 153) +connection_pairs = Array[Vector2i]([Vector2i(4, 1)]) [node name="Segment8" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(340, 106) +position = Vector2(133, 84) connection_pairs = Array[Vector2i]([Vector2i(4, 3)]) [node name="Segment9" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(298, 334) +position = Vector2(-8, 154) connection_pairs = Array[Vector2i]([Vector2i(4, 3)]) -[node name="Segment6" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(-91, -27) -connection_pairs = Array[Vector2i]([Vector2i(5, 3)]) - [node name="Segment7" parent="PossibleSolution" instance=ExtResource("4_qc4sm")] -position = Vector2(-370, 253) -connection_pairs = Array[Vector2i]([Vector2i(1, 0)]) +position = Vector2(-150, 224) +connection_pairs = Array[Vector2i]([Vector2i(3, 0), Vector2i(2, 4)]) diff --git a/scenes/Levels/level_3.tscn b/scenes/Levels/level_3.tscn index bc279b1..502a86d 100644 --- a/scenes/Levels/level_3.tscn +++ b/scenes/Levels/level_3.tscn @@ -20,57 +20,88 @@ sources/0 = SubResource("TileSetScenesCollectionSource_ie45y") [node name="Tiles" type="TileMapLayer" parent="."] position = Vector2(619, 3) -tile_map_data = PackedByteArray("AAD//wMAAAAAAAAAAQAAAAMAAAAAAAAAAQAAAAIAAAAAAAAAAQD//wIAAAAAAAAAAQD//wEAAAAAAAAAAQD+/wEAAAAAAAAAAQD+/wIAAAAAAAAAAgABAAIAAAAAAAAAAwD+/wMAAAAAAAAAAQD//wQAAAAAAAAAAQAAAAQAAAAAAAAAAQABAAQAAAAAAAAAAQABAAMAAAAAAAAAAQAAAAEAAAAAAAAAAQA=") +tile_map_data = PackedByteArray("AAD6/wMAAAAAAAAAAgD7/wIAAAAAAAAAAQD8/wIAAAAAAAAAAQD8/wMAAAAAAAAAAQD8/wQAAAAAAAAAAQD7/wQAAAAAAAAAAQD+/wIAAAAAAAAAAQD9/wMAAAAAAAAAAQD+/wQAAAAAAAAAAQD//wQAAAAAAAAAAQD//wMAAAAAAAAAAQD//wIAAAAAAAAAAQAAAAMAAAAAAAAAAQABAAIAAAAAAAAAAQAAAAEAAAAAAAAAAQACAAMAAAAAAAAAAQACAAEAAAAAAAAAAQD//wEAAAAAAAAAAQADAAIAAAAAAAAAAwD9/wQAAAAAAAAAAQABAAEAAAAAAAAAAQACAAIAAAAAAAAAAQA=") tile_set = SubResource("TileSet_f5i1a") [node name="PossibleSolution" type="Node2D" parent="."] -visible = false position = Vector2(581, 178) [node name="Segment" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(-316, 142) +position = Vector2(-383, 14) connection_pairs = Array[Vector2i]([Vector2i(2, -2)]) [node name="Segment2" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(-260, 28) -connection_pairs = Array[Vector2i]([Vector2i(5, 2)]) +position = Vector2(-152, 90) +connection_pairs = Array[Vector2i]([Vector2i(5, 1)]) [node name="Segment11" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(-188, 159) +position = Vector2(-99, 155) connection_pairs = Array[Vector2i]([Vector2i(5, 2)]) [node name="Segment12" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(-88, 334) -connection_pairs = Array[Vector2i]([Vector2i(5, 2)]) +position = Vector2(-11, 11) +connection_pairs = Array[Vector2i]([Vector2i(5, 1)]) [node name="Segment3" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(192, 11) +position = Vector2(-294, 15) connection_pairs = Array[Vector2i]([Vector2i(5, 3)]) [node name="Segment4" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(-247, 297) -connection_pairs = Array[Vector2i]([Vector2i(0, 1)]) +position = Vector2(-291, 160) +connection_pairs = Array[Vector2i]([Vector2i(1, 5)]) [node name="Segment10" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(291, 206) -connection_pairs = Array[Vector2i]([Vector2i(0, 1)]) +position = Vector2(-198, 155) +connection_pairs = Array[Vector2i]([Vector2i(0, 2)]) [node name="Segment5" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(55, -24) -connection_pairs = Array[Vector2i]([Vector2i(4, 2)]) +position = Vector2(-243, 85) +connection_pairs = Array[Vector2i]([Vector2i(0, 3), Vector2i(4, 2)]) [node name="Segment8" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(340, 106) -connection_pairs = Array[Vector2i]([Vector2i(4, 3)]) +position = Vector2(132, 79) +connection_pairs = Array[Vector2i]([Vector2i(5, 1)]) + +[node name="Segment13" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] +position = Vector2(129, -59) +connection_pairs = Array[Vector2i]([Vector2i(5, 3)]) + +[node name="Segment17" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] +position = Vector2(224, -54) +connection_pairs = Array[Vector2i]([Vector2i(4, 2)]) + +[node name="Segment18" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] +position = Vector2(324, -58) +connection_pairs = Array[Vector2i]([Vector2i(5, 3)]) + +[node name="Segment19" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] +position = Vector2(274, 16) +connection_pairs = Array[Vector2i]([Vector2i(5, 3)]) + +[node name="Segment20" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] +position = Vector2(319, 84) +connection_pairs = Array[Vector2i]([Vector2i(0, 1)]) + +[node name="Segment14" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] +position = Vector2(42, -64) +connection_pairs = Array[Vector2i]([Vector2i(4, 2)]) + +[node name="Segment15" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] +position = Vector2(174, 15) +connection_pairs = Array[Vector2i]([Vector2i(4, 2), Vector2i(0, 1)]) + +[node name="Segment16" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] +position = Vector2(37, 87) +connection_pairs = Array[Vector2i]([Vector2i(4, 2)]) [node name="Segment9" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(298, 334) -connection_pairs = Array[Vector2i]([Vector2i(4, 3)]) +position = Vector2(-101, 12) +connection_pairs = Array[Vector2i]([Vector2i(4, 2)]) [node name="Segment6" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(-91, -27) -connection_pairs = Array[Vector2i]([Vector2i(5, 3)]) +position = Vector2(-11, 148) +connection_pairs = Array[Vector2i]([Vector2i(5, 1)]) [node name="Segment7" parent="PossibleSolution" instance=ExtResource("4_rvlkf")] -position = Vector2(-370, 253) -connection_pairs = Array[Vector2i]([Vector2i(1, 0)]) +position = Vector2(-382, 158) +connection_pairs = Array[Vector2i]([Vector2i(2, 0)]) diff --git a/scenes/Menus/MainMenu/MainMenuWithAnimations.tscn b/scenes/Menus/MainMenu/MainMenuWithAnimations.tscn index b3c49e9..6ae37c7 100644 --- a/scenes/Menus/MainMenu/MainMenuWithAnimations.tscn +++ b/scenes/Menus/MainMenu/MainMenuWithAnimations.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=16 format=3 uid="uid://dpel22uvxis52"] -[ext_resource type="PackedScene" path="res://scenes/Menus/MainMenu/MainMenu.tscn" id="1_dufvr"] +[ext_resource type="PackedScene" uid="uid://2pm27icc6qj5" path="res://scenes/Menus/MainMenu/MainMenu.tscn" id="1_dufvr"] [ext_resource type="Script" path="res://scenes/Menus/MainMenu/MainMenuWithAnimations.gd" id="2_2xj2y"] [sub_resource type="Animation" id="1"] diff --git a/scenes/dialog/level_complete_dialog.gd b/scenes/dialog/level_complete_dialog.gd new file mode 100644 index 0000000..edf7a40 --- /dev/null +++ b/scenes/dialog/level_complete_dialog.gd @@ -0,0 +1,19 @@ +extends Control +signal clicked_next_level + +var remaining_levels = 0 + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + if remaining_levels == 0: + %Message.text = "You've completed all of the levels" + %Title.text = "[rainbow freq=1.0 sat=0.8 val=0.8][wave amp=50.0 freq=5.0 connected=1][center]Whoa![/center][/wave]" + %Button.text = "Who made this crazy thing?" + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass + +func _on_button_pressed() -> void: + clicked_next_level.emit() + queue_free() diff --git a/scenes/dialog/level_complete_dialog.tscn b/scenes/dialog/level_complete_dialog.tscn new file mode 100644 index 0000000..73552d1 --- /dev/null +++ b/scenes/dialog/level_complete_dialog.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=3 format=3 uid="uid://ce0fxyeo78jdg"] + +[ext_resource type="Script" path="res://scenes/dialog/level_complete_dialog.gd" id="1_kdra6"] +[ext_resource type="FontFile" uid="uid://bgo6tp8of0gef" path="res://assets/fonts/Quit 13.ttf" id="1_n80a8"] + +[node name="LevelCompleteDialog" type="Control"] +layout_mode = 3 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -114.0 +offset_top = -166.0 +offset_right = -114.0 +offset_bottom = -166.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_kdra6") + +[node name="Panel" type="Panel" parent="."] +custom_minimum_size = Vector2(300, 200) +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="MarginContainer" type="MarginContainer" parent="Panel"] +custom_minimum_size = Vector2(0, 15) +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 37.0 +grow_horizontal = 2 +theme_override_constants/margin_top = 19 + +[node name="HBoxContainer" type="VBoxContainer" parent="Panel/MarginContainer"] +layout_mode = 2 + +[node name="Title" type="RichTextLabel" parent="Panel/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.0 +theme_override_fonts/normal_font = ExtResource("1_n80a8") +bbcode_enabled = true +text = "[rainbow freq=1.0 sat=0.8 val=0.8][wave amp=50.0 freq=5.0 connected=1][center]Well Done![/center][/wave]" + +[node name="Placeholder" type="Label" parent="Panel/MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="Message" type="Label" parent="Panel/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "You've completed this circuit!" +horizontal_alignment = 1 + +[node name="Placeholder2" type="Label" parent="Panel/MarginContainer/HBoxContainer"] +layout_mode = 2 + +[node name="Button" type="Button" parent="Panel/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 3 +text = "On to the next challenge..." + +[connection signal="pressed" from="Panel/MarginContainer/HBoxContainer/Button" to="." method="_on_button_pressed"] diff --git a/scenes/gamepiece_spawner.gd b/scenes/gamepiece_spawner.gd index 829a8ad..c915bc8 100644 --- a/scenes/gamepiece_spawner.gd +++ b/scenes/gamepiece_spawner.gd @@ -1,6 +1,7 @@ extends Node2D class_name GamepieceSpawner +signal piece_count_changed(history_depth, remaining_pices) var queue:Node2D @@ -8,6 +9,9 @@ var next_piece:Segment = null var history =[] +func notify_piece_counts(): + piece_count_changed.emit(history.size(), queue.get_child_count()) + func _ready() -> void: prepare() @@ -20,6 +24,7 @@ func prepare(): queue = Node2D.new() queue.hide() add_child(queue) + notify_piece_counts() func add_segments_to_queue(pieces:Array[Node]) -> void: pieces.shuffle() @@ -28,9 +33,11 @@ func add_segments_to_queue(pieces:Array[Node]) -> void: piece.dropped.connect(record_history) piece.dropped.connect(reveal_next_piece) piece.reparent(queue) + notify_piece_counts() func record_history(last_played_segment): history.append(last_played_segment) + notify_piece_counts() func undo(): if next_piece: @@ -40,6 +47,7 @@ func undo(): last_piece.global_position = global_position last_piece.restore_playable() next_piece = last_piece + notify_piece_counts() func reveal_next_piece(_last_played_segment=null) -> void: if queue.get_child_count()<1: @@ -48,3 +56,4 @@ func reveal_next_piece(_last_played_segment=null) -> void: if next_piece: next_piece.global_position = global_position next_piece.reparent(self) + notify_piece_counts() diff --git a/scenes/power_source.gd b/scenes/power_source.gd new file mode 100644 index 0000000..21a3968 --- /dev/null +++ b/scenes/power_source.gd @@ -0,0 +1,23 @@ +extends Node2D + + +const positions = [ + Vector2i(21,12), + Vector2i(70,12), + Vector2i(92,46 ), + Vector2i(70,80), + Vector2i(21,79), + Vector2i(0,46 ), +] + +@export var positive_location = 0 +@export var negative_location =3 + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/scenes/power_source.tscn b/scenes/power_source.tscn index 53b2086..b314704 100644 --- a/scenes/power_source.tscn +++ b/scenes/power_source.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=3 format=3 uid="uid://73fcyu51g72"] +[gd_scene load_steps=4 format=3 uid="uid://73fcyu51g72"] +[ext_resource type="Script" path="res://scenes/power_source.gd" id="1_camaq"] [ext_resource type="Texture2D" uid="uid://tmvp21h2he05" path="res://assets/images/hex-powersource.png" id="1_idmp2"] [ext_resource type="PackedScene" uid="uid://7ycpev6cp8qd" path="res://scenes/GameScene/connection_point.tscn" id="2_ekvq5"] [node name="PowerSource" type="Node2D"] +script = ExtResource("1_camaq") [node name="Sprite2D" type="Sprite2D" parent="."] texture = ExtResource("1_idmp2")