diff --git a/src/actor/Chat.tscn b/src/actor/Chat.tscn index 5b86a65..a139048 100644 --- a/src/actor/Chat.tscn +++ b/src/actor/Chat.tscn @@ -18,10 +18,28 @@ z_as_relative = false script = ExtResource( 2 ) [node name="Bubble" type="Node2D" parent="."] +position = Vector2( 0, -30 ) + +[node name="Shadow" type="Node2D" parent="Bubble"] +modulate = Color( 0, 0, 0, 0.501961 ) +position = Vector2( 7, 10 ) + +[node name="Triangle" type="Polygon2D" parent="Bubble/Shadow"] +position = Vector2( 0, 37.5 ) +polygon = PoolVector2Array( -21.5, 0, 21.5, 0, 0, 40 ) + +[node name="Rect" type="Polygon2D" parent="Bubble/Shadow"] +texture = ExtResource( 1 ) +texture_offset = Vector2( 0, 50 ) +texture_scale = Vector2( 0, 1 ) +polygon = PoolVector2Array( 260, 0.0999985, 259.062, 8.42228, 256.296, 16.3273, 251.84, 23.4185, 245.919, 29.3405, 238.827, 33.7962, 230.922, 36.5623, 222.6, 37.5, -222.6, 37.5, -230.922, 36.5623, -238.827, 33.7962, -245.919, 29.3405, -251.84, 23.4185, -256.296, 16.3273, -259.062, 8.42228, -260, 0.0999952, -260, -0.100002, -259.062, -8.42228, -256.296, -16.3273, -251.841, -23.4185, -245.919, -29.3405, -238.827, -33.7962, -230.922, -36.5623, -222.6, -37.5, 222.6, -37.5, 230.922, -36.5623, 238.827, -33.7962, 245.919, -29.3405, 251.84, -23.4185, 256.296, -16.3273, 259.062, -8.42228, 260, -0.0999919 ) +script = ExtResource( 4 ) +is_baked = false +size = Vector2( 260, 37.5 ) +radius = Plane( -2, -1, -1, -1 ) [node name="Triangle" type="Polygon2D" parent="Bubble"] position = Vector2( 0, 37.5 ) -scale = Vector2( 1e-05, 1e-05 ) polygon = PoolVector2Array( -21.5, 0, 21.5, 0, 0, 40 ) [node name="Rect" type="Polygon2D" parent="Bubble"] @@ -50,6 +68,7 @@ custom_fonts/font = SubResource( 3 ) text = "I do adore the flowers" align = 1 valign = 2 +percent_visible = 1.27778 [node name="Label" type="Label" parent="Bubble/Center"] margin_left = -240.0 @@ -61,3 +80,4 @@ custom_fonts/font = SubResource( 3 ) text = "I do adore the flowers" align = 1 valign = 2 +percent_visible = 1.22222 diff --git a/src/actor/Player.gd b/src/actor/Player.gd index 11aa87e..2024eaa 100644 --- a/src/actor/Player.gd +++ b/src/actor/Player.gd @@ -128,7 +128,7 @@ export (Array, String, MULTILINE) var lines := ["Lovely day!", "I do adore the f export (String, MULTILINE) var queue_write := "" setget set_queue_write onready var chat := get_node_or_null("Sprites/Chat") onready var arrow := get_node_or_null("Sprites/Arrow") -export var chat_offset := Vector2(0, -120) setget set_chat_offset +export var chat_offset := Vector2(0, -130) setget set_chat_offset func _enter_tree(): if Engine.editor_hint: return diff --git a/src/actor/door/DoorLittle.gd b/src/actor/door/DoorLittle.gd index 2e9b319..20c335d 100644 --- a/src/actor/door/DoorLittle.gd +++ b/src/actor/door/DoorLittle.gd @@ -59,16 +59,7 @@ func _physics_process(delta): is_clock = false func activate(): - if not "hub" in scene_path and scene_path.begins_with(Shared.worlds_path): - UI.clock_ease.show = arrow.is_active and Shared.clock_show > 0 - var m = scene_path.lstrip(Shared.worlds_path).rstrip(".tscn") - UI.clock_best.visible = Shared.goals.has(m) - if UI.clock_best.visible: - UI.clock_best.text = "Best: " + Shared.time_string(Shared.goals[m], true) - - UI.clock_goal.visible = Shared.speedruns.has(m) - if UI.clock_goal.visible: - UI.clock_goal.text = "Goal: " + Shared.time_string(Shared.speedruns[m], true) + Shared.speedrun_goal(scene_path, arrow.is_active) func on_enter(): Shared.collect_gem() diff --git a/src/autoload/Chat.gd b/src/autoload/Chat.gd index 2b39474..040af2a 100644 --- a/src/autoload/Chat.gd +++ b/src/autoload/Chat.gd @@ -7,13 +7,14 @@ onready var label := $Bubble/Center/Label onready var rect := $Bubble/Rect onready var triangle := $Bubble/Triangle onready var arrow := $"../Arrow" +onready var shadows := $Bubble/Shadow.get_children() export (Array, String, MULTILINE) var lines := ["Lovely day!", "I do adore the flowers", "Haven't seen you before (:"] export (String, MULTILINE) var queue_write := "" setget set_queue_write export (String, MULTILINE) var dialog := "I do adore the flowers" setget set_dialog export var is_editor := false -export var is_show := false +export var is_show := false setget set_is_show export var panel_grow := Vector2(20, 17) export var show_range := Vector2(0, -30) var panel_min := Vector2(35, 55) @@ -49,8 +50,10 @@ func _physics_process(delta): if rect and triangle: if panel_easy.clock < panel_easy.time: rect.size = panel_easy.move(delta, is_show) + shadows[1].size = rect.size triangle.position.y = rect.size.y triangle.scale = Vector2.ONE * s + shadows[0].transform = triangle.transform # input key_up = Input.is_action_pressed("ui_up") @@ -104,6 +107,10 @@ func set_dialog(arg := dialog): panel_easy.to = (label.get_font("font").get_string_size(dialog) / 2.0) + panel_grow panel_easy.to.x = max(panel_easy.to.x, panel_min.y) +func set_is_show(arg := is_show): + is_show = arg + set_dialog() + func _on_Arrow_open(): if !is_show: is_show = true diff --git a/src/autoload/Shared.gd b/src/autoload/Shared.gd index 1010dc5..43cff67 100644 --- a/src/autoload/Shared.gd +++ b/src/autoload/Shared.gd @@ -20,9 +20,12 @@ signal scene_changed var gem_count := 0 var goals := {} var clock_rank := 0 -enum SPEED {OFF, MAP, FILE, BOTH} +enum SPEED {OFF, MAP, FILE, BOTH, TRADE} var clock_show := 0 -var clock_alpha := 0.5 +var clock_alpha := 1.0 +var clock_decimals := 2 +var clock_best_color := [Color.white, Color("ffff00")] + var speedruns := { "1/2": 11, "1/3": 17.5, @@ -173,8 +176,8 @@ func _physics_process(delta): map_clock += delta # clock label - UI.clock_file.text = time_string(save_time, true) - UI.clock_map.text = time_string(map_clock, true) + UI.clock_file.text = time_string(save_time, clock_decimals) + UI.clock_map.text = time_string(map_clock, clock_decimals) # auto save auto_save_clock += delta @@ -182,11 +185,11 @@ func _physics_process(delta): auto_save_clock = 0.0 save_data() -func time_string(t := 0.0, is_decimal = false, is_min := false, is_hour := false): +func time_string(t := 0.0, dec = 2, is_min := false, is_hour := false): # time var s_hour = str(int(t) / 3600) + ":" if is_hour or t > 3600 else "" var s_min = str((int(t) / 60) % 60).pad_zeros(2 if s_hour else 0) + ":" if is_min or t > 60 else "" - var s_sec = str(fmod(t, 60)).pad_zeros(2).pad_decimals(2 if is_decimal else 0) + var s_sec = str(fmod(t, 60)).pad_zeros(2).pad_decimals(dec) return s_hour + s_min + s_sec @@ -245,6 +248,8 @@ func change_scene(): break if is_instance_valid(door_in): break + speedrun_goal(csfn, map_name != "" and not "hub" in map_name) + emit_signal("scene_changed") func toggle_fullscreen(): @@ -315,6 +320,20 @@ func collect_clocks(g := goals): c += 1 return c +func speedrun_goal(scene_path := csfn, _show := true): + if not "hub" in scene_path and scene_path.begins_with(worlds_path): + UI.clock_ease.show = _show and clock_show > 0 + var m = scene_path.lstrip(worlds_path).rstrip(".tscn") + UI.clock_best.visible = goals.has(m) + if UI.clock_best.visible: + var g = goals[m] + UI.clock_best.text = "Best: " + time_string(g, 2) + UI.clock_best.modulate = clock_best_color[int(goals[m] > 0 and goals[m] < speedruns[m])] + + UI.clock_goal.visible = speedruns.has(m) + if UI.clock_goal.visible: + UI.clock_goal.text = "Goal: " + time_string(speedruns[m], 2) + ### Volume func set_volume(bus = 0, vol = 0): @@ -507,6 +526,7 @@ func save_options(): o["mouse"] = bool(Input.mouse_mode == Input.MOUSE_MODE_VISIBLE) o["clock_show"] = int(clock_show) o["clock_alpha"] = float(clock_alpha) + o["clock_decimals"] = int(clock_decimals) file_save_json("user://options.json", o) @@ -534,6 +554,8 @@ func load_options(): clock_show = int(d["clock_show"]) if d.has("clock_alpha"): clock_alpha = float(d["clock_alpha"]) + if d.has("clock_decimals"): + clock_decimals = int(d["clock_decimals"]) func save_keys(path := "user://keys.tres"): var s_keys = SaveDict.new() diff --git a/src/autoload/UI.gd b/src/autoload/UI.gd index 56432ca..3a600f5 100644 --- a/src/autoload/UI.gd +++ b/src/autoload/UI.gd @@ -46,13 +46,15 @@ func _physics_process(delta): clock_down.modulate.a = clock_ease.count(delta) -func scene_changed(): +func scene_changed(override := false): up.clock = 0.0 - var m = Shared.map_name != "" + var m = Shared.map_name != "" or override + var h = "hub" in Shared.map_name var b = Shared.clock_show == Shared.SPEED.BOTH - clock_file.visible = m and (b or Shared.clock_show == Shared.SPEED.FILE) - clock_map.visible = not "hub" in Shared.map_name and m and (b or Shared.clock_show == Shared.SPEED.MAP) - clock_ease.show = false + var t = Shared.clock_show == Shared.SPEED.TRADE + clock_file.visible = m and ((t and h) or (b or Shared.clock_show == Shared.SPEED.FILE)) + clock_map.visible = m and !h and (t or b or Shared.clock_show == Shared.SPEED.MAP) + clock_ease.show = m and !h and Shared.clock_show > 0 func menu_keys(accept := "", cancel := ""): var c = $Control/Keys/List.get_children() diff --git a/src/autoload/UI.tscn b/src/autoload/UI.tscn index 04fe325..38283aa 100644 --- a/src/autoload/UI.tscn +++ b/src/autoload/UI.tscn @@ -1,17 +1,13 @@ -[gd_scene load_steps=9 format=2] +[gd_scene load_steps=8 format=2] +[ext_resource path="res://src/theme/shadow_text.tres" type="Theme" id=1] [ext_resource path="res://media/font/profile/UI_Keys.tres" type="DynamicFont" id=2] [ext_resource path="res://media/font/profile/UI_gem.tres" type="DynamicFont" id=3] -[ext_resource path="res://media/font/mini-wakuwaku.otf" type="DynamicFontData" id=4] [ext_resource path="res://src/actor/Clock.tscn" type="PackedScene" id=5] [ext_resource path="res://src/actor/Gem.tscn" type="PackedScene" id=6] [ext_resource path="res://src/menu/options/Key.tscn" type="PackedScene" id=9] [ext_resource path="res://src/autoload/UI.gd" type="Script" id=10] -[sub_resource type="DynamicFont" id=1] -size = 50 -font_data = ExtResource( 4 ) - [node name="UI" type="CanvasLayer"] pause_mode = 2 layer = 10 @@ -173,7 +169,6 @@ action = "ui_cancel" is_connect = true [node name="Clock" type="VBoxContainer" parent="Control"] -modulate = Color( 1, 1, 1, 0.5 ) anchor_right = 0.5 anchor_bottom = 1.0 margin_left = 20.0 @@ -183,16 +178,17 @@ margin_bottom = -20.0 rect_min_size = Vector2( 300, 200 ) [node name="File" type="Label" parent="Control/Clock"] +modulate = Color( 1, 0.95, 0.95, 1 ) margin_right = 600.0 margin_bottom = 51.0 -custom_fonts/font = SubResource( 1 ) -text = "3:57" +theme = ExtResource( 1 ) +text = "1:48:02" [node name="Map" type="Label" parent="Control/Clock"] margin_top = 55.0 margin_right = 600.0 margin_bottom = 106.0 -custom_fonts/font = SubResource( 1 ) +theme = ExtResource( 1 ) text = "3:57" [node name="Spacer" type="Control" parent="Control/Clock"] @@ -207,14 +203,16 @@ margin_right = 600.0 margin_bottom = 680.0 [node name="Best" type="Label" parent="Control/Clock/Down"] +modulate = Color( 1, 1, 0, 1 ) margin_right = 600.0 margin_bottom = 51.0 -custom_fonts/font = SubResource( 1 ) -text = "Best 4:38" +theme = ExtResource( 1 ) +text = "Best 17.49" [node name="Goal" type="Label" parent="Control/Clock/Down"] +modulate = Color( 0.341176, 1, 0.341176, 1 ) margin_top = 55.0 margin_right = 600.0 margin_bottom = 106.0 -custom_fonts/font = SubResource( 1 ) -text = "Goal 2:16" +theme = ExtResource( 1 ) +text = "Goal 23.50" diff --git a/src/menu/FileCard.gd b/src/menu/FileCard.gd index 8f17d8f..20f81c6 100644 --- a/src/menu/FileCard.gd +++ b/src/menu/FileCard.gd @@ -28,7 +28,7 @@ func set_card(): clocks.visible = clock_label.text != "0" # time - time_label.text = Shared.time_string(d[slot]["time"], false, true) + time_label.text = Shared.time_string(d[slot]["time"], 0, true) else: is_new = true diff --git a/src/menu/MenuBase.gd b/src/menu/MenuBase.gd index b8e44d3..6d95f05 100644 --- a/src/menu/MenuBase.gd +++ b/src/menu/MenuBase.gd @@ -152,7 +152,7 @@ func set_open(arg := is_open): is_open = arg if is_open: - cursor = 0 + self.cursor = 0 fill_items() UI.menu_keys(text_accept, text_cancel) open() diff --git a/src/menu/options/MenuOptions.gd b/src/menu/options/MenuOptions.gd index 2161aef..21a281d 100644 --- a/src/menu/options/MenuOptions.gd +++ b/src/menu/options/MenuOptions.gd @@ -21,6 +21,7 @@ func open(): func close(): Shared.save_options() + UI.scene_changed() func open_remap(is_gamepad := false): MenuRemap.is_gamepad = is_gamepad diff --git a/src/menu/options/MenuOptions.tscn b/src/menu/options/MenuOptions.tscn index 3d7c73d..8e500b4 100644 --- a/src/menu/options/MenuOptions.tscn +++ b/src/menu/options/MenuOptions.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=21 format=2] +[gd_scene load_steps=22 format=2] [ext_resource path="res://media/image/UI/clock.png" type="Texture" id=1] [ext_resource path="res://media/font/profile/OptionsItem.tres" type="DynamicFont" id=2] @@ -19,6 +19,7 @@ [ext_resource path="res://src/menu/options/scroll/Vsync.gd" type="Script" id=17] [ext_resource path="res://src/menu/options/scroll/Mouse.gd" type="Script" id=18] [ext_resource path="res://src/menu/options/scroll/Borderless.gd" type="Script" id=19] +[ext_resource path="res://src/menu/options/scroll/SpeedDec.gd" type="Script" id=20] [sub_resource type="StyleBoxFlat" id=18] bg_color = Color( 0.75, 0.375, 0.38125, 1 ) @@ -538,7 +539,7 @@ script = ExtResource( 15 ) __meta__ = { "_edit_use_anchors_": false } -list = PoolStringArray( "OFF", "MAP", "FILE", "BOTH" ) +list = PoolStringArray( "OFF", "MAP", "FILE", "BOTH", "TRADE" ) [node name="Label" type="Label" parent="Control/Menu/List/Speedrun"] anchor_right = 0.5 @@ -592,5 +593,35 @@ text = "< HALF >" align = 2 valign = 1 +[node name="Decimals" type="Control" parent="Control/Menu/List" groups=["speed"]] +margin_top = 1370.0 +margin_right = 640.0 +margin_bottom = 1440.0 +rect_min_size = Vector2( 0, 70 ) +script = ExtResource( 20 ) +__meta__ = { +"_edit_use_anchors_": false +} +count = 3 + +[node name="Label" type="Label" parent="Control/Menu/List/Decimals"] +anchor_right = 0.5 +anchor_bottom = 1.0 +size_flags_vertical = 6 +custom_fonts/font = ExtResource( 2 ) +text = "Decimals" +valign = 1 + +[node name="Label2" type="Label" parent="Control/Menu/List/Decimals"] +anchor_left = 0.5 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 25.0 +size_flags_vertical = 6 +custom_fonts/font = ExtResource( 2 ) +text = "< 2 >" +align = 2 +valign = 1 + [editable path="Control/Menu/List/Music"] [editable path="Control/Menu/List/SFX"] diff --git a/src/menu/options/scroll/SpeedAlpha.gd b/src/menu/options/scroll/SpeedAlpha.gd index 27f87fd..d998ba1 100644 --- a/src/menu/options/scroll/SpeedAlpha.gd +++ b/src/menu/options/scroll/SpeedAlpha.gd @@ -7,3 +7,4 @@ func _ready(): func set_value(): Shared.clock_alpha = float(cursor + 1) / list.size() UI.clock.modulate.a = Shared.clock_alpha + UI.scene_changed(true) diff --git a/src/menu/options/scroll/SpeedClock.gd b/src/menu/options/scroll/SpeedClock.gd index 0aef46c..b17420e 100644 --- a/src/menu/options/scroll/SpeedClock.gd +++ b/src/menu/options/scroll/SpeedClock.gd @@ -6,8 +6,5 @@ func _ready(): func set_value(): Shared.clock_show = cursor - var b = cursor == Shared.SPEED.BOTH - UI.clock_file.visible = b or Shared.clock_show == Shared.SPEED.FILE - UI.clock_map.visible = b or Shared.clock_show == Shared.SPEED.MAP - + UI.scene_changed(true) MenuOptions.fill_items() diff --git a/src/menu/options/scroll/SpeedDec.gd b/src/menu/options/scroll/SpeedDec.gd new file mode 100644 index 0000000..be7c23c --- /dev/null +++ b/src/menu/options/scroll/SpeedDec.gd @@ -0,0 +1,9 @@ +extends Scroll + +func _ready(): + cursor = Shared.clock_decimals + set_label() + +func set_value(): + Shared.clock_decimals = cursor + UI.scene_changed(true) diff --git a/src/theme/shadow_text.tres b/src/theme/shadow_text.tres new file mode 100644 index 0000000..a799281 --- /dev/null +++ b/src/theme/shadow_text.tres @@ -0,0 +1,15 @@ +[gd_resource type="Theme" load_steps=3 format=2] + +[ext_resource path="res://media/font/mini-wakuwaku.otf" type="DynamicFontData" id=1] + +[sub_resource type="DynamicFont" id=2] +size = 50 +font_data = ExtResource( 1 ) + +[resource] +default_font = SubResource( 2 ) +Label/colors/font_color = Color( 1, 1, 1, 1 ) +Label/colors/font_color_shadow = Color( 0.3, 0.3, 0.3, 0.25098 ) +Label/constants/shadow_offset_x = 5 +Label/constants/shadow_offset_y = 7 +Label/fonts/font = SubResource( 2 )