From aa07378fc6dd21323d53fcb5105b39013f9bb85c Mon Sep 17 00:00:00 2001
From: Ategon <benjamin@barbeau.net>
Date: Mon, 7 Oct 2024 18:44:32 -0400
Subject: [PATCH] Add window panning

---
 .gitignore                                 |  1 +
 components/Cursor/Cursor.tscn              |  2 +-
 export_presets.cfg                         | 64 ++++++++++++++++++++++
 main.gd                                    |  2 +
 parts/upgrades/more-creature-resources.txt |  2 +-
 parts/upgrades/more-creatures.txt          |  2 +-
 src/BuildWindow.tscn                       |  1 +
 src/CreatureWindow.tscn                    | 24 --------
 src/build_window.gd                        | 22 ++++++--
 src/creature_window.gd                     |  8 ++-
 src/mouse_signals.gd                       | 29 ++++++++++
 src/ui/action_button.gd                    |  7 +++
 src/zone.gd                                |  4 ++
 13 files changed, 132 insertions(+), 36 deletions(-)
 create mode 100644 export_presets.cfg

diff --git a/.gitignore b/.gitignore
index 0af181c..f4e9b95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 # Godot 4+ specific ignores
 .godot/
 /android/
+builds/
\ No newline at end of file
diff --git a/components/Cursor/Cursor.tscn b/components/Cursor/Cursor.tscn
index 35650ac..0c1b61f 100644
--- a/components/Cursor/Cursor.tscn
+++ b/components/Cursor/Cursor.tscn
@@ -9,7 +9,7 @@
 [sub_resource type="RectangleShape2D" id="RectangleShape2D_4cq27"]
 size = Vector2(4, 4)
 
-[node name="Cursor" type="CanvasLayer"]
+[node name="Cursor" type="CanvasLayer" groups=["Cursor"]]
 process_mode = 3
 script = ExtResource("1_nmkwm")
 
diff --git a/export_presets.cfg b/export_presets.cfg
new file mode 100644
index 0000000..befba2d
--- /dev/null
+++ b/export_presets.cfg
@@ -0,0 +1,64 @@
+[preset.0]
+
+name="Windows Desktop"
+platform="Windows Desktop"
+runnable=true
+advanced_options=false
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter="*.txt"
+exclude_filter=""
+export_path="builds/window-creatures.exe"
+encryption_include_filters=""
+encryption_exclude_filters=""
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.0.options]
+
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=1
+binary_format/embed_pck=true
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
+binary_format/architecture="x86_64"
+codesign/enable=false
+codesign/timestamp=true
+codesign/timestamp_server_url=""
+codesign/digest_algorithm=1
+codesign/description=""
+codesign/custom_options=PackedStringArray()
+application/modify_resources=true
+application/icon=""
+application/console_wrapper_icon=""
+application/icon_interpolation=4
+application/file_version=""
+application/product_version=""
+application/company_name=""
+application/product_name=""
+application/file_description=""
+application/copyright=""
+application/trademarks=""
+application/export_angle=0
+application/export_d3d12=0
+application/d3d12_agility_sdk_multiarch=true
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
+$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
+$trigger = New-ScheduledTaskTrigger -Once -At 00:00
+$settings = New-ScheduledTaskSettingsSet
+$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
+Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
+Start-ScheduledTask -TaskName godot_remote_debug
+while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
+Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
+ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
+Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
+Remove-Item -Recurse -Force '{temp_dir}'"
diff --git a/main.gd b/main.gd
index d7365ea..d1fab99 100644
--- a/main.gd
+++ b/main.gd
@@ -29,6 +29,8 @@ func _ready() -> void:
 	get_viewport().transparent_bg = true
 	DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_MOUSE_PASSTHROUGH, true)
 	
+	upgrade_pool.shuffle()
+	zone_pool.shuffle()
 	var new_buttons = UI_BUTTONS.instantiate()
 	var new_cursor = CURSOR.instantiate()
 	new_buttons.add_child(new_cursor)
diff --git a/parts/upgrades/more-creature-resources.txt b/parts/upgrades/more-creature-resources.txt
index a25881f..f213a47 100644
--- a/parts/upgrades/more-creature-resources.txt
+++ b/parts/upgrades/more-creature-resources.txt
@@ -3,4 +3,4 @@ description: 10%   higher   chance   for   a   creature   to   drop   coins   ev
 property: creature_resource_spawn_rate
 type: percent
 amount: 10
-cost: 5
+cost: 3
diff --git a/parts/upgrades/more-creatures.txt b/parts/upgrades/more-creatures.txt
index 4a41bdf..17b9772 100644
--- a/parts/upgrades/more-creatures.txt
+++ b/parts/upgrades/more-creatures.txt
@@ -2,4 +2,4 @@ name: Creature   Bait
 description: 2   More   creatures   will   wander   onto   your   property   every   day
 property: creature_amount
 amount: 2
-cost: 7
+cost: 3
diff --git a/src/BuildWindow.tscn b/src/BuildWindow.tscn
index 9cb13c0..2f5c7e2 100644
--- a/src/BuildWindow.tscn
+++ b/src/BuildWindow.tscn
@@ -201,6 +201,7 @@ volume_db = -10.0
 stream = ExtResource("9_fxutd")
 volume_db = 5.0
 
+[connection signal="close_requested" from="." to="Control" method="_on_build_window_close_requested"]
 [connection signal="clicked" from="Control/Upgrade/MouseHandler" to="Control" method="_on_mouse_handler_clicked"]
 [connection signal="hovered" from="Control/Upgrade/MouseHandler" to="Control" method="_on_mouse_handler_hovered"]
 [connection signal="unhovered" from="Control/Upgrade/MouseHandler" to="Control" method="_on_mouse_handler_unhovered"]
diff --git a/src/CreatureWindow.tscn b/src/CreatureWindow.tscn
index c0c0dee..d4ca386 100644
--- a/src/CreatureWindow.tscn
+++ b/src/CreatureWindow.tscn
@@ -31,29 +31,5 @@ wait_time = 6.0
 one_shot = true
 autostart = true
 
-[node name="Timer3" type="Timer" parent="."]
-wait_time = 12.0
-one_shot = true
-autostart = true
-
-[node name="Timer4" type="Timer" parent="."]
-wait_time = 20.0
-one_shot = true
-autostart = true
-
-[node name="Timer5" type="Timer" parent="."]
-wait_time = 30.0
-one_shot = true
-autostart = true
-
-[node name="Timer6" type="Timer" parent="."]
-wait_time = 50.0
-one_shot = true
-autostart = true
-
 [connection signal="timeout" from="Timer" to="Node2D" method="_on_timer_timeout"]
 [connection signal="timeout" from="Timer2" to="Node2D" method="_on_timer_timeout"]
-[connection signal="timeout" from="Timer3" to="Node2D" method="_on_timer_timeout"]
-[connection signal="timeout" from="Timer4" to="Node2D" method="_on_timer_timeout"]
-[connection signal="timeout" from="Timer5" to="Node2D" method="_on_timer_timeout"]
-[connection signal="timeout" from="Timer6" to="Node2D" method="_on_timer_timeout"]
diff --git a/src/build_window.gd b/src/build_window.gd
index 0b7fc94..d2fc2b2 100644
--- a/src/build_window.gd
+++ b/src/build_window.gd
@@ -56,14 +56,15 @@ var buying = [
 ]
 
 func _ready() -> void:
-	main.upgrade_pool.shuffle()
-	main.zone_pool.shuffle()
-	
 	var screen_size = DisplayServer.screen_get_size(0)
 	
 	get_window().position = DisplayServer.screen_get_position(0) + screen_size / 2 - Vector2i(450, 250)
 	_refresh_cards()
 
+func _process(delta: float) -> void:
+	if get_window().mode == Window.MODE_MINIMIZED:
+		get_window().mode = Window.MODE_WINDOWED
+
 
 func _refresh_cards():
 	for i in range(0, 3):
@@ -89,11 +90,15 @@ func _update_card(index):
 			main.upgrade_pool.shuffle()
 		choice = main.upgrade_pool.pop_back()
 		card_data = Data.data.upgrades[choice]
-		cost = card_data.cost + (round(card_data.cost / 2) * Persister.get_value(choice, PersisterEnums.Scope.UNKNOWN, 0))
+		
+		cost = card_data.cost
+		for i in range(0, Persister.get_value(choice, PersisterEnums.Scope.UNKNOWN, 0)):
+			cost += round(cost / 2)
 	
 	cards[index].title.text = "[center]%s" % [card_data.name]
 	cards[index].cost.text = "[center]%d G" % [cost]
 	card_data.key = choice
+	card_data.actual_cost = cost
 	chosen_cards[index] = card_data
 	
 	if (index == 1 and chosen_cards[0].key == choice) or (index == 0 and chosen_cards[1] and chosen_cards[1].key == choice):
@@ -133,8 +138,8 @@ func _buy_upgrade(index):
 		return
 	
 	var card_data = chosen_cards[index]
-	if Persister.get_value("gold", PersisterEnums.Scope.UNKNOWN, 0) >= (card_data.cost if card_data.has("cost") else 10 + (5 * Persister.get_value("zones_bought", PersisterEnums.Scope.UNKNOWN, 0))):
-		Persister.change_value("gold", -(card_data.cost if card_data.has("cost") else 10 + (5 * Persister.get_value("zones_bought", PersisterEnums.Scope.UNKNOWN, 0))))
+	if Persister.get_value("gold", PersisterEnums.Scope.UNKNOWN, 0) >= (card_data.actual_cost if card_data.has("actual_cost") else 10 + (5 * Persister.get_value("zones_bought", PersisterEnums.Scope.UNKNOWN, 0))):
+		Persister.change_value("gold", -(card_data.actual_cost if card_data.has("actual_cost") else 10 + (5 * Persister.get_value("zones_bought", PersisterEnums.Scope.UNKNOWN, 0))))
 		
 		buying[index] = true
 		
@@ -195,3 +200,8 @@ func _on_mouse_handler_unhovered() -> void:
 		tweens[index].set_parallel()
 		tweens[index].tween_property(cards[index].title, "modulate", Color.WHITE, 0.25)
 		tweens[index].tween_property(cards[index].object, "position:y", 42.5, 0.25)
+
+
+func _on_build_window_close_requested() -> void:
+	get_window().queue_free()
+	Triggerer.trigger("window_close_icon")
diff --git a/src/creature_window.gd b/src/creature_window.gd
index d6ab6fc..38956ed 100644
--- a/src/creature_window.gd
+++ b/src/creature_window.gd
@@ -9,7 +9,7 @@ const CREATURE = preload("res://src/Creature.tscn")
 var mouse_in_window = false
 
 func _ready() -> void:
-	Persister.change_value("creature_amount", 4)
+	Persister.change_value("creature_amount", 8)
 	Triggerer.listen("minutes", _on_minutes)
 	Triggerer.listen("day", _on_day)
 	_generate_spawn_times()
@@ -18,7 +18,9 @@ func _ready() -> void:
 	
 	get_window().position = Vector2i(50, screen_size.y - 300 - 50) + DisplayServer.screen_get_position(0)
 
-
+func _process(delta: float) -> void:
+	if get_window().mode == Window.MODE_MINIMIZED:
+		get_window().mode = Window.MODE_WINDOWED
 
 func _on_minutes(_data):
 	minutes_left -= 1
@@ -50,7 +52,7 @@ func _on_day(_data):
 func _generate_spawn_times():
 	spawn_times = []
 	
-	for i in range(0, 4):
+	for i in range(0, Persister.get_value("creature_amount")):
 		spawn_times.push_back(randi_range(2, 6 * 24 - 2))
 
 
diff --git a/src/mouse_signals.gd b/src/mouse_signals.gd
index 751ed78..18a081c 100644
--- a/src/mouse_signals.gd
+++ b/src/mouse_signals.gd
@@ -12,9 +12,17 @@ var mouse_in_window
 	#print("EXITED")
 	#mouse_in_window = false
 
+var last_mouse = Vector2.ZERO
+var cursor
+var diff = Vector2.ZERO
+var following = false
 
 func _ready() -> void:
 	Triggerer.listen("released", _on_released)
+	var children = get_parent().get_children()
+	for child in children:
+		if child.is_in_group("Cursor"):
+			cursor = child
 
 
 func _on_released(_data):
@@ -22,6 +30,27 @@ func _on_released(_data):
 		get_window().grab_focus()
 
 
+func _process(delta: float) -> void:
+	if Input.is_action_just_pressed("right_click") and mouse_in_window:
+		following = true
+	
+	if Input.is_action_just_released("right_click"):
+		following = false
+	
+	var mouse = get_tree().root.get_mouse_position()
+	if following:
+		diff += (mouse - last_mouse) * 4
+	
+	var x = floor(diff.x)
+	var y = floor(diff.y)
+	
+	get_parent().position += Vector2i(x, y)
+	
+	diff -= Vector2(x, y)
+	
+	last_mouse = mouse
+
+
 func _notification(blah):
 	match blah:
 		NOTIFICATION_WM_MOUSE_EXIT:
diff --git a/src/ui/action_button.gd b/src/ui/action_button.gd
index 5bf38e6..256646c 100644
--- a/src/ui/action_button.gd
+++ b/src/ui/action_button.gd
@@ -13,6 +13,13 @@ var size_tween
 
 func _ready() -> void:
 	sprite_2d.texture = image
+	
+	Triggerer.listen("window_close_icon", _on_window_close_icon)
+
+
+func _on_window_close_icon(_data):
+	if key == "upgrade_menu":
+		sprite_2d.texture = image
 
 func _on_mouse_handler_clicked() -> void:
 	if value == "toggle":
diff --git a/src/zone.gd b/src/zone.gd
index 40a0953..9538a7c 100644
--- a/src/zone.gd
+++ b/src/zone.gd
@@ -12,6 +12,10 @@ const CREATURE = preload("res://src/Creature.tscn")
 var tiles = []
 var newt = []
 
+func _process(delta: float) -> void:
+	if mode == Window.MODE_MINIMIZED:
+		mode = Window.MODE_WINDOWED
+
 func _ready() -> void:
 	var window_size = get_tree().root.get_window().size