diff --git a/Fonts/Theme.tres b/Fonts/Theme.tres index 267a889..062fe31 100644 --- a/Fonts/Theme.tres +++ b/Fonts/Theme.tres @@ -5,3 +5,5 @@ [resource] default_font = ExtResource("1_y7uny") default_font_size = 8 +RichTextLabel/colors/font_outline_color = Color(0, 0, 0, 1) +RichTextLabel/constants/outline_size = 4 diff --git a/Main.tscn b/Main.tscn index bf09a1d..8a7da48 100644 --- a/Main.tscn +++ b/Main.tscn @@ -1,3 +1,25 @@ -[gd_scene format=3 uid="uid://bs6ojoud4mvb8"] +[gd_scene load_steps=5 format=3 uid="uid://bs6ojoud4mvb8"] + +[ext_resource type="Script" path="res://main.gd" id="1_x66oe"] +[ext_resource type="PackedScene" uid="uid://ccdhbljb3e0oh" path="res://src/ui/MainUI.tscn" id="2_anen6"] +[ext_resource type="PackedScene" uid="uid://cr2nvts234wlw" path="res://src/manager/TimeManager.tscn" id="2_rrhko"] +[ext_resource type="Texture2D" uid="uid://c37jv23kd15ay" path="res://parts/zones/images/home.png" id="3_kjcur"] [node name="Main" type="Node2D"] +script = ExtResource("1_x66oe") + +[node name="TimeManager" parent="." instance=ExtResource("2_rrhko")] + +[node name="CanvasLayer" parent="." instance=ExtResource("2_anen6")] + +[node name="Sprite2D" type="Sprite2D" parent="."] +visible = false +position = Vector2(156, 90) +texture = ExtResource("3_kjcur") + +[node name="Timer" type="Timer" parent="."] +wait_time = 3.0 +one_shot = true +autostart = true + +[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"] diff --git a/addons/clickthrough/clickthrough.cs b/addons/clickthrough/clickthrough.cs new file mode 100644 index 0000000..ca4782c --- /dev/null +++ b/addons/clickthrough/clickthrough.cs @@ -0,0 +1,21 @@ +#if TOOLS +using Godot; +using System; + +[Tool] +public partial class clickthrough : EditorPlugin +{ + string AutoloadName = "Clickthrough"; + public override void _EnterTree() + { + // Initialization of the plugin goes here. + // AddAutoloadSingleton(AutoloadName, "res://addons/clickthrough/autoloads/clickthrough_gdscript/clickthrough_gdscript.tscn"); + } + + public override void _ExitTree() + { + // Clean-up of the plugin goes here. + // RemoveAutoloadSingleton(AutoloadName); + } +} +#endif diff --git a/addons/clickthrough/detection/area/area_detector.gd b/addons/clickthrough/detection/area/area_detector.gd new file mode 100644 index 0000000..8b147d0 --- /dev/null +++ b/addons/clickthrough/detection/area/area_detector.gd @@ -0,0 +1,51 @@ +#region Header +#01. tool + +#02. class_name + +#03. extends +extends Area2D +#endregion + +#region Documentation +#----------------------------------------------------------- +#04. # docstring +## hoge +#----------------------------------------------------------- +#endregion + +#region Body +#05. signals +#----------------------------------------------------------- + +#----------------------------------------------------------- +#06. enums +#----------------------------------------------------------- + +#----------------------------------------------------------- +#08. variables +#----------------------------------------------------------- +@onready var clickthrough: Clickthrough = get_parent() +#----------------------------------------------------------- +#09. methods +#----------------------------------------------------------- +func _ready() -> void: + area_entered.connect(_on_area_entered) + area_exited.connect(_on_area_exited) + pass + +func _physics_process(delta: float) -> void: + global_position = get_global_mouse_position() + pass +#----------------------------------------------------------- +#10. signal methods +#----------------------------------------------------------- + +func _on_area_entered(area: Area2D) -> void: + clickthrough.set_clickability(true) + pass + +func _on_area_exited(area: Area2D) -> void: + clickthrough.set_clickability(false) + pass +#endregion \ No newline at end of file diff --git a/addons/clickthrough/detection/area/area_detector.tscn b/addons/clickthrough/detection/area/area_detector.tscn new file mode 100644 index 0000000..e0e4ee4 --- /dev/null +++ b/addons/clickthrough/detection/area/area_detector.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=3 format=3 uid="uid://bcxwso7cge4dc"] + +[ext_resource type="Script" path="res://addons/clickthrough/detection/area/area_detector.gd" id="1_uqx6j"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_mo2k3"] +size = Vector2(1, 1) + +[node name="AreaDetector" type="Area2D"] +script = ExtResource("1_uqx6j") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_mo2k3") diff --git a/addons/clickthrough/detection/transparent/transparent_detector.gd b/addons/clickthrough/detection/transparent/transparent_detector.gd new file mode 100644 index 0000000..cf67ccb --- /dev/null +++ b/addons/clickthrough/detection/transparent/transparent_detector.gd @@ -0,0 +1,66 @@ +#region Header +#01. tool + +#02. class_name + +#03. extends +extends Node +#endregion + +#region Documentation +#----------------------------------------------------------- +#04. # docstring +## hoge +#----------------------------------------------------------- +#endregion + +#region Body +#05. signals +#----------------------------------------------------------- + +#----------------------------------------------------------- +#06. enums +#----------------------------------------------------------- + +#----------------------------------------------------------- +#08. variables +#----------------------------------------------------------- +@onready var clickthrough: Clickthrough = get_parent() + +var clickability = false; +var prev_clickability = clickability; +#----------------------------------------------------------- +#09. methods +#----------------------------------------------------------- +func _ready() -> void: + pass + +func _physics_process(delta: float) -> void: + detect_passthrough() + if (prev_clickability != clickability): + clickthrough.set_clickability(clickability) + prev_clickability = clickability + pass + +func detect_passthrough() -> void: + var viewport = get_viewport() + + var img = viewport.get_texture().get_image() + var rect = viewport.get_visible_rect() + + var mousePosition = viewport.get_mouse_position() + if (mousePosition.x < 0 || mousePosition.y < 0 || mousePosition.x > rect.size.x || mousePosition.y > rect.size.y): return; + var viewX = mousePosition.x + rect.position.x + var viewY = mousePosition.y + rect.position.y + + var x = img.get_size().x * viewX / rect.size.x + var y = img.get_size().y * viewY / rect.size.y + + if (x < img.get_size().x && y < img.get_size().y): + var pixel = img.get_pixel(x, y) + clickability = pixel.a > 0 +#----------------------------------------------------------- +#10. signal methods +#----------------------------------------------------------- + +#endregion \ No newline at end of file diff --git a/addons/clickthrough/detection/transparent/transparent_detector.tscn b/addons/clickthrough/detection/transparent/transparent_detector.tscn new file mode 100644 index 0000000..97e6328 --- /dev/null +++ b/addons/clickthrough/detection/transparent/transparent_detector.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dgvbaum76wg1i"] + +[ext_resource type="Script" path="res://addons/clickthrough/detection/transparent/transparent_detector.gd" id="1_tavpw"] + +[node name="TransparentDetector" type="Node"] +script = ExtResource("1_tavpw") diff --git a/addons/clickthrough/examples/example_icon.gd b/addons/clickthrough/examples/example_icon.gd new file mode 100644 index 0000000..4aac32e --- /dev/null +++ b/addons/clickthrough/examples/example_icon.gd @@ -0,0 +1,60 @@ +#region Header +#01. tool + +#02. class_name + +#03. extends +extends Sprite2D +#endregion + +#region Documentation +#----------------------------------------------------------- +#04. # docstring +## hoge +#----------------------------------------------------------- +#endregion + +#region Body +#05. signals +#----------------------------------------------------------- + +#----------------------------------------------------------- +#06. enums +#----------------------------------------------------------- + +#----------------------------------------------------------- +#08. variables +#----------------------------------------------------------- +var is_dragging = false +var initial_position = Vector2.ZERO +var initial_mouse_position = Vector2.ZERO +#----------------------------------------------------------- +#09. methods +#----------------------------------------------------------- +func _ready() -> void: + var left_click = InputEventMouseButton.new() + left_click.button_index = MOUSE_BUTTON_LEFT + if !InputMap.has_action("click"): + InputMap.add_action("click") + InputMap.action_add_event("click", left_click) + +func _process(delta: float) -> void: + if Input.is_action_just_pressed("click") and is_mouse_over(): + is_dragging = true + initial_position = global_position + initial_mouse_position = get_global_mouse_position() + + if is_dragging: + if Input.is_action_just_released("click"): + is_dragging = false + + global_position = get_global_mouse_position() - initial_mouse_position + initial_position + +func is_mouse_over() -> bool: + if get_global_mouse_position().x >= global_position.x - get_rect().size.x / 2 and get_global_mouse_position().x <= global_position.x + get_rect().size.x / 2: + if get_global_mouse_position().y >= global_position.y - get_rect().size.y / 2 and get_global_mouse_position().y <= global_position.y + get_rect().size.y / 2: + return true + return false +#----------------------------------------------------------- +#10. signal methods +#----------------------------------------------------------- diff --git a/addons/clickthrough/examples/multiple_windows/example.tscn b/addons/clickthrough/examples/multiple_windows/example.tscn new file mode 100644 index 0000000..7b68b62 --- /dev/null +++ b/addons/clickthrough/examples/multiple_windows/example.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=8 format=3 uid="uid://bosbfg5o0uwlb"] + +[ext_resource type="Script" path="res://addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.gd" id="1_x62ys"] +[ext_resource type="PackedScene" uid="uid://bcxwso7cge4dc" path="res://addons/clickthrough/detection/area/area_detector.tscn" id="2_h64ku"] +[ext_resource type="PackedScene" uid="uid://blkxbgp2i3glp" path="res://addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.tscn" id="3_7g5le"] +[ext_resource type="Script" path="res://addons/clickthrough/examples/example_icon.gd" id="4_8dtw3"] +[ext_resource type="PackedScene" uid="uid://dgvbaum76wg1i" path="res://addons/clickthrough/detection/transparent/transparent_detector.tscn" id="4_j8qig"] +[ext_resource type="Texture2D" uid="uid://crlrvohm2m7l7" path="res://icon.svg" id="5_cf4y8"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_c0p6e"] +size = Vector2(128, 128) + +[node name="Example" type="Node2D"] + +[node name="Clickthrough" type="Node" parent="."] +script = ExtResource("1_x62ys") +window_mode = 4 + +[node name="AreaDetector" parent="Clickthrough" instance=ExtResource("2_h64ku")] + +[node name="Icon" type="Sprite2D" parent="."] +position = Vector2(104, 269) +texture = ExtResource("5_cf4y8") +script = ExtResource("4_8dtw3") + +[node name="Area2D" type="Area2D" parent="Icon"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Icon/Area2D"] +shape = SubResource("RectangleShape2D_c0p6e") + +[node name="Window" type="Window" parent="."] +initial_position = 1 +size = Vector2i(800, 600) + +[node name="Clickthrough" parent="Window" instance=ExtResource("3_7g5le")] +borderless = false + +[node name="TransparentDetector" parent="Window/Clickthrough" instance=ExtResource("4_j8qig")] + +[node name="Icon" type="Sprite2D" parent="Window"] +position = Vector2(432, 194) +texture = ExtResource("5_cf4y8") +script = ExtResource("4_8dtw3") diff --git a/addons/clickthrough/examples/single_window/example.tscn b/addons/clickthrough/examples/single_window/example.tscn new file mode 100644 index 0000000..317ada1 --- /dev/null +++ b/addons/clickthrough/examples/single_window/example.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=6 format=3 uid="uid://dfb5nqnjgjpva"] + +[ext_resource type="Texture2D" uid="uid://crlrvohm2m7l7" path="res://icon.svg" id="1_f0jmc"] +[ext_resource type="PackedScene" uid="uid://blkxbgp2i3glp" path="res://addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.tscn" id="2_6xmh1"] +[ext_resource type="Script" path="res://addons/clickthrough/examples/example_icon.gd" id="2_spq04"] +[ext_resource type="PackedScene" uid="uid://dgvbaum76wg1i" path="res://addons/clickthrough/detection/transparent/transparent_detector.tscn" id="4_rwt05"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_m2cmf"] +size = Vector2(128, 128) + +[node name="Example" type="Node2D"] + +[node name="Icon" type="Sprite2D" parent="."] +position = Vector2(162, 115) +texture = ExtResource("1_f0jmc") +script = ExtResource("2_spq04") + +[node name="Area2D" type="Area2D" parent="Icon"] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Icon/Area2D"] +shape = SubResource("RectangleShape2D_m2cmf") + +[node name="Clickthrough" parent="." instance=ExtResource("2_6xmh1")] + +[node name="TransparentDetector" parent="Clickthrough" instance=ExtResource("4_rwt05")] diff --git a/addons/clickthrough/nodes/clickthrough_csharp/ClickthroughCSharp.cs b/addons/clickthrough/nodes/clickthrough_csharp/ClickthroughCSharp.cs new file mode 100644 index 0000000..999d1c9 --- /dev/null +++ b/addons/clickthrough/nodes/clickthrough_csharp/ClickthroughCSharp.cs @@ -0,0 +1,48 @@ +using Godot; +using System; +using System.Runtime.InteropServices; + +public partial class ClickthroughCSharp : Node +{ + // SetWindowLong() modifies a specific flag value associated with a window. + // We pass the window handle, the index of the property, and the flags the property will have + [DllImport("user32.dll")] + private static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong); + + // This is the index of the property we want to modify + private const int GwlExStyle = -20; + + // The flags we want to set + private const uint WsExLayered = 0x00080000; // Makes the window "layered" + private const uint WsExTransparent = 0x00000020; // Makes the window "clickable through" + // check https://learn.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles + + // This is the variable containing the window handle + private IntPtr _hWnd; + + public override void _Ready() + { + // We store the window handle + _hWnd = (IntPtr)DisplayServer.WindowGetNativeHandle(DisplayServer.HandleType.WindowHandle, GetWindow().GetWindowId()); + + // We can set the properties already from here + SetWindowLong(_hWnd, GwlExStyle, WsExLayered ); + + SetClickthrough(true); + } + + // This function sets the property of being clickable or not, we will call this function from the mouse detection + public void SetClickthrough(bool clickthrough) + { + if (clickthrough) + { + // We set the window as layered and click-through + SetWindowLong(_hWnd, GwlExStyle, WsExLayered | WsExTransparent); + } + else + { + // We only set the window as layered, so it will be clickable + SetWindowLong(_hWnd, GwlExStyle, WsExLayered); + } + } +} diff --git a/addons/clickthrough/nodes/clickthrough_csharp/ClickthroughCSharp.tscn b/addons/clickthrough/nodes/clickthrough_csharp/ClickthroughCSharp.tscn new file mode 100644 index 0000000..df1d6af --- /dev/null +++ b/addons/clickthrough/nodes/clickthrough_csharp/ClickthroughCSharp.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://4eoe7w32hidm"] + +[ext_resource type="Script" path="res://addons/clickthrough/nodes/clickthrough_csharp/ClickthroughCSharp.cs" id="1_fydb6"] + +[node name="ClickThroughCSharp" type="Node"] +script = ExtResource("1_fydb6") diff --git a/addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.gd b/addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.gd new file mode 100644 index 0000000..d6b8317 --- /dev/null +++ b/addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.gd @@ -0,0 +1,65 @@ +#region Header +#01. tool + +#02. class_name +class_name Clickthrough +#03. extends +extends Node +#endregion + +#region Documentation +#----------------------------------------------------------- +#04. # docstring +## hoge +#----------------------------------------------------------- +#endregion + +#region Body +#05. signals +#----------------------------------------------------------- + +#----------------------------------------------------------- +#06. enums +#----------------------------------------------------------- + +#----------------------------------------------------------- +#08. variables +#----------------------------------------------------------- +@export var transparent_bg: bool = true +@export var window_mode: DisplayServer.WindowMode = DisplayServer.WindowMode.WINDOW_MODE_WINDOWED +@export var always_on_top: bool = true +@export var unfocusable: bool = true +@export var unresizable: bool = true +@export var borderless: bool = true + + +@onready var clickthrough_csharp_packed_script: PackedScene = preload("res://addons/clickthrough/nodes/clickthrough_csharp/ClickthroughCSharp.tscn") +@onready var clickthrough_csharp = clickthrough_csharp_packed_script.instantiate() +#----------------------------------------------------------- +#09. methods +#----------------------------------------------------------- +func _ready() -> void: + DisplayServer.window_set_flag(DisplayServer.WindowFlags.WINDOW_FLAG_TRANSPARENT, transparent_bg, get_window().get_window_id()) + DisplayServer.window_set_flag(DisplayServer.WindowFlags.WINDOW_FLAG_ALWAYS_ON_TOP, always_on_top, get_window().get_window_id()) + if transparent_bg: + get_window().transparent = true + + DisplayServer.window_set_mode(window_mode, get_window().get_window_id()) + DisplayServer.window_set_flag(DisplayServer.WindowFlags.WINDOW_FLAG_RESIZE_DISABLED, unresizable, get_window().get_window_id()) + DisplayServer.window_set_flag(DisplayServer.WindowFlags.WINDOW_FLAG_NO_FOCUS, unfocusable, get_window().get_window_id()) + DisplayServer.window_set_flag(DisplayServer.WindowFlags.WINDOW_FLAG_BORDERLESS, borderless, get_window().get_window_id()) + + await get_window().ready + add_child(clickthrough_csharp) + get_viewport().size_changed.connect(_on_viewport_size_changed) + pass + +func set_clickability(clickability: bool) -> void: + clickthrough_csharp.SetClickthrough(!clickability) + +#----------------------------------------------------------- +#10. signal methods +#----------------------------------------------------------- +func _on_viewport_size_changed() -> void: + get_window().borderless = false + get_window().borderless = borderless \ No newline at end of file diff --git a/addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.tscn b/addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.tscn new file mode 100644 index 0000000..2204fd5 --- /dev/null +++ b/addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://blkxbgp2i3glp"] + +[ext_resource type="Script" path="res://addons/clickthrough/nodes/clickthrough_gdscript/clickthrough_gdscript.gd" id="1_l4q5i"] + +[node name="Clickthrough" type="Node"] +script = ExtResource("1_l4q5i") diff --git a/addons/clickthrough/plugin.cfg b/addons/clickthrough/plugin.cfg new file mode 100644 index 0000000..0cda6f2 --- /dev/null +++ b/addons/clickthrough/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Godot-Clickthrough" +description="" +author="Darnoman" +version="0.1" +script="clickthrough.cs" diff --git a/components/Cursor/Cursor.tscn b/components/Cursor/Cursor.tscn index 938b920..e30aae1 100644 --- a/components/Cursor/Cursor.tscn +++ b/components/Cursor/Cursor.tscn @@ -1,21 +1,24 @@ [gd_scene load_steps=4 format=3 uid="uid://qecwga1b4yqn"] [ext_resource type="Script" path="res://components/Cursor/cursor.gd" id="1_nmkwm"] -[ext_resource type="Texture2D" uid="uid://yg134s8wlxmi" path="res://icon.svg" id="2_yaf0k"] +[ext_resource type="Texture2D" uid="uid://kd8031vdmxb8" path="res://components/Cursor/normal-1.png" id="2_ucp64"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_4cq27"] +size = Vector2(8, 8) [node name="Cursor" type="CanvasLayer"] +process_mode = 3 script = ExtResource("1_nmkwm") [node name="MouseControl" type="Area2D" parent="."] +input_pickable = false [node name="CollisionShape2D" type="CollisionShape2D" parent="MouseControl"] shape = SubResource("RectangleShape2D_4cq27") [node name="Sprite2D" type="Sprite2D" parent="MouseControl"] -scale = Vector2(0.15625, 0.15625) -texture = ExtResource("2_yaf0k") +position = Vector2(2, 4) +texture = ExtResource("2_ucp64") [connection signal="area_entered" from="MouseControl" to="." method="_on_mouse_control_area_entered"] [connection signal="area_exited" from="MouseControl" to="." method="_on_mouse_control_area_exited"] diff --git a/components/Cursor/MouseHandler.tscn b/components/Cursor/MouseHandler.tscn index e610a47..e022e63 100644 --- a/components/Cursor/MouseHandler.tscn +++ b/components/Cursor/MouseHandler.tscn @@ -3,4 +3,5 @@ [ext_resource type="Script" path="res://components/Cursor/mouse_handler.gd" id="1_n30mb"] [node name="MouseHandler" type="Area2D"] +process_mode = 3 script = ExtResource("1_n30mb") diff --git a/components/Cursor/cursor-ui.png b/components/Cursor/cursor-ui.png new file mode 100644 index 0000000..dd476d3 Binary files /dev/null and b/components/Cursor/cursor-ui.png differ diff --git a/components/Cursor/cursor-ui.png.import b/components/Cursor/cursor-ui.png.import new file mode 100644 index 0000000..262d0b2 --- /dev/null +++ b/components/Cursor/cursor-ui.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cn2asbux7pygf" +path="res://.godot/imported/cursor-ui.png-342ebc343c2c58c466eef67d0e8042ef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://components/Cursor/cursor-ui.png" +dest_files=["res://.godot/imported/cursor-ui.png-342ebc343c2c58c466eef67d0e8042ef.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/components/Cursor/cursor.gd b/components/Cursor/cursor.gd index 11c8dce..8b78d11 100644 --- a/components/Cursor/cursor.gd +++ b/components/Cursor/cursor.gd @@ -2,29 +2,139 @@ extends Base @onready var mouse_control = $"MouseControl" +@onready var sprite_2d: Sprite2D = $MouseControl/Sprite2D + +const CURSOR_UI = preload("res://components/Cursor/hover-1.png") +const CURSOR_HOLD = preload("res://components/Cursor/grab-1.png") +const CURSOR = preload("res://components/Cursor/normal-1.png") +var rotation_tween + +var cursor_tween +var hovered_objects = 0 +var holding = false +var held_item + +func _ready() -> void: + Persister.data_persisted.connect(_on_data_persisted) + Triggerer.listen("grab_creature", _on_grab_creature) + + +func _on_grab_creature(data): + held_item = data.creature + holding = true + + +func _on_release(): + holding = false + var overlapping_areas = mouse_control.get_overlapping_areas() + overlapping_areas.sort_custom(func(a, b): + return a.z_index > b.z_index + ) + + for area in overlapping_areas: + if area.has_method("_on_released"): + var current_node = area + var hidden = false + while current_node: + if "modulate" in current_node: + if current_node.modulate.a < 1: + hidden = true + break + current_node = current_node.get_parent() + + if hidden: + continue + + if not area._on_released(): + break + + +func _on_click(): + var overlapping_areas = mouse_control.get_overlapping_areas() + overlapping_areas.sort_custom(func(a, b): + return a.z_index > b.z_index + ) + + for area in overlapping_areas: + if area.has_method("_on_clicked"): + var current_node = area + var hidden = false + while current_node: + if "modulate" in current_node: + if current_node.modulate.a < 1: + hidden = true + break + if "visible" in current_node: + if not current_node.visible: + hidden = true + break + current_node = current_node.get_parent() + + if hidden: + continue + + if not area._on_clicked(): + break func _process(delta): + if Input.is_action_just_released("left_click"): + _on_release() + if Input.is_action_just_pressed("left_click"): + _on_click() Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) mouse_control.position = mouse_control.get_global_mouse_position() - if Input.is_action_just_pressed("left_click"): - var overlapping_areas = mouse_control.get_overlapping_areas() - overlapping_areas.sort_custom(func(a, b): - return a.z_index > b.z_index - ) - - for area in overlapping_areas: - if area.has_method("_on_clicked"): - if not area._on_clicked(): - break - + if held_item: + held_item.position = mouse_control.position + + if not Input.is_action_pressed("left_click"): + sprite_2d.rotation = move_toward(sprite_2d.rotation, 0, delta) + sprite_2d.scale = sprite_2d.scale.move_toward(Vector2.ONE, delta) + else: + sprite_2d.scale = sprite_2d.scale.move_toward(Vector2.ONE * 0.9, delta * 2) + sprite_2d.rotation = move_toward(sprite_2d.rotation, -0.1, delta * 2) func _on_mouse_control_area_entered(area): if area.has_method("_on_hovered"): - area._on_hovered() + var current_node = area + var hidden = false + while current_node: + if "visible" in current_node: + if not current_node.visible: + hidden = true + break + current_node = current_node.get_parent() + + if not hidden: + area._on_hovered() + hovered_objects += 1 + + _update_cursor() func _on_mouse_control_area_exited(area): if area.has_method("_on_unhovered"): - area._on_unhovered() + var current_node = area + var hidden = false + while current_node: + if "visible" in current_node: + if not current_node.visible: + hidden = true + break + current_node = current_node.get_parent() + + if not hidden: + area._on_unhovered() + hovered_objects -= 1 + + _update_cursor() + + +func _update_cursor(): + if holding: + sprite_2d.texture = CURSOR_HOLD + if hovered_objects: + sprite_2d.texture = CURSOR_UI + else: + sprite_2d.texture = CURSOR diff --git a/components/Cursor/cursor.png b/components/Cursor/cursor.png new file mode 100644 index 0000000..366ced9 Binary files /dev/null and b/components/Cursor/cursor.png differ diff --git a/components/Cursor/cursor.png.import b/components/Cursor/cursor.png.import new file mode 100644 index 0000000..33ac808 --- /dev/null +++ b/components/Cursor/cursor.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cp6rlekidrafu" +path="res://.godot/imported/cursor.png-ab5b6c93c7e19595ea2eadb14e17d081.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://components/Cursor/cursor.png" +dest_files=["res://.godot/imported/cursor.png-ab5b6c93c7e19595ea2eadb14e17d081.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/components/Cursor/cursor_pixel_2.png b/components/Cursor/cursor_pixel_2.png new file mode 100644 index 0000000..83553b9 Binary files /dev/null and b/components/Cursor/cursor_pixel_2.png differ diff --git a/components/Cursor/cursor_pixel_2.png.import b/components/Cursor/cursor_pixel_2.png.import new file mode 100644 index 0000000..7339949 --- /dev/null +++ b/components/Cursor/cursor_pixel_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bufstw81c021x" +path="res://.godot/imported/cursor_pixel_2.png-642708b7cfb3eb8b33fd4ecdd3a72582.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://components/Cursor/cursor_pixel_2.png" +dest_files=["res://.godot/imported/cursor_pixel_2.png-642708b7cfb3eb8b33fd4ecdd3a72582.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/components/Cursor/grab-1.aseprite b/components/Cursor/grab-1.aseprite new file mode 100644 index 0000000..acd3332 Binary files /dev/null and b/components/Cursor/grab-1.aseprite differ diff --git a/components/Cursor/grab-1.png b/components/Cursor/grab-1.png new file mode 100644 index 0000000..8013896 Binary files /dev/null and b/components/Cursor/grab-1.png differ diff --git a/components/Cursor/grab-1.png.import b/components/Cursor/grab-1.png.import new file mode 100644 index 0000000..8720ca4 --- /dev/null +++ b/components/Cursor/grab-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dllpn5ymw1vic" +path="res://.godot/imported/grab-1.png-9007848d1041f8e4fb5480358cceb970.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://components/Cursor/grab-1.png" +dest_files=["res://.godot/imported/grab-1.png-9007848d1041f8e4fb5480358cceb970.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/components/Cursor/hover-1.aseprite b/components/Cursor/hover-1.aseprite new file mode 100644 index 0000000..371d2f6 Binary files /dev/null and b/components/Cursor/hover-1.aseprite differ diff --git a/components/Cursor/hover-1.png b/components/Cursor/hover-1.png new file mode 100644 index 0000000..f186d5b Binary files /dev/null and b/components/Cursor/hover-1.png differ diff --git a/components/Cursor/hover-1.png.import b/components/Cursor/hover-1.png.import new file mode 100644 index 0000000..db03016 --- /dev/null +++ b/components/Cursor/hover-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbk7ho64arub4" +path="res://.godot/imported/hover-1.png-258b1cb2fef34712ac3214495fdd027d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://components/Cursor/hover-1.png" +dest_files=["res://.godot/imported/hover-1.png-258b1cb2fef34712ac3214495fdd027d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/components/Cursor/normal-1.aseprite b/components/Cursor/normal-1.aseprite new file mode 100644 index 0000000..6185ef8 Binary files /dev/null and b/components/Cursor/normal-1.aseprite differ diff --git a/components/Cursor/normal-1.png b/components/Cursor/normal-1.png new file mode 100644 index 0000000..9d42615 Binary files /dev/null and b/components/Cursor/normal-1.png differ diff --git a/components/Cursor/normal-1.png.import b/components/Cursor/normal-1.png.import new file mode 100644 index 0000000..cbbefce --- /dev/null +++ b/components/Cursor/normal-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kd8031vdmxb8" +path="res://.godot/imported/normal-1.png-0502d4153ec1a4e68c1a9b6e052b8e7a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://components/Cursor/normal-1.png" +dest_files=["res://.godot/imported/normal-1.png-0502d4153ec1a4e68c1a9b6e052b8e7a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/components/Logger/Logger.tscn b/components/Logger/Logger.tscn index 6b955d8..80151ee 100644 --- a/components/Logger/Logger.tscn +++ b/components/Logger/Logger.tscn @@ -4,3 +4,4 @@ [node name="Logger" type="Node"] script = ExtResource("1_gse6q") +log_level = 2 diff --git a/components/Logger/logger.gd b/components/Logger/logger.gd index f1831bc..d15ebfc 100644 --- a/components/Logger/logger.gd +++ b/components/Logger/logger.gd @@ -1,4 +1,3 @@ -@icon("res://components/Logger/scroll-text.svg") extends Node ## A logger to log data to relevant locations ## @@ -9,10 +8,10 @@ extends Node signal log_created(message: String, level: LogLevel) enum LogLevel { - DEBUG, - INFO, - WARN, - ERROR + DEBUG = 0, + INFO = 1, + WARN = 2, + ERROR = 3 } ## The log level that should be outputted as a minimum. @@ -21,11 +20,17 @@ enum LogLevel { ## Log a message at log level debug (meant for troubleshooting). func debug(message: String, arguments: Dictionary = {}) -> void: + if log_level > LogLevel.DEBUG: + return + _log(message, LogLevel.DEBUG, arguments) ## Log a message at log level info (log to indicate something happened). func info(message: String, arguments: Dictionary = {}) -> void: + if log_level > LogLevel.INFO: + return + _log(message, LogLevel.INFO, arguments) diff --git a/components/Menu/Menu.tscn b/components/Menu/Menu.tscn index 02acd1c..92a6b24 100644 --- a/components/Menu/Menu.tscn +++ b/components/Menu/Menu.tscn @@ -23,106 +23,6 @@ shader_parameter/color = Vector4(1, 0.9, 0.65, 0.1) shader_parameter/hdr = false shader_parameter/seed = 5.0 -[sub_resource type="Animation" id="Animation_5jiy0"] -resource_name = "show_main" -length = 5.0 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("CanvasLayer/MainMenu/GameInfo/GameTitle:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(135, 168), Vector2(185.297, 168), Vector2(226.423, 168), Vector2(259.221, 168), Vector2(284.538, 168), Vector2(303.219, 168), Vector2(316.109, 168), Vector2(324.053, 168), Vector2(327.897, 168), Vector2(328.486, 168), Vector2(326.665, 168), Vector2(323.28, 168), Vector2(319.175, 168), Vector2(315.197, 168), Vector2(312.19, 168), Vector2(311, 168)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("CanvasLayer/MainMenu/GameInfo/GameUnderline:position") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(650, 194), Vector2(582.556, 194), Vector2(527.41, 194), Vector2(483.431, 194), Vector2(449.483, 194), Vector2(424.434, 194), Vector2(407.15, 194), Vector2(396.497, 194), Vector2(391.343, 194), Vector2(390.553, 194), Vector2(392.995, 194), Vector2(397.534, 194), Vector2(403.038, 194), Vector2(408.372, 194), Vector2(412.404, 194), Vector2(414, 194)] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("CanvasLayer/MainMenu/GameInfo/Author:position") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(648, 199), Vector2(561.123, 199), Vector2(490.088, 199), Vector2(433.436, 199), Vector2(389.707, 199), Vector2(357.44, 199), Vector2(335.176, 199), Vector2(321.454, 199), Vector2(314.814, 199), Vector2(313.797, 199), Vector2(316.942, 199), Vector2(322.79, 199), Vector2(329.879, 199), Vector2(336.751, 199), Vector2(341.944, 199), Vector2(344, 199)] -} -tracks/3/type = "value" -tracks/3/imported = false -tracks/3/enabled = true -tracks/3/path = NodePath("CanvasLayer/MainMenu/Rays:position") -tracks/3/interp = 1 -tracks/3/loop_wrap = true -tracks/3/keys = { -"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(0, 0), Vector2(32.0074, 0), Vector2(58.1781, 0), Vector2(79.0498, 0), Vector2(95.1607, 0), Vector2(107.048, 0), Vector2(115.251, 0), Vector2(120.307, 0), Vector2(122.753, 0), Vector2(123.127, 0), Vector2(121.969, 0), Vector2(119.814, 0), Vector2(117.202, 0), Vector2(114.671, 0), Vector2(112.757, 0), Vector2(112, 0)] -} -tracks/4/type = "value" -tracks/4/imported = false -tracks/4/enabled = true -tracks/4/path = NodePath("CanvasLayer/MainMenu/MenuButtons/PlayButton:position") -tracks/4/interp = 1 -tracks/4/loop_wrap = true -tracks/4/keys = { -"times": PackedFloat32Array(0.9, 0.933333, 0.966667, 1, 1.03333, 1.06667, 1.1, 1.13333, 1.16667, 1.2), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(-110, 128), Vector2(-39.3658, 128), Vector2(9.80145, 128), Vector2(41.0148, 128), Vector2(57.7873, 128), Vector2(63.6323, 128), Vector2(62.0629, 128), Vector2(56.5923, 128), Vector2(50.7336, 128), Vector2(48, 128)] -} -tracks/5/type = "value" -tracks/5/imported = false -tracks/5/enabled = true -tracks/5/path = NodePath("CanvasLayer/MainMenu/MenuButtons/OptionsButton:position") -tracks/5/interp = 1 -tracks/5/loop_wrap = true -tracks/5/keys = { -"times": PackedFloat32Array(1.15, 1.18333, 1.21667, 1.25, 1.28333, 1.31667, 1.35, 1.38333, 1.41667, 1.45), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(-110, 160), Vector2(-32.2129, 160), Vector2(21.9332, 160), Vector2(56.3074, 160), Vector2(74.7784, 160), Vector2(81.2154, 160), Vector2(79.487, 160), Vector2(73.4624, 160), Vector2(67.0104, 160), Vector2(64, 160)] -} -tracks/6/type = "value" -tracks/6/imported = false -tracks/6/enabled = true -tracks/6/path = NodePath("CanvasLayer/MainMenu/MenuButtons/CreditsButton:position") -tracks/6/interp = 1 -tracks/6/loop_wrap = true -tracks/6/keys = { -"times": PackedFloat32Array(1.4, 1.43333, 1.46667, 1.5, 1.53333, 1.56667, 1.6, 1.63333, 1.66667, 1.7), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(-110, 192), Vector2(-25.0601, 192), Vector2(34.065, 192), Vector2(71.6, 192), Vector2(91.7696, 192), Vector2(98.7984, 192), Vector2(96.9111, 192), Vector2(90.3325, 192), Vector2(83.2872, 192), Vector2(80, 192)] -} -tracks/7/type = "value" -tracks/7/imported = false -tracks/7/enabled = true -tracks/7/path = NodePath("CanvasLayer/MainMenu/MenuButtons/QuitButton:position") -tracks/7/interp = 1 -tracks/7/loop_wrap = true -tracks/7/keys = { -"times": PackedFloat32Array(1.65, 1.68333, 1.71667, 1.75, 1.78333, 1.81667, 1.85, 1.88333, 1.91667, 1.95), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), -"update": 0, -"values": [Vector2(-110, 224), Vector2(-17.9072, 224), Vector2(46.1968, 224), Vector2(86.8927, 224), Vector2(108.761, 224), Vector2(116.381, 224), Vector2(114.335, 224), Vector2(107.203, 224), Vector2(99.5641, 224), Vector2(96, 224)] -} - [sub_resource type="Animation" id="Animation_u1e5j"] length = 0.001 tracks/0/type = "value" @@ -222,6 +122,105 @@ tracks/7/keys = { "values": [Vector2(-110, 224)] } +[sub_resource type="Animation" id="Animation_awvye"] +resource_name = "hide_credits" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CanvasLayer/MainMenu/MenuButtons/PlayButton:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(-110, 128), Vector2(-89.6356, 128), Vector2(-70.6756, 128), Vector2(-53.12, 128), Vector2(-36.9689, 128), Vector2(-22.2222, 128), Vector2(-8.87999, 128), Vector2(3.05778, 128), Vector2(13.5911, 128), Vector2(22.72, 128), Vector2(30.4444, 128), Vector2(36.7645, 128), Vector2(41.68, 128), Vector2(45.1911, 128), Vector2(47.2978, 128), Vector2(48, 128)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CanvasLayer/MainMenu/MenuButtons/OptionsButton:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(-110, 160), Vector2(-87.5733, 160), Vector2(-66.6933, 160), Vector2(-47.36, 160), Vector2(-29.5733, 160), Vector2(-13.3333, 160), Vector2(1.36001, 160), Vector2(14.5067, 160), Vector2(26.1067, 160), Vector2(36.16, 160), Vector2(44.6667, 160), Vector2(51.6267, 160), Vector2(57.04, 160), Vector2(60.9067, 160), Vector2(63.2267, 160), Vector2(64, 160)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("CanvasLayer/MainMenu/MenuButtons/CreditsButton:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(-110, 192), Vector2(-85.5111, 192), Vector2(-62.7111, 192), Vector2(-41.6, 192), Vector2(-22.1778, 192), Vector2(-4.44444, 192), Vector2(11.6, 192), Vector2(25.9556, 192), Vector2(38.6222, 192), Vector2(49.6, 192), Vector2(58.8889, 192), Vector2(66.4889, 192), Vector2(72.4, 192), Vector2(76.6222, 192), Vector2(79.1555, 192), Vector2(80, 192)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("CanvasLayer/MainMenu/MenuButtons/QuitButton:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(-110, 224), Vector2(-83.4489, 224), Vector2(-58.7289, 224), Vector2(-35.84, 224), Vector2(-14.7822, 224), Vector2(4.44445, 224), Vector2(21.84, 224), Vector2(37.4044, 224), Vector2(51.1378, 224), Vector2(63.04, 224), Vector2(73.1111, 224), Vector2(81.3511, 224), Vector2(87.76, 224), Vector2(92.3378, 224), Vector2(95.0844, 224), Vector2(96, 224)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("CanvasLayer/MainMenu/GameInfo/GameTitle:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(645, 168), Vector2(601.951, 168), Vector2(561.871, 168), Vector2(524.76, 168), Vector2(490.618, 168), Vector2(459.444, 168), Vector2(431.24, 168), Vector2(406.004, 168), Vector2(383.738, 168), Vector2(364.44, 168), Vector2(348.111, 168), Vector2(334.751, 168), Vector2(324.36, 168), Vector2(316.938, 168), Vector2(312.484, 168), Vector2(311, 168)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("CanvasLayer/MainMenu/GameInfo/GameUnderline:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(650, 194), Vector2(615.089, 194), Vector2(582.97, 194), Vector2(553.645, 194), Vector2(527.112, 194), Vector2(503.373, 194), Vector2(482.426, 194), Vector2(464.272, 194), Vector2(448.911, 194), Vector2(436.343, 194), Vector2(426.568, 194), Vector2(419.586, 194), Vector2(415.396, 194), Vector2(414, 194)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("CanvasLayer/MainMenu/GameInfo/Author:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(648, 199), Vector2(608.818, 199), Vector2(572.338, 199), Vector2(538.56, 199), Vector2(507.484, 199), Vector2(479.111, 199), Vector2(453.44, 199), Vector2(430.471, 199), Vector2(410.204, 199), Vector2(392.64, 199), Vector2(377.778, 199), Vector2(365.618, 199), Vector2(356.16, 199), Vector2(349.404, 199), Vector2(345.351, 199), Vector2(344, 199)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("CanvasLayer/MainMenu/Rays:position") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(14.4356, 0), Vector2(27.8756, 0), Vector2(40.32, 0), Vector2(51.7689, 0), Vector2(62.2222, 0), Vector2(71.68, 0), Vector2(80.1422, 0), Vector2(87.6089, 0), Vector2(94.08, 0), Vector2(99.5555, 0), Vector2(104.036, 0), Vector2(107.52, 0), Vector2(110.009, 0), Vector2(111.502, 0), Vector2(112, 0)] +} + [sub_resource type="Animation" id="Animation_ob40t"] resource_name = "hide_main" tracks/0/type = "value" @@ -420,103 +419,104 @@ tracks/7/keys = { "values": [Vector2(112, 0), Vector2(97.5644, 0), Vector2(84.1244, 0), Vector2(71.68, 0), Vector2(60.2311, 0), Vector2(49.7778, 0), Vector2(40.32, 0), Vector2(31.8578, 0), Vector2(24.3911, 0), Vector2(17.92, 0), Vector2(12.4445, 0), Vector2(7.96444, 0), Vector2(4.48, 0), Vector2(1.99111, 0), Vector2(0.49778, 0), Vector2(0, 0)] } -[sub_resource type="Animation" id="Animation_awvye"] -resource_name = "hide_credits" +[sub_resource type="Animation" id="Animation_5jiy0"] +resource_name = "show_main" +length = 5.0 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("CanvasLayer/MainMenu/MenuButtons/PlayButton:position") +tracks/0/path = NodePath("CanvasLayer/MainMenu/GameInfo/GameTitle:position") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 0, -"values": [Vector2(-110, 128), Vector2(-89.6356, 128), Vector2(-70.6756, 128), Vector2(-53.12, 128), Vector2(-36.9689, 128), Vector2(-22.2222, 128), Vector2(-8.87999, 128), Vector2(3.05778, 128), Vector2(13.5911, 128), Vector2(22.72, 128), Vector2(30.4444, 128), Vector2(36.7645, 128), Vector2(41.68, 128), Vector2(45.1911, 128), Vector2(47.2978, 128), Vector2(48, 128)] +"values": [Vector2(135, 168), Vector2(185.297, 168), Vector2(226.423, 168), Vector2(259.221, 168), Vector2(284.538, 168), Vector2(303.219, 168), Vector2(316.109, 168), Vector2(324.053, 168), Vector2(327.897, 168), Vector2(328.486, 168), Vector2(326.665, 168), Vector2(323.28, 168), Vector2(319.175, 168), Vector2(315.197, 168), Vector2(312.19, 168), Vector2(311, 168)] } tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("CanvasLayer/MainMenu/MenuButtons/OptionsButton:position") +tracks/1/path = NodePath("CanvasLayer/MainMenu/GameInfo/GameUnderline:position") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { "times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 0, -"values": [Vector2(-110, 160), Vector2(-87.5733, 160), Vector2(-66.6933, 160), Vector2(-47.36, 160), Vector2(-29.5733, 160), Vector2(-13.3333, 160), Vector2(1.36001, 160), Vector2(14.5067, 160), Vector2(26.1067, 160), Vector2(36.16, 160), Vector2(44.6667, 160), Vector2(51.6267, 160), Vector2(57.04, 160), Vector2(60.9067, 160), Vector2(63.2267, 160), Vector2(64, 160)] +"values": [Vector2(650, 194), Vector2(582.556, 194), Vector2(527.41, 194), Vector2(483.431, 194), Vector2(449.483, 194), Vector2(424.434, 194), Vector2(407.15, 194), Vector2(396.497, 194), Vector2(391.343, 194), Vector2(390.553, 194), Vector2(392.995, 194), Vector2(397.534, 194), Vector2(403.038, 194), Vector2(408.372, 194), Vector2(412.404, 194), Vector2(414, 194)] } tracks/2/type = "value" tracks/2/imported = false tracks/2/enabled = true -tracks/2/path = NodePath("CanvasLayer/MainMenu/MenuButtons/CreditsButton:position") +tracks/2/path = NodePath("CanvasLayer/MainMenu/GameInfo/Author:position") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/keys = { "times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 0, -"values": [Vector2(-110, 192), Vector2(-85.5111, 192), Vector2(-62.7111, 192), Vector2(-41.6, 192), Vector2(-22.1778, 192), Vector2(-4.44444, 192), Vector2(11.6, 192), Vector2(25.9556, 192), Vector2(38.6222, 192), Vector2(49.6, 192), Vector2(58.8889, 192), Vector2(66.4889, 192), Vector2(72.4, 192), Vector2(76.6222, 192), Vector2(79.1555, 192), Vector2(80, 192)] +"values": [Vector2(648, 199), Vector2(561.123, 199), Vector2(490.088, 199), Vector2(433.436, 199), Vector2(389.707, 199), Vector2(357.44, 199), Vector2(335.176, 199), Vector2(321.454, 199), Vector2(314.814, 199), Vector2(313.797, 199), Vector2(316.942, 199), Vector2(322.79, 199), Vector2(329.879, 199), Vector2(336.751, 199), Vector2(341.944, 199), Vector2(344, 199)] } tracks/3/type = "value" tracks/3/imported = false tracks/3/enabled = true -tracks/3/path = NodePath("CanvasLayer/MainMenu/MenuButtons/QuitButton:position") +tracks/3/path = NodePath("CanvasLayer/MainMenu/Rays:position") tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/keys = { "times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), "transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 0, -"values": [Vector2(-110, 224), Vector2(-83.4489, 224), Vector2(-58.7289, 224), Vector2(-35.84, 224), Vector2(-14.7822, 224), Vector2(4.44445, 224), Vector2(21.84, 224), Vector2(37.4044, 224), Vector2(51.1378, 224), Vector2(63.04, 224), Vector2(73.1111, 224), Vector2(81.3511, 224), Vector2(87.76, 224), Vector2(92.3378, 224), Vector2(95.0844, 224), Vector2(96, 224)] +"values": [Vector2(0, 0), Vector2(32.0074, 0), Vector2(58.1781, 0), Vector2(79.0498, 0), Vector2(95.1607, 0), Vector2(107.048, 0), Vector2(115.251, 0), Vector2(120.307, 0), Vector2(122.753, 0), Vector2(123.127, 0), Vector2(121.969, 0), Vector2(119.814, 0), Vector2(117.202, 0), Vector2(114.671, 0), Vector2(112.757, 0), Vector2(112, 0)] } tracks/4/type = "value" tracks/4/imported = false tracks/4/enabled = true -tracks/4/path = NodePath("CanvasLayer/MainMenu/GameInfo/GameTitle:position") +tracks/4/path = NodePath("CanvasLayer/MainMenu/MenuButtons/PlayButton:position") tracks/4/interp = 1 tracks/4/loop_wrap = true tracks/4/keys = { -"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"times": PackedFloat32Array(0.9, 0.933333, 0.966667, 1, 1.03333, 1.06667, 1.1, 1.13333, 1.16667, 1.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 0, -"values": [Vector2(645, 168), Vector2(601.951, 168), Vector2(561.871, 168), Vector2(524.76, 168), Vector2(490.618, 168), Vector2(459.444, 168), Vector2(431.24, 168), Vector2(406.004, 168), Vector2(383.738, 168), Vector2(364.44, 168), Vector2(348.111, 168), Vector2(334.751, 168), Vector2(324.36, 168), Vector2(316.938, 168), Vector2(312.484, 168), Vector2(311, 168)] +"values": [Vector2(-110, 128), Vector2(-39.3658, 128), Vector2(9.80145, 128), Vector2(41.0148, 128), Vector2(57.7873, 128), Vector2(63.6323, 128), Vector2(62.0629, 128), Vector2(56.5923, 128), Vector2(50.7336, 128), Vector2(48, 128)] } tracks/5/type = "value" tracks/5/imported = false tracks/5/enabled = true -tracks/5/path = NodePath("CanvasLayer/MainMenu/GameInfo/GameUnderline:position") +tracks/5/path = NodePath("CanvasLayer/MainMenu/MenuButtons/OptionsButton:position") tracks/5/interp = 1 tracks/5/loop_wrap = true tracks/5/keys = { -"times": PackedFloat32Array(0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"times": PackedFloat32Array(1.15, 1.18333, 1.21667, 1.25, 1.28333, 1.31667, 1.35, 1.38333, 1.41667, 1.45), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 0, -"values": [Vector2(650, 194), Vector2(615.089, 194), Vector2(582.97, 194), Vector2(553.645, 194), Vector2(527.112, 194), Vector2(503.373, 194), Vector2(482.426, 194), Vector2(464.272, 194), Vector2(448.911, 194), Vector2(436.343, 194), Vector2(426.568, 194), Vector2(419.586, 194), Vector2(415.396, 194), Vector2(414, 194)] +"values": [Vector2(-110, 160), Vector2(-32.2129, 160), Vector2(21.9332, 160), Vector2(56.3074, 160), Vector2(74.7784, 160), Vector2(81.2154, 160), Vector2(79.487, 160), Vector2(73.4624, 160), Vector2(67.0104, 160), Vector2(64, 160)] } tracks/6/type = "value" tracks/6/imported = false tracks/6/enabled = true -tracks/6/path = NodePath("CanvasLayer/MainMenu/GameInfo/Author:position") +tracks/6/path = NodePath("CanvasLayer/MainMenu/MenuButtons/CreditsButton:position") tracks/6/interp = 1 tracks/6/loop_wrap = true tracks/6/keys = { -"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"times": PackedFloat32Array(1.4, 1.43333, 1.46667, 1.5, 1.53333, 1.56667, 1.6, 1.63333, 1.66667, 1.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 0, -"values": [Vector2(648, 199), Vector2(608.818, 199), Vector2(572.338, 199), Vector2(538.56, 199), Vector2(507.484, 199), Vector2(479.111, 199), Vector2(453.44, 199), Vector2(430.471, 199), Vector2(410.204, 199), Vector2(392.64, 199), Vector2(377.778, 199), Vector2(365.618, 199), Vector2(356.16, 199), Vector2(349.404, 199), Vector2(345.351, 199), Vector2(344, 199)] +"values": [Vector2(-110, 192), Vector2(-25.0601, 192), Vector2(34.065, 192), Vector2(71.6, 192), Vector2(91.7696, 192), Vector2(98.7984, 192), Vector2(96.9111, 192), Vector2(90.3325, 192), Vector2(83.2872, 192), Vector2(80, 192)] } tracks/7/type = "value" tracks/7/imported = false tracks/7/enabled = true -tracks/7/path = NodePath("CanvasLayer/MainMenu/Rays:position") +tracks/7/path = NodePath("CanvasLayer/MainMenu/MenuButtons/QuitButton:position") tracks/7/interp = 1 tracks/7/loop_wrap = true tracks/7/keys = { -"times": PackedFloat32Array(0, 0.0333333, 0.0666667, 0.1, 0.133333, 0.166667, 0.2, 0.233333, 0.266667, 0.3, 0.333333, 0.366667, 0.4, 0.433333, 0.466667, 0.5), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"times": PackedFloat32Array(1.65, 1.68333, 1.71667, 1.75, 1.78333, 1.81667, 1.85, 1.88333, 1.91667, 1.95), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), "update": 0, -"values": [Vector2(0, 0), Vector2(14.4356, 0), Vector2(27.8756, 0), Vector2(40.32, 0), Vector2(51.7689, 0), Vector2(62.2222, 0), Vector2(71.68, 0), Vector2(80.1422, 0), Vector2(87.6089, 0), Vector2(94.08, 0), Vector2(99.5555, 0), Vector2(104.036, 0), Vector2(107.52, 0), Vector2(110.009, 0), Vector2(111.502, 0), Vector2(112, 0)] +"values": [Vector2(-110, 224), Vector2(-17.9072, 224), Vector2(46.1968, 224), Vector2(86.8927, 224), Vector2(108.761, 224), Vector2(116.381, 224), Vector2(114.335, 224), Vector2(107.203, 224), Vector2(99.5641, 224), Vector2(96, 224)] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_twm3r"] diff --git a/components/Persister/persister.gd b/components/Persister/persister.gd index 706d642..e18a771 100644 --- a/components/Persister/persister.gd +++ b/components/Persister/persister.gd @@ -25,6 +25,8 @@ func _spawned(): ## Store data in a category func persist_data(key: String, value, category := PersisterEnums.Scope.RUN) -> void: # Only allow ints, bools or strings to be persisted and as Strings + var original_pass = value + if value is int: value = str(value) @@ -47,16 +49,19 @@ func persist_data(key: String, value, category := PersisterEnums.Scope.RUN) -> v _info("Set key <%s> in category {%s} to value |%s|" % [key, _get_category_name(category), value]) _persisted[category][key] = value + if _triggerer: + _triggerer.trigger(key, {"value": original_pass}) + _emit_change(key, value, category) ## Get the value associated with a key in the highest priority or specified category -func get_value(key: String, category: PersisterEnums.Scope = PersisterEnums.Scope.UNKNOWN): +func get_value(key: String, category: PersisterEnums.Scope = PersisterEnums.Scope.UNKNOWN, default = null): if category == PersisterEnums.Scope.UNKNOWN: category = _get_key_category(key) if category == PersisterEnums.Scope.UNKNOWN: - return null + return default if _persisted[category][key].is_valid_int(): return int(_persisted[category][key]) @@ -116,6 +121,51 @@ func change_value(key: String, value: int, category := PersisterEnums.Scope.RUN) persist_data(key, value + old_value, category) +func change_value_clamp_min(key: String, value: int, min: int, category := PersisterEnums.Scope.RUN) -> void: + change_value_clamp(key, value, min, INF, category) + + +func change_value_clamp_max(key: String, value: int, max: int, category := PersisterEnums.Scope.RUN) -> void: + change_value_clamp(key, value, -INF, max, category) + + +func change_value_clamp(key: String, value: int, min: int, max: int, category := PersisterEnums.Scope.RUN) -> void: + if min > max and not min == -9223372036854775808 and not max == -9223372036854775808: + _warn("Attempted to change clamp value %s with higher min %s than max %s" % [key, min, max]) + return + + if not _persisted.has(category): + _persisted[category] = {} + + if not _persisted[category].has(key): + if value < min and not min == -9223372036854775808: + value = min + + if value > max and not max == -9223372036854775808: + value = max + + persist_data(key, value, category) + return + + if is_nan(int(_persisted[category][key])): + _error("Attempted to add number |%d| to key <%s> in category {%s} that is not a number (value: |%s|)" % [value, key, category, _persisted[category][key]]) + return + + var old_value = int(_persisted[category][key]) + var new_value = value + old_value + + if new_value < min and not min == -9223372036854775808: + new_value = min + + if new_value > max and not max == -9223372036854775808: + new_value = max + + if old_value == new_value: + return + + _info("Added clamped number |%d| to key <%s> in category {%s} (old: |%d|) (new: |%d|)" % [value, key, _get_category_name(category), old_value, new_value]) + persist_data(key, new_value, category) + func change_save(index: int): _save() persist_data("save", index) diff --git a/main.gd b/main.gd new file mode 100644 index 0000000..7efad57 --- /dev/null +++ b/main.gd @@ -0,0 +1,38 @@ +extends Node2D + +@onready var zones = Data.data.zones + +const CURSOR = preload("res://components/Cursor/Cursor.tscn") +const ZONE = preload("res://src/Zone.tscn") + +func _ready() -> void: + Triggerer.listen("spawn_window", _on_spawn_window) + Triggerer.listen("quit", _on_quit) + DisplayServer.window_set_title("Home") + get_viewport().transparent_bg = true + + +func _process(delta: float) -> void: + if Input.is_action_just_pressed("test"): + Triggerer.trigger("spawn_window", {"key": ["farm", "desert", "lake", "forest"].pick_random()}) + + +func _on_spawn_window(data) -> void: + var zone = zones[data.key] + + var new_window = ZONE.instantiate() + new_window.key = data.key + new_window.size = Vector2(int(zone.size[0]) * 12 * 4, int(zone.size[1]) * 12 * 4) + new_window.position = Vector2(int(zone.spawn_position[0]), int(zone.spawn_position[1])) + var new_cursor = CURSOR.instantiate() + new_window.add_child(new_cursor) + + get_tree().root.add_child(new_window) + + +func _on_timer_timeout() -> void: + Triggerer.trigger("spawn_window", {"key": ["farm", "desert", "lake", "forest"].pick_random()}) + + +func _on_quit(_data) -> void: + get_tree().quit() diff --git a/parts/creatures/1x1-1.txt b/parts/creatures/1x1-1.txt new file mode 100644 index 0000000..7b5010e --- /dev/null +++ b/parts/creatures/1x1-1.txt @@ -0,0 +1,2 @@ +width: 1 +height: 1 diff --git a/parts/creatures/1x2-1.txt b/parts/creatures/1x2-1.txt new file mode 100644 index 0000000..2a1583c --- /dev/null +++ b/parts/creatures/1x2-1.txt @@ -0,0 +1,2 @@ +width: 1 +height: 2 diff --git a/parts/creatures/2x1-1.txt b/parts/creatures/2x1-1.txt new file mode 100644 index 0000000..f649798 --- /dev/null +++ b/parts/creatures/2x1-1.txt @@ -0,0 +1,2 @@ +width: 2 +height: 1 diff --git a/parts/creatures/2x2-1.txt b/parts/creatures/2x2-1.txt new file mode 100644 index 0000000..e167a48 --- /dev/null +++ b/parts/creatures/2x2-1.txt @@ -0,0 +1,2 @@ +width: 2 +height: 2 diff --git a/parts/creatures/images/1x1-1.aseprite b/parts/creatures/images/1x1-1.aseprite new file mode 100644 index 0000000..572f20c Binary files /dev/null and b/parts/creatures/images/1x1-1.aseprite differ diff --git a/parts/creatures/images/1x1-1.png b/parts/creatures/images/1x1-1.png new file mode 100644 index 0000000..808a583 Binary files /dev/null and b/parts/creatures/images/1x1-1.png differ diff --git a/parts/creatures/images/1x1-1.png.import b/parts/creatures/images/1x1-1.png.import new file mode 100644 index 0000000..f5406f8 --- /dev/null +++ b/parts/creatures/images/1x1-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnvnm78idadmn" +path="res://.godot/imported/1x1-1.png-759493f29db93b9b5b7fc6e9d3ae57b7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/creatures/images/1x1-1.png" +dest_files=["res://.godot/imported/1x1-1.png-759493f29db93b9b5b7fc6e9d3ae57b7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/creatures/images/1x2-1.aseprite b/parts/creatures/images/1x2-1.aseprite new file mode 100644 index 0000000..2747157 Binary files /dev/null and b/parts/creatures/images/1x2-1.aseprite differ diff --git a/parts/creatures/images/1x2-1.png b/parts/creatures/images/1x2-1.png new file mode 100644 index 0000000..ba5900d Binary files /dev/null and b/parts/creatures/images/1x2-1.png differ diff --git a/parts/creatures/images/1x2-1.png.import b/parts/creatures/images/1x2-1.png.import new file mode 100644 index 0000000..6b056e5 --- /dev/null +++ b/parts/creatures/images/1x2-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmdnc7nf7h6fr" +path="res://.godot/imported/1x2-1.png-b08cca67c9386c6382072a61026ad76c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/creatures/images/1x2-1.png" +dest_files=["res://.godot/imported/1x2-1.png-b08cca67c9386c6382072a61026ad76c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/creatures/images/2x1-1.aseprite b/parts/creatures/images/2x1-1.aseprite new file mode 100644 index 0000000..48e7c5e Binary files /dev/null and b/parts/creatures/images/2x1-1.aseprite differ diff --git a/parts/creatures/images/2x1-1.png b/parts/creatures/images/2x1-1.png new file mode 100644 index 0000000..bc11a37 Binary files /dev/null and b/parts/creatures/images/2x1-1.png differ diff --git a/parts/creatures/images/2x1-1.png.import b/parts/creatures/images/2x1-1.png.import new file mode 100644 index 0000000..46af076 --- /dev/null +++ b/parts/creatures/images/2x1-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://daocx5uhmoupt" +path="res://.godot/imported/2x1-1.png-4cfaf02a2d3aa1aceed33f923f29dec3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/creatures/images/2x1-1.png" +dest_files=["res://.godot/imported/2x1-1.png-4cfaf02a2d3aa1aceed33f923f29dec3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/creatures/images/2x2-1.aseprite b/parts/creatures/images/2x2-1.aseprite new file mode 100644 index 0000000..4c9e569 Binary files /dev/null and b/parts/creatures/images/2x2-1.aseprite differ diff --git a/parts/creatures/images/2x2-1.png b/parts/creatures/images/2x2-1.png new file mode 100644 index 0000000..852e42d Binary files /dev/null and b/parts/creatures/images/2x2-1.png differ diff --git a/parts/creatures/images/2x2-1.png.import b/parts/creatures/images/2x2-1.png.import new file mode 100644 index 0000000..d8c1b18 --- /dev/null +++ b/parts/creatures/images/2x2-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b38egd0hr54w5" +path="res://.godot/imported/2x2-1.png-434c30559a5927276d09c09d64707ad9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/creatures/images/2x2-1.png" +dest_files=["res://.godot/imported/2x2-1.png-434c30559a5927276d09c09d64707ad9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/dialogue/dummy.txt b/parts/dialogue/dummy.txt new file mode 100644 index 0000000..36e9836 --- /dev/null +++ b/parts/dialogue/dummy.txt @@ -0,0 +1,2 @@ +dummy[] + dummy: dummy diff --git a/parts/globals.txt b/parts/globals.txt new file mode 100644 index 0000000..872f12d --- /dev/null +++ b/parts/globals.txt @@ -0,0 +1 @@ +day_length: 240 diff --git a/parts/zones/desert.txt b/parts/zones/desert.txt new file mode 100644 index 0000000..d4e1ce1 --- /dev/null +++ b/parts/zones/desert.txt @@ -0,0 +1,7 @@ +name: Desert +spawn_position[] + 300 + 300 +size[] + 6 + 6 diff --git a/parts/zones/farm.txt b/parts/zones/farm.txt new file mode 100644 index 0000000..8913982 --- /dev/null +++ b/parts/zones/farm.txt @@ -0,0 +1,7 @@ +name: Farm +spawn_position[] + 300 + 300 +size[] + 6 + 5 diff --git a/parts/zones/forest.txt b/parts/zones/forest.txt new file mode 100644 index 0000000..eae2012 --- /dev/null +++ b/parts/zones/forest.txt @@ -0,0 +1,7 @@ +name: Forest +spawn_position[] + 300 + 300 +size[] + 5 + 6 diff --git a/parts/zones/images/desert.aseprite b/parts/zones/images/desert.aseprite new file mode 100644 index 0000000..4b76aeb Binary files /dev/null and b/parts/zones/images/desert.aseprite differ diff --git a/parts/zones/images/desert.png b/parts/zones/images/desert.png new file mode 100644 index 0000000..68592e8 Binary files /dev/null and b/parts/zones/images/desert.png differ diff --git a/parts/zones/images/desert.png.import b/parts/zones/images/desert.png.import new file mode 100644 index 0000000..cff7016 --- /dev/null +++ b/parts/zones/images/desert.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvsvyi0xp0o83" +path="res://.godot/imported/desert.png-83f64cc39e843c9764beded9278d927d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/zones/images/desert.png" +dest_files=["res://.godot/imported/desert.png-83f64cc39e843c9764beded9278d927d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/zones/images/farm.aseprite b/parts/zones/images/farm.aseprite new file mode 100644 index 0000000..a40eb4d Binary files /dev/null and b/parts/zones/images/farm.aseprite differ diff --git a/parts/zones/images/farm.png b/parts/zones/images/farm.png new file mode 100644 index 0000000..29f7611 Binary files /dev/null and b/parts/zones/images/farm.png differ diff --git a/parts/zones/images/farm.png.import b/parts/zones/images/farm.png.import new file mode 100644 index 0000000..11f98d2 --- /dev/null +++ b/parts/zones/images/farm.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvhlm0uknvwsm" +path="res://.godot/imported/farm.png-ee6a284a064d9a624e7e48aefd058831.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/zones/images/farm.png" +dest_files=["res://.godot/imported/farm.png-ee6a284a064d9a624e7e48aefd058831.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/zones/images/forest.aseprite b/parts/zones/images/forest.aseprite new file mode 100644 index 0000000..a6cc9cb Binary files /dev/null and b/parts/zones/images/forest.aseprite differ diff --git a/parts/zones/images/forest.png b/parts/zones/images/forest.png new file mode 100644 index 0000000..7a88f8f Binary files /dev/null and b/parts/zones/images/forest.png differ diff --git a/parts/zones/images/forest.png.import b/parts/zones/images/forest.png.import new file mode 100644 index 0000000..a060ffb --- /dev/null +++ b/parts/zones/images/forest.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqf2ip155wi0f" +path="res://.godot/imported/forest.png-fe66986e2efa37433265a3b2795eec5e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/zones/images/forest.png" +dest_files=["res://.godot/imported/forest.png-fe66986e2efa37433265a3b2795eec5e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/zones/images/home.aseprite b/parts/zones/images/home.aseprite new file mode 100644 index 0000000..3262282 Binary files /dev/null and b/parts/zones/images/home.aseprite differ diff --git a/parts/zones/images/home.png b/parts/zones/images/home.png new file mode 100644 index 0000000..d349f1a Binary files /dev/null and b/parts/zones/images/home.png differ diff --git a/parts/zones/images/home.png.import b/parts/zones/images/home.png.import new file mode 100644 index 0000000..76e22aa --- /dev/null +++ b/parts/zones/images/home.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c37jv23kd15ay" +path="res://.godot/imported/home.png-bb98419f444d713366b962183b74da8c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/zones/images/home.png" +dest_files=["res://.godot/imported/home.png-bb98419f444d713366b962183b74da8c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/zones/images/lake.aseprite b/parts/zones/images/lake.aseprite new file mode 100644 index 0000000..f14674a Binary files /dev/null and b/parts/zones/images/lake.aseprite differ diff --git a/parts/zones/images/lake.png b/parts/zones/images/lake.png new file mode 100644 index 0000000..8107ae7 Binary files /dev/null and b/parts/zones/images/lake.png differ diff --git a/parts/zones/images/lake.png.import b/parts/zones/images/lake.png.import new file mode 100644 index 0000000..35ff5e9 --- /dev/null +++ b/parts/zones/images/lake.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yfm0e42qvsuu" +path="res://.godot/imported/lake.png-a28a97afe870002293b8b431e484f676.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://parts/zones/images/lake.png" +dest_files=["res://.godot/imported/lake.png-a28a97afe870002293b8b431e484f676.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/parts/zones/lake.txt b/parts/zones/lake.txt new file mode 100644 index 0000000..9fccfa8 --- /dev/null +++ b/parts/zones/lake.txt @@ -0,0 +1,7 @@ +name: Lake +spawn_position[] + 300 + 300 +size[] + 7 + 4 diff --git a/project.godot b/project.godot index e558bd0..6299970 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="ld-56" -run/main_scene="res://components/Menu/Menu.tscn" +run/main_scene="res://Main.tscn" config/features=PackedStringArray("4.3", "GL Compatibility") config/icon="res://icon.svg" @@ -27,8 +27,18 @@ Dialogue="*res://components/Dialogue/Dialogue.tscn" [display] -window/size/viewport_width=640 -window/size/viewport_height=360 +window/size/viewport_width=312 +window/size/viewport_height=180 +window/size/mode=3 +window/size/resizable=false +window/size/borderless=true +window/size/transparent=true +window/size/no_focus=true +window/size/window_width_override=1248 +window/size/window_height_override=720 +window/subwindows/embed_subwindows=false +window/stretch/scale=4.0 +window/per_pixel_transparency/allowed=true [editor_plugins] @@ -51,3 +61,12 @@ escape={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } +test={ +"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":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":84,"key_label":0,"unicode":116,"location":0,"echo":false,"script":null) +] +} + +[rendering] + +textures/canvas_textures/default_texture_filter=0 diff --git a/src/Creature.tscn b/src/Creature.tscn new file mode 100644 index 0000000..913bdda --- /dev/null +++ b/src/Creature.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=5 format=3 uid="uid://yao5smo8c43u"] + +[ext_resource type="Script" path="res://src/creature.gd" id="1_34bi4"] +[ext_resource type="Texture2D" uid="uid://dnvnm78idadmn" path="res://parts/creatures/images/1x1-1.png" id="2_upgji"] +[ext_resource type="PackedScene" uid="uid://dykc1mgg5uopw" path="res://components/Cursor/MouseHandler.tscn" id="3_vlaga"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_4rqgs"] +size = Vector2(12, 12) + +[node name="Creature" type="Node2D"] +script = ExtResource("1_34bi4") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_upgji") + +[node name="MouseHandler" parent="." instance=ExtResource("3_vlaga")] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="MouseHandler"] +shape = SubResource("RectangleShape2D_4rqgs") + +[connection signal="clicked" from="MouseHandler" to="." method="_on_mouse_handler_clicked"] diff --git a/src/Zone.tscn b/src/Zone.tscn new file mode 100644 index 0000000..9f29208 --- /dev/null +++ b/src/Zone.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=3 uid="uid://c1bqwhwmkp8aw"] + +[ext_resource type="Script" path="res://src/zone.gd" id="1_gihyf"] + +[node name="Zone" type="Window"] +canvas_item_default_texture_filter = 0 +position = Vector2i(0, 36) +unresizable = true +content_scale_mode = 1 +content_scale_factor = 4.0 +script = ExtResource("1_gihyf") + +[node name="Sprite2D" type="Sprite2D" parent="."] diff --git a/src/creature.gd b/src/creature.gd new file mode 100644 index 0000000..b73e515 --- /dev/null +++ b/src/creature.gd @@ -0,0 +1,23 @@ +extends Node2D + +var key + +@onready var data = Data.data.creatures[key] +@onready var image = Data.data.images[key] + +@onready var sprite_2d: Sprite2D = $Sprite2D + +var grabbed = false + +func _ready() -> void: + sprite_2d.texture = image + + +func _process(delta: float) -> void: + if Input.is_action_just_released("left_click"): + grabbed = false + + +func _on_mouse_handler_clicked() -> void: + Triggerer.trigger("grab_creature", {"creature": self}) + grabbed = true diff --git a/src/manager/TimeManager.tscn b/src/manager/TimeManager.tscn new file mode 100644 index 0000000..41c933e --- /dev/null +++ b/src/manager/TimeManager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://cr2nvts234wlw"] + +[ext_resource type="Script" path="res://src/manager/time_manager.gd" id="1_o1jjn"] + +[node name="TimeManager" type="Node"] +script = ExtResource("1_o1jjn") diff --git a/src/manager/time_manager.gd b/src/manager/time_manager.gd new file mode 100644 index 0000000..1fb655e --- /dev/null +++ b/src/manager/time_manager.gd @@ -0,0 +1,37 @@ +extends Node + +@onready var globals = Data.data.globals + +var time = 0 +var current_day = 1 +var current_minutes = 1 +var delay = 2 + + +func _ready() -> void: + time = int(globals.day_length) / 24.0 * 7.0 + + Persister.persist_data("day", current_day) + Persister.persist_data("time", int(time * 1000)) + Persister.persist_data("hour", 7) + Persister.persist_data("minutes", 0) + + +func _process(delta: float) -> void: + if delay > 0: + delay -= delta + return + + time += delta + Persister.persist_data("time", int(time * 1000)) + + var minute_length = int(globals.day_length) / 144.0 + + while current_minutes * minute_length < time: + current_minutes += 1 + Persister.persist_data("hour", (current_minutes / 6) % 24) + Persister.persist_data("minutes", current_minutes % 6 * 10) + + while current_day * int(globals.day_length) < time: + current_day += 1 + Persister.persist_data("day", current_day) diff --git a/src/ui/ActionButton.tscn b/src/ui/ActionButton.tscn new file mode 100644 index 0000000..e4015af --- /dev/null +++ b/src/ui/ActionButton.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=5 format=3 uid="uid://br46gg7k10wt2"] + +[ext_resource type="Texture2D" uid="uid://dwabjc45s6l27" path="res://src/ui/quit.png" id="2_1lquh"] +[ext_resource type="Script" path="res://src/ui/action_button.gd" id="2_fxgn7"] +[ext_resource type="PackedScene" uid="uid://dykc1mgg5uopw" path="res://components/Cursor/MouseHandler.tscn" id="2_okvbn"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cxpom"] +size = Vector2(12, 12) + +[node name="ActionButton" type="Node2D"] +script = ExtResource("2_fxgn7") +color = Color(1, 1, 1, 1) + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(4.76837e-07, 4.76837e-07) +texture = ExtResource("2_1lquh") + +[node name="MouseHandler" parent="." instance=ExtResource("2_okvbn")] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="MouseHandler"] +shape = SubResource("RectangleShape2D_cxpom") + +[connection signal="clicked" from="MouseHandler" to="." method="_on_mouse_handler_clicked"] +[connection signal="hovered" from="MouseHandler" to="." method="_on_mouse_handler_hovered"] +[connection signal="unhovered" from="MouseHandler" to="." method="_on_mouse_handler_unhovered"] diff --git a/src/ui/MainUI.tscn b/src/ui/MainUI.tscn new file mode 100644 index 0000000..f1b8121 --- /dev/null +++ b/src/ui/MainUI.tscn @@ -0,0 +1,144 @@ +[gd_scene load_steps=13 format=3 uid="uid://ccdhbljb3e0oh"] + +[ext_resource type="Theme" uid="uid://ck7603ob4gflc" path="res://Fonts/Theme.tres" id="1_k6a0m"] +[ext_resource type="Texture2D" uid="uid://ca5dpjaoimrej" path="res://src/ui/top-left.png" id="2_nvcj5"] +[ext_resource type="Texture2D" uid="uid://cndrtahwhbkli" path="res://src/ui/coin.png" id="3_b8a62"] +[ext_resource type="Script" path="res://src/ui/day_text.gd" id="3_k76r2"] +[ext_resource type="Script" path="res://src/ui/time_text.gd" id="4_7xwp1"] +[ext_resource type="Script" path="res://src/ui/gold_text.gd" id="5_uk4d4"] +[ext_resource type="PackedScene" uid="uid://br46gg7k10wt2" path="res://src/ui/ActionButton.tscn" id="7_gchpm"] +[ext_resource type="Script" path="res://src/ui/pause_menu.gd" id="8_bnf8a"] +[ext_resource type="Texture2D" uid="uid://ccvmfqybnygqp" path="res://src/ui/pause.png" id="8_vlg72"] +[ext_resource type="Texture2D" uid="uid://dwabjc45s6l27" path="res://src/ui/quit.png" id="8_ytenc"] +[ext_resource type="Texture2D" uid="uid://d1h8n8h0to033" path="res://src/ui/upgrades.png" id="9_5s7ww"] +[ext_resource type="PackedScene" uid="uid://b782aedv3v7df" path="res://src/ui/TextActionButton.tscn" id="9_pynn5"] + +[node name="CanvasLayer" type="CanvasLayer"] + +[node name="Control" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_k6a0m") + +[node name="TextureRect" type="TextureRect" parent="Control"] +layout_mode = 0 +offset_left = 4.0 +offset_top = 4.0 +offset_right = 48.0 +offset_bottom = 31.0 +texture = ExtResource("2_nvcj5") + +[node name="DayText" type="RichTextLabel" parent="Control/TextureRect"] +clip_contents = false +layout_mode = 0 +offset_left = 2.0 +offset_top = 4.0 +offset_right = 57.0 +offset_bottom = 42.0 +bbcode_enabled = true +text = "[center]Wednesday" +script = ExtResource("3_k76r2") + +[node name="TimeText" type="RichTextLabel" parent="Control/TextureRect"] +modulate = Color(0.589096, 0.589096, 0.589096, 1) +clip_contents = false +layout_mode = 0 +offset_left = 10.0 +offset_top = 15.0 +offset_right = 65.0 +offset_bottom = 53.0 +bbcode_enabled = true +text = "[center]07:00am" +script = ExtResource("4_7xwp1") + +[node name="GoldText" type="RichTextLabel" parent="Control/TextureRect"] +modulate = Color(0.870588, 0.619608, 0.254902, 1) +clip_contents = false +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -14.0 +offset_top = -15.0 +offset_right = 41.0 +offset_bottom = 3.0 +grow_horizontal = 2 +grow_vertical = 0 +bbcode_enabled = true +text = "[center]000 G" +script = ExtResource("5_uk4d4") + +[node name="GoldIcon" type="TextureRect" parent="Control/TextureRect"] +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -7.0 +offset_top = -16.0 +offset_right = 1.0 +offset_bottom = -8.0 +grow_horizontal = 2 +grow_vertical = 0 +texture = ExtResource("3_b8a62") + +[node name="TopRight" type="Control" parent="Control"] +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -40.0 +offset_bottom = 40.0 +grow_horizontal = 0 + +[node name="PauseButton" parent="Control/TopRight" instance=ExtResource("7_gchpm")] +position = Vector2(28, 13) +key = "paused" +value = "true" +image = ExtResource("8_vlg72") +color = Color(0.991606, 1, 0.496144, 1) + +[node name="BuildButton" parent="Control/TopRight" instance=ExtResource("7_gchpm")] +position = Vector2(28, 32) +key = "upgrade_menu" +value = "true" +image = ExtResource("9_5s7ww") +color = Color(0.680476, 1, 0.652914, 1) + +[node name="QuitButton" parent="Control/TopRight" instance=ExtResource("7_gchpm")] +position = Vector2(28, 51) +key = "quit" +value = "value" +image = ExtResource("8_ytenc") +color = Color(1, 0.734185, 0.691036, 1) + +[node name="PauseMenu" type="Control" parent="."] +visible = false +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("8_bnf8a") + +[node name="ActionButton" parent="PauseMenu" instance=ExtResource("9_pynn5")] +position = Vector2(160, 96) +key = "paused" +value = "false" + +[node name="ColorRect" type="ColorRect" parent="PauseMenu"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.458824) diff --git a/src/ui/TextActionButton.tscn b/src/ui/TextActionButton.tscn new file mode 100644 index 0000000..8b9740c --- /dev/null +++ b/src/ui/TextActionButton.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=5 format=3 uid="uid://b782aedv3v7df"] + +[ext_resource type="Script" path="res://src/ui/text_action_button.gd" id="1_ha7o3"] +[ext_resource type="Theme" uid="uid://ck7603ob4gflc" path="res://Fonts/Theme.tres" id="2_riwvn"] +[ext_resource type="PackedScene" uid="uid://dykc1mgg5uopw" path="res://components/Cursor/MouseHandler.tscn" id="3_vqkdk"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cxpom"] +size = Vector2(100, 12) + +[node name="TextActionButton" type="Node2D"] +script = ExtResource("1_ha7o3") + +[node name="RichTextLabel" type="RichTextLabel" parent="."] +clip_contents = false +offset_left = -50.0 +offset_top = -4.0 +offset_right = 52.0 +offset_bottom = 10.0 +theme = ExtResource("2_riwvn") +bbcode_enabled = true +text = "[center]Button" + +[node name="MouseHandler" parent="." instance=ExtResource("3_vqkdk")] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="MouseHandler"] +shape = SubResource("RectangleShape2D_cxpom") + +[connection signal="clicked" from="MouseHandler" to="." method="_on_mouse_handler_clicked"] +[connection signal="hovered" from="MouseHandler" to="." method="_on_mouse_handler_hovered"] +[connection signal="unhovered" from="MouseHandler" to="." method="_on_mouse_handler_unhovered"] diff --git a/src/ui/action_button.gd b/src/ui/action_button.gd new file mode 100644 index 0000000..132d7fe --- /dev/null +++ b/src/ui/action_button.gd @@ -0,0 +1,39 @@ +extends Node2D +@export var key: String +@export var value: String +@export var image: Texture2D +@export var color: Color + +var size_tween + +@onready var sprite_2d: Sprite2D = $Sprite2D + +func _ready() -> void: + sprite_2d.texture = image + +func _on_mouse_handler_clicked() -> void: + Persister.persist_data(key, value) + + +func _on_mouse_handler_hovered() -> void: + if size_tween: + size_tween.kill() + + size_tween = create_tween() + size_tween.set_ease(Tween.EASE_OUT) + size_tween.set_trans(Tween.TRANS_BACK) + size_tween.set_parallel() + size_tween.tween_property(self, "scale", Vector2.ONE * 1.04, 0.25) + size_tween.tween_property(self, "modulate", color, 0.25) + + +func _on_mouse_handler_unhovered() -> void: + if size_tween: + size_tween.kill() + + size_tween = create_tween() + size_tween.set_ease(Tween.EASE_OUT) + size_tween.set_trans(Tween.TRANS_QUAD) + size_tween.set_parallel() + size_tween.tween_property(self, "scale", Vector2.ONE, 0.25) + size_tween.tween_property(self, "modulate", Color.WHITE, 0.25) diff --git a/src/ui/coin.aseprite b/src/ui/coin.aseprite new file mode 100644 index 0000000..51e089d Binary files /dev/null and b/src/ui/coin.aseprite differ diff --git a/src/ui/coin.png b/src/ui/coin.png new file mode 100644 index 0000000..5f564b6 Binary files /dev/null and b/src/ui/coin.png differ diff --git a/src/ui/coin.png.import b/src/ui/coin.png.import new file mode 100644 index 0000000..599762d --- /dev/null +++ b/src/ui/coin.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cndrtahwhbkli" +path="res://.godot/imported/coin.png-cd55e2ee13cb064f5049ad0ae96e103e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/ui/coin.png" +dest_files=["res://.godot/imported/coin.png-cd55e2ee13cb064f5049ad0ae96e103e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/src/ui/day_text.gd b/src/ui/day_text.gd new file mode 100644 index 0000000..23e8221 --- /dev/null +++ b/src/ui/day_text.gd @@ -0,0 +1,22 @@ +extends RichTextLabel + +const days = [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" +] + + +func _ready() -> void: + Triggerer.listen("day", _on_day) + _on_day({"value": 1}) + + +func _on_day(data): + var value = data.value + + text = "[center]%s" % [days[(value - 1) % 7]] diff --git a/src/ui/gold_text.gd b/src/ui/gold_text.gd new file mode 100644 index 0000000..e5f3c36 --- /dev/null +++ b/src/ui/gold_text.gd @@ -0,0 +1,11 @@ +extends RichTextLabel + + +func _ready() -> void: + Triggerer.listen("gold", _on_gold) + + +func _on_gold(data): + var value = data.value + + text = "[center]%03d G" % [value] diff --git a/src/ui/pause.aseprite b/src/ui/pause.aseprite new file mode 100644 index 0000000..d540154 Binary files /dev/null and b/src/ui/pause.aseprite differ diff --git a/src/ui/pause.png b/src/ui/pause.png new file mode 100644 index 0000000..0498c2c Binary files /dev/null and b/src/ui/pause.png differ diff --git a/src/ui/pause.png.import b/src/ui/pause.png.import new file mode 100644 index 0000000..85c1892 --- /dev/null +++ b/src/ui/pause.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccvmfqybnygqp" +path="res://.godot/imported/pause.png-abc352f92340fb90c312fe929559e59d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/ui/pause.png" +dest_files=["res://.godot/imported/pause.png-abc352f92340fb90c312fe929559e59d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/src/ui/pause_menu.gd b/src/ui/pause_menu.gd new file mode 100644 index 0000000..4c1717d --- /dev/null +++ b/src/ui/pause_menu.gd @@ -0,0 +1,16 @@ +extends Control + +var tween + + +func _ready() -> void: + modulate = Color.TRANSPARENT + Triggerer.listen("paused", _on_pause_menu) + + +func _on_pause_menu(data) -> void: + if tween: + tween.kill() + + tween = create_tween() + tween.tween_property(self, "modulate", Color.WHITE if data.value else Color.TRANSPARENT, 0.25) diff --git a/src/ui/quit.aseprite b/src/ui/quit.aseprite new file mode 100644 index 0000000..d07567a Binary files /dev/null and b/src/ui/quit.aseprite differ diff --git a/src/ui/quit.png b/src/ui/quit.png new file mode 100644 index 0000000..eefec51 Binary files /dev/null and b/src/ui/quit.png differ diff --git a/src/ui/quit.png.import b/src/ui/quit.png.import new file mode 100644 index 0000000..b569337 --- /dev/null +++ b/src/ui/quit.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwabjc45s6l27" +path="res://.godot/imported/quit.png-6fb6e27403f0123d0e44c30d15486f6b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/ui/quit.png" +dest_files=["res://.godot/imported/quit.png-6fb6e27403f0123d0e44c30d15486f6b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/src/ui/text_action_button.gd b/src/ui/text_action_button.gd new file mode 100644 index 0000000..cdd39a0 --- /dev/null +++ b/src/ui/text_action_button.gd @@ -0,0 +1,33 @@ +extends Node2D +@export var key: String +@export var value: String +@export var text: String + +@onready var rich_text_label: RichTextLabel = $RichTextLabel + +var size_tween + + +func _on_mouse_handler_clicked() -> void: + rich_text_label.text = text + Persister.persist_data(key, value) + + +func _on_mouse_handler_hovered() -> void: + if size_tween: + size_tween.kill() + + size_tween = create_tween() + size_tween.set_ease(Tween.EASE_OUT) + size_tween.set_trans(Tween.TRANS_BACK) + size_tween.tween_property(self, "scale", Vector2.ONE * 1.04, 0.25) + + +func _on_mouse_handler_unhovered() -> void: + if size_tween: + size_tween.kill() + + size_tween = create_tween() + size_tween.set_ease(Tween.EASE_OUT) + size_tween.set_trans(Tween.TRANS_QUAD) + size_tween.tween_property(self, "scale", Vector2.ONE, 0.25) diff --git a/src/ui/time_text.gd b/src/ui/time_text.gd new file mode 100644 index 0000000..4823424 --- /dev/null +++ b/src/ui/time_text.gd @@ -0,0 +1,14 @@ +extends RichTextLabel + + +func _ready() -> void: + Triggerer.listen("minutes", _on_minutes) + + +func _on_minutes(data): + var value = data.value + + text = "[center]%s" % [_convert_to_text(value, Persister.get_value("hour"))] + +func _convert_to_text(minutes, hour): + return "%02d:%02d%s" % [12 if not hour % 12 else hour % 12, minutes, "am" if hour < 12 or hour > 23 else "pm"] diff --git a/src/ui/top-left.aseprite b/src/ui/top-left.aseprite new file mode 100644 index 0000000..9684b39 Binary files /dev/null and b/src/ui/top-left.aseprite differ diff --git a/src/ui/top-left.png b/src/ui/top-left.png new file mode 100644 index 0000000..ff2a21c Binary files /dev/null and b/src/ui/top-left.png differ diff --git a/src/ui/top-left.png.import b/src/ui/top-left.png.import new file mode 100644 index 0000000..4864f7f --- /dev/null +++ b/src/ui/top-left.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ca5dpjaoimrej" +path="res://.godot/imported/top-left.png-9dc28911b5667671317f66a658dbfab6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/ui/top-left.png" +dest_files=["res://.godot/imported/top-left.png-9dc28911b5667671317f66a658dbfab6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/src/ui/upgrades.aseprite b/src/ui/upgrades.aseprite new file mode 100644 index 0000000..e7af775 Binary files /dev/null and b/src/ui/upgrades.aseprite differ diff --git a/src/ui/upgrades.png b/src/ui/upgrades.png new file mode 100644 index 0000000..ea234b2 Binary files /dev/null and b/src/ui/upgrades.png differ diff --git a/src/ui/upgrades.png.import b/src/ui/upgrades.png.import new file mode 100644 index 0000000..b4d2b31 --- /dev/null +++ b/src/ui/upgrades.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1h8n8h0to033" +path="res://.godot/imported/upgrades.png-0873bc255fb4a99c78c3c3ca7fcf6ec3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/ui/upgrades.png" +dest_files=["res://.godot/imported/upgrades.png-0873bc255fb4a99c78c3c3ca7fcf6ec3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/src/zone.gd b/src/zone.gd new file mode 100644 index 0000000..b1e33ac --- /dev/null +++ b/src/zone.gd @@ -0,0 +1,20 @@ +extends Window + +var key + +@onready var data = Data.data.zones[key] +@onready var image = Data.data.images[key] + +@onready var sprite_2d: Sprite2D = $Sprite2D + +const CREATURE = preload("res://src/Creature.tscn") + +func _ready() -> void: + title = data.name + sprite_2d.texture = image + sprite_2d.position = Vector2(int(data.size[0]) * 12 / 2, int(data.size[1]) * 12 / 2) + + var new_creature = CREATURE.instantiate() + new_creature.position = Vector2(50, 50) + new_creature.key = "1x1-1" + add_child(new_creature)