diff --git a/prefabs/hit_popup.tscn b/prefabs/hit_popup.tscn
index 13dd7e77..505d985e 100644
--- a/prefabs/hit_popup.tscn
+++ b/prefabs/hit_popup.tscn
@@ -3,9 +3,7 @@
[ext_resource type="FontFile" uid="uid://dvb6fvy008bhv" path="res://fonts/Roboto/Roboto-Medium.ttf" id="1_65qcu"]
[node name="HitPopup" type="Label3D" unique_id=943142641]
-transform = Transform3D(0.75, 0, 0, 0, 0.75, 0, 0, 0, 0.75, 0, 0, 0)
modulate = Color(1, 1, 1, 0.47058824)
outline_modulate = Color(0, 0, 0, 0)
-text = "{0}
-{1}"
+text = "100"
font = ExtResource("1_65qcu")
diff --git a/prefabs/map_info_container.tscn b/prefabs/map_info_container.tscn
index db3771d1..82cb61d5 100644
--- a/prefabs/map_info_container.tscn
+++ b/prefabs/map_info_container.tscn
@@ -33,19 +33,6 @@ corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_i21mh"]
-content_margin_left = 2.0
-content_margin_top = 2.0
-content_margin_right = 2.0
-content_margin_bottom = 2.0
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1m5pv"]
-bg_color = Color(0, 0, 0, 0.3764706)
-corner_radius_top_left = 4
-corner_radius_top_right = 4
-corner_radius_bottom_right = 4
-corner_radius_bottom_left = 4
-
[sub_resource type="ShaderMaterial" id="ShaderMaterial_4d08m"]
shader = ExtResource("2_nrche")
shader_parameter/outline_color = Color(0.05, 0.05, 0.05, 1)
@@ -70,6 +57,13 @@ corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1m5pv"]
+bg_color = Color(0, 0, 0, 0.3764706)
+corner_radius_top_left = 4
+corner_radius_top_right = 4
+corner_radius_bottom_right = 4
+corner_radius_bottom_left = 4
+
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6xsea"]
content_margin_left = 2.0
content_margin_top = 2.0
@@ -176,7 +170,7 @@ outline_color = Color(0, 0, 0, 1)
shadow_size = 4
shadow_color = Color(0, 0, 0, 1)
-[node name="MapInfoContainer" type="Panel" unique_id=150923669 node_paths=PackedStringArray("info", "dim", "coverBackground", "cover", "infoSubholder", "mainLabel", "extraLabel", "artistLink", "exportButton", "favoriteButton", "videoButton", "videoDialog", "copyButton", "copyDialog", "deleteButton", "actions", "preview", "speedHolder", "speedPresets", "playHolder", "startButton", "leaderboard", "lbScrollContainer", "lbContainer", "lbExpand", "lbHide")]
+[node name="MapInfoContainer" type="Panel" unique_id=150923669 node_paths=PackedStringArray("info", "dim", "coverBackground", "cover", "mainLabel", "extraLabel", "artistLink", "exportButton", "favoriteButton", "videoButton", "videoDialog", "copyButton", "copyDialog", "deleteButton", "actions", "preview", "speedHolder", "speedPresets", "playHolder", "startButton", "leaderboard", "lbScrollContainer", "lbContainer", "lbExpand", "lbHide")]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
@@ -188,19 +182,18 @@ theme_override_styles/panel = SubResource("StyleBoxEmpty_svokg")
script = ExtResource("1_50xtp")
info = NodePath("Info")
dim = NodePath("Dim")
-coverBackground = NodePath("Info/ScrollContainer/HBoxContainer/Background")
-cover = NodePath("Info/ScrollContainer/HBoxContainer/Background/Cover")
-infoSubholder = NodePath("Info/ScrollContainer/HBoxContainer")
-mainLabel = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Main")
-extraLabel = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Extra")
-artistLink = NodePath("Info/ScrollContainer/HBoxContainer/Background/ArtistLink")
-exportButton = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Export")
-favoriteButton = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Favorite")
-videoButton = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Video")
-videoDialog = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Video/VideoDialog")
-copyButton = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Copy")
-copyDialog = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Copy/CopyDialog")
-deleteButton = NodePath("Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Delete")
+coverBackground = NodePath("Info/Control/Background")
+cover = NodePath("Info/Control/Background/Cover")
+mainLabel = NodePath("Info/Control/infoControl/infoSubholder/Main")
+extraLabel = NodePath("Info/Control/infoControl/infoSubholder/Extra")
+artistLink = NodePath("Info/Control/Background/ArtistLink")
+exportButton = NodePath("Info/Control/infoControl/infoSubholder/Buttons/Export")
+favoriteButton = NodePath("Info/Control/infoControl/infoSubholder/Buttons/Favorite")
+videoButton = NodePath("Info/Control/infoControl/infoSubholder/Buttons/Video")
+videoDialog = NodePath("Info/Control/infoControl/infoSubholder/Buttons/Video/VideoDialog")
+copyButton = NodePath("Info/Control/infoControl/infoSubholder/Buttons/Copy")
+copyDialog = NodePath("Info/Control/infoControl/infoSubholder/Buttons/Copy/CopyDialog")
+deleteButton = NodePath("Info/Control/infoControl/infoSubholder/Buttons/Delete")
actions = NodePath("Actions")
preview = NodePath("Actions/ScrollContainer/Holder/Preview/AspectRatioContainer/FlatPreview")
speedHolder = NodePath("Actions/ScrollContainer/Holder/Speed")
@@ -232,46 +225,57 @@ grow_horizontal = 2
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_1q06g")
-[node name="ScrollContainer" type="ScrollContainer" parent="Info" unique_id=771327651]
+[node name="Outline" type="Panel" parent="Info" unique_id=1992047374]
+material = SubResource("ShaderMaterial_4d08m")
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_w0o2h")
+
+[node name="Control" type="Control" parent="Info" unique_id=358752342]
+clip_contents = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-mouse_filter = 0
mouse_force_pass_scroll_events = false
theme = ExtResource("4_4d08m")
-theme_override_styles/panel = SubResource("StyleBoxEmpty_i21mh")
-
-[node name="HBoxContainer" type="HBoxContainer" parent="Info/ScrollContainer" unique_id=660353866]
-custom_minimum_size = Vector2(0, 245)
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-[node name="Background" type="TextureRect" parent="Info/ScrollContainer/HBoxContainer" unique_id=1995472053]
+[node name="Background" type="TextureRect" parent="Info/Control" unique_id=1995472053]
show_behind_parent = true
-layout_mode = 2
+layout_mode = 1
+anchors_preset = -1
+anchor_right = 0.34800002
+anchor_bottom = 0.99300003
+offset_left = 2.0
+offset_top = 2.0
+offset_right = -0.34414673
+offset_bottom = -0.040008545
texture = ExtResource("3_ne4r3")
expand_mode = 2
-stretch_mode = 4
-[node name="Cover" type="TextureRect" parent="Info/ScrollContainer/HBoxContainer/Background" unique_id=1954943621]
+[node name="Cover" type="TextureRect" parent="Info/Control/Background" unique_id=1954943621]
layout_mode = 1
anchors_preset = -1
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_left = 8.0
-offset_top = 8.0
-offset_right = -8.0
-offset_bottom = -8.0
+anchor_left = 0.029000001
+anchor_top = 0.029000001
+anchor_right = 0.9710001
+anchor_bottom = 0.9710001
+offset_left = -0.0040006638
+offset_top = -0.0040006638
+offset_right = 0.003967285
+offset_bottom = 0.003967285
grow_horizontal = 2
grow_vertical = 2
expand_mode = 1
-stretch_mode = 6
-[node name="ArtistLink" type="Button" parent="Info/ScrollContainer/HBoxContainer/Background" unique_id=752801089]
+[node name="ArtistLink" type="Button" parent="Info/Control/Background" unique_id=752801089]
layout_mode = 1
anchors_preset = -1
anchor_left = 0.5
@@ -290,7 +294,7 @@ flat = true
alignment = 0
script = ExtResource("4_dccrs")
-[node name="Panel" type="Panel" parent="Info/ScrollContainer/HBoxContainer/Background/ArtistLink" unique_id=194309589]
+[node name="Panel" type="Panel" parent="Info/Control/Background/ArtistLink" unique_id=194309589]
show_behind_parent = true
layout_mode = 1
anchors_preset = 15
@@ -301,65 +305,96 @@ grow_vertical = 2
mouse_filter = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_1m5pv")
-[node name="CoverContainer" type="AspectRatioContainer" parent="Info/ScrollContainer/HBoxContainer" unique_id=1266967334]
+[node name="CoverContainer" type="AspectRatioContainer" parent="Info/Control" unique_id=1266967334]
visible = false
-layout_mode = 2
+layout_mode = 0
+offset_left = 282.0
+offset_top = 2.0
+offset_right = 282.0
+offset_bottom = 278.0
alignment_horizontal = 0
-[node name="Subholder" type="Panel" parent="Info/ScrollContainer/HBoxContainer" unique_id=80746001]
-layout_mode = 2
+[node name="infoControl" type="Control" parent="Info/Control" unique_id=1409035100]
+layout_mode = 1
+anchor_left = 0.35300002
+anchor_right = 1.0
+anchor_bottom = 0.99300003
+offset_left = -0.34335327
+offset_right = -1.5853882
+offset_bottom = -0.040008545
+grow_horizontal = 0
+
+[node name="infoSubholder" type="Panel" parent="Info/Control/infoControl" unique_id=80746001]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.056
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -0.078229904
+offset_right = -0.25408936
+grow_horizontal = 2
+grow_vertical = 2
size_flags_horizontal = 3
-[node name="Extra" type="RichTextLabel" parent="Info/ScrollContainer/HBoxContainer/Subholder" unique_id=469525934]
+[node name="Extra" type="RichTextLabel" parent="Info/Control/infoControl/infoSubholder" unique_id=469525934]
layout_mode = 1
anchors_preset = -1
+anchor_left = 0.019000001
+anchor_top = 0.572
anchor_right = 1.0
anchor_bottom = 1.0
-offset_left = 8.0
-offset_top = 138.0
-offset_right = -8.399963
-offset_bottom = -50.0
-grow_horizontal = 0
+offset_left = -0.08819294
+offset_top = -0.51600647
+offset_right = -8.0
+offset_bottom = -60.0
+grow_horizontal = 2
+grow_vertical = 2
theme = ExtResource("4_4d08m")
theme_override_font_sizes/normal_font_size = 18
bbcode_enabled = true
text = "[color=ffffff88]{0}
-{1} notes
-[color=ffffff44]{2}"
+{1} notes"
+fit_content = true
+autowrap_mode = 2
horizontal_alignment = 2
vertical_alignment = 2
-[node name="Main" type="RichTextLabel" parent="Info/ScrollContainer/HBoxContainer/Subholder" unique_id=394044659]
+[node name="Main" type="RichTextLabel" parent="Info/Control/infoControl/infoSubholder" unique_id=394044659]
layout_mode = 1
anchors_preset = -1
-anchor_right = 1.0
-offset_left = 8.0
+anchor_left = 0.015000001
+anchor_right = 0.984
+anchor_bottom = 0.57600003
+offset_left = 0.21499968
offset_top = 6.0
-offset_right = -8.399963
-offset_bottom = 130.0
+offset_right = -0.09597778
+offset_bottom = -0.12800598
mouse_filter = 1
theme = ExtResource("4_4d08m")
theme_override_constants/paragraph_separation = 4
bbcode_enabled = true
text = "[outline_size=2][font_size=24]{0}
-[color={1}]{2} [font_size=16][color=909096]by {3}"
+[color={1}]{2} [font_size=16][color=909096]
+by {3}
+[font_size=12][color=ffffff44]{4}"
-[node name="Buttons" type="HBoxContainer" parent="Info/ScrollContainer/HBoxContainer/Subholder" unique_id=1191092010]
+[node name="Buttons" type="HBoxContainer" parent="Info/Control/infoControl/infoSubholder" unique_id=1191092010]
custom_minimum_size = Vector2(0, 40)
layout_mode = 1
anchors_preset = -1
-anchor_top = 1.0
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_left = 8.0
-offset_top = -46.0
-offset_right = -6.0
-offset_bottom = -6.0
+anchor_left = 0.016
+anchor_top = 0.906
+anchor_right = 0.98800004
+anchor_bottom = 0.97800004
+offset_left = 0.20531178
+offset_top = -19.868011
+offset_right = -0.1539917
+offset_bottom = 0.115997314
grow_horizontal = 0
grow_vertical = 0
alignment = 2
-[node name="Export" type="Button" parent="Info/ScrollContainer/HBoxContainer/Subholder/Buttons" unique_id=2033571562]
+[node name="Export" type="Button" parent="Info/Control/infoControl/infoSubholder/Buttons" unique_id=2033571562]
layout_mode = 2
tooltip_text = "Exports map into a .phxm file to share easily"
focus_mode = 0
@@ -370,7 +405,7 @@ theme_override_constants/icon_max_width = 24
icon = ExtResource("5_g02bu")
icon_alignment = 1
-[node name="Favorite" type="Button" parent="Info/ScrollContainer/HBoxContainer/Subholder/Buttons" unique_id=1022164792]
+[node name="Favorite" type="Button" parent="Info/Control/infoControl/infoSubholder/Buttons" unique_id=1022164792]
layout_mode = 2
tooltip_text = "Favorite"
focus_mode = 0
@@ -381,7 +416,7 @@ theme_override_constants/icon_max_width = 24
icon = ExtResource("5_1m5pv")
icon_alignment = 1
-[node name="Video" type="Button" parent="Info/ScrollContainer/HBoxContainer/Subholder/Buttons" unique_id=1985048325]
+[node name="Video" type="Button" parent="Info/Control/infoControl/infoSubholder/Buttons" unique_id=1985048325]
visible = false
layout_mode = 2
tooltip_text = "Add Video"
@@ -394,7 +429,7 @@ disabled = true
icon = ExtResource("6_g02bu")
icon_alignment = 1
-[node name="VideoDialog" type="FileDialog" parent="Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Video" unique_id=72805866]
+[node name="VideoDialog" type="FileDialog" parent="Info/Control/infoControl/infoSubholder/Buttons/Video" unique_id=72805866]
oversampling_override = 1.0
title = "Open a File"
position = Vector2i(0, 36)
@@ -403,7 +438,7 @@ access = 2
filters = PackedStringArray("*.mp4")
use_native_dialog = true
-[node name="Copy" type="Button" parent="Info/ScrollContainer/HBoxContainer/Subholder/Buttons" unique_id=2053076461]
+[node name="Copy" type="Button" parent="Info/Control/infoControl/infoSubholder/Buttons" unique_id=2053076461]
visible = false
layout_mode = 2
tooltip_text = "Copy"
@@ -415,12 +450,12 @@ theme_override_constants/icon_max_width = 24
icon = ExtResource("7_oibm8")
icon_alignment = 1
-[node name="CopyDialog" type="FileDialog" parent="Info/ScrollContainer/HBoxContainer/Subholder/Buttons/Copy" unique_id=1634895255]
+[node name="CopyDialog" type="FileDialog" parent="Info/Control/infoControl/infoSubholder/Buttons/Copy" unique_id=1634895255]
access = 2
filters = PackedStringArray("*.phxm")
use_native_dialog = true
-[node name="Delete" type="Button" parent="Info/ScrollContainer/HBoxContainer/Subholder/Buttons" unique_id=2015809903]
+[node name="Delete" type="Button" parent="Info/Control/infoControl/infoSubholder/Buttons" unique_id=2015809903]
layout_mode = 2
tooltip_text = "Delete"
focus_mode = 0
@@ -431,17 +466,6 @@ theme_override_constants/icon_max_width = 24
icon = ExtResource("8_ssthb")
icon_alignment = 1
-[node name="Outline" type="Panel" parent="Info" unique_id=1992047374]
-material = SubResource("ShaderMaterial_4d08m")
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 2
-theme_override_styles/panel = SubResource("StyleBoxFlat_w0o2h")
-
[node name="Actions" type="Panel" parent="." unique_id=1101045169]
clip_contents = true
layout_mode = 1
@@ -533,7 +557,7 @@ offset_right = -8.0
offset_bottom = -8.0
grow_horizontal = 2
grow_vertical = 0
-tooltip_text = "Favorite"
+tooltip_text = "Changes how the camera functions: Spin enables a first-person perspective, while Lock keeps the camera still"
theme = ExtResource("4_4d08m")
script = ExtResource("11_ne4r3")
container = NodePath("ScrollContainer/VBoxContainer")
@@ -665,6 +689,7 @@ grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("4_4d08m")
theme_override_styles/panel = SubResource("StyleBoxEmpty_6xsea")
+vertical_scroll_mode = 0
[node name="Presets" type="HBoxContainer" parent="Actions/ScrollContainer/Holder/Speed/ScrollContainer" unique_id=163344429]
layout_mode = 2
@@ -825,10 +850,11 @@ ticks_position = 3
layout_mode = 1
anchors_preset = -1
anchor_left = 0.1
-anchor_right = 0.9
-anchor_bottom = 0.75
-offset_top = 48.0
-offset_bottom = -24.0
+anchor_top = 0.21800001
+anchor_right = 0.90000004
+anchor_bottom = 0.64000005
+offset_top = 18.352
+offset_bottom = -9.040009
grow_horizontal = 2
grow_vertical = 2
focus_mode = 0
@@ -907,6 +933,8 @@ layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
+offset_left = -3.0
+offset_right = -3.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
diff --git a/prefabs/score_panel.tscn b/prefabs/score_panel.tscn
index 83bfe436..44a6109d 100644
--- a/prefabs/score_panel.tscn
+++ b/prefabs/score_panel.tscn
@@ -6,7 +6,7 @@
[ext_resource type="Texture2D" uid="uid://b0k0ltu15bart" path="res://user/skins/default/modifiers/nofail.png" id="4_ngxw4"]
[ext_resource type="Theme" uid="uid://dhuhu3mmaew1a" path="res://themes/theme.tres" id="5_ngxw4"]
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ngxw4"]
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_bfkib"]
[sub_resource type="LabelSettings" id="LabelSettings_ddh1n"]
font = ExtResource("2_ngxw4")
@@ -52,13 +52,13 @@ shadow_size = 4
shadow_color = Color(0, 0, 0, 1)
[node name="ScorePanel" type="Panel" unique_id=1580355860]
-custom_minimum_size = Vector2(0, 100)
clip_contents = true
+custom_minimum_size = Vector2(0, 100)
anchors_preset = 10
anchor_right = 1.0
size_flags_horizontal = 3
mouse_filter = 1
-theme_override_styles/panel = SubResource("StyleBoxEmpty_ngxw4")
+theme_override_styles/panel = SubResource("StyleBoxEmpty_bfkib")
script = ExtResource("1_rwxrw")
[node name="Background" type="ColorRect" parent="." unique_id=1143150021]
@@ -84,7 +84,7 @@ label_settings = SubResource("LabelSettings_ddh1n")
vertical_alignment = 1
text_overrun_behavior = 3
-[node name="Timer" type="Label" parent="." unique_id=1064018268]
+[node name="Score" type="Label" parent="." unique_id=1064018268]
layout_mode = 1
anchors_preset = -1
anchor_left = 0.6
@@ -98,8 +98,7 @@ label_settings = SubResource("LabelSettings_i1p2f")
horizontal_alignment = 2
vertical_alignment = 1
-[node name="Accuracy1" type="Label" parent="." unique_id=696162467]
-visible = false
+[node name="Accuracy" type="Label" parent="." unique_id=696162467]
layout_mode = 1
anchors_preset = -1
anchor_left = 0.6
@@ -114,30 +113,6 @@ label_settings = SubResource("LabelSettings_exmec")
horizontal_alignment = 2
vertical_alignment = 1
-[node name="Accuracy" type="RichTextLabel" parent="." unique_id=1126934800]
-clip_contents = false
-layout_mode = 1
-anchors_preset = -1
-anchor_left = 0.6
-anchor_top = 0.4
-anchor_right = 1.0
-anchor_bottom = 0.4
-offset_left = 4.0
-offset_top = 4.0
-offset_right = -16.0
-offset_bottom = 25.0
-focus_mode = 0
-mouse_filter = 2
-theme_override_fonts/normal_font = ExtResource("3_314mk")
-theme_override_font_sizes/normal_font_size = 18
-bbcode_enabled = true
-text = "[color=#a0a0a0] ?? [color=#a0a0a0] | 100,000 | 100%"
-fit_content = true
-scroll_active = false
-autowrap_mode = 0
-horizontal_alignment = 2
-vertical_alignment = 1
-
[node name="Time" type="Label" parent="." unique_id=254210783]
layout_mode = 1
anchors_preset = -1
@@ -150,7 +125,7 @@ offset_top = 4.0
offset_right = -16.0
offset_bottom = -8.0
grow_vertical = 0
-text = "1,000 days ago | Version : #"
+text = "1,000 days ago"
label_settings = SubResource("LabelSettings_58c0b")
horizontal_alignment = 2
vertical_alignment = 1
diff --git a/scenes/game.tscn b/scenes/game.tscn
index dfb3003a..97ec2a45 100644
--- a/scenes/game.tscn
+++ b/scenes/game.tscn
@@ -44,7 +44,7 @@
[ext_resource type="Script" uid="uid://dlxxg2h4cl5hj" path="res://scripts/game/ui/PauseMenu.cs" id="38_8ool0"]
[ext_resource type="Script" uid="uid://c24b7vefbxvbh" path="res://scripts/game/ui/PlaytestOverlay.cs" id="40_m4url"]
-[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_a6jk1"]
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_05nbr"]
resource_name = "Material"
transparency = 1
shading_mode = 0
@@ -52,10 +52,10 @@ albedo_texture = ExtResource("2_q78ea")
texture_repeat = false
[sub_resource type="QuadMesh" id="QuadMesh_aih2q"]
-material = SubResource("StandardMaterial3D_a6jk1")
+material = SubResource("StandardMaterial3D_05nbr")
size = Vector2(4, 4)
-[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lvhmj"]
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0sl42"]
transparency = 1
shading_mode = 0
disable_ambient_light = true
@@ -66,7 +66,7 @@ texture_repeat = false
distance_fade_min_distance = 1076.07
[sub_resource type="QuadMesh" id="QuadMesh_xij4d"]
-material = SubResource("StandardMaterial3D_lvhmj")
+material = SubResource("StandardMaterial3D_0sl42")
size = Vector2(0.263, 0.263)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ssr8x"]
@@ -78,14 +78,14 @@ vertex_color_use_as_albedo = true
vertex_color_is_srgb = true
albedo_texture = ExtResource("13_6rhgc")
-[sub_resource type="QuadMesh" id="QuadMesh_5p2n8"]
+[sub_resource type="QuadMesh" id="QuadMesh_458eo"]
[sub_resource type="MultiMesh" id="MultiMesh_e28va"]
transform_format = 1
use_colors = true
-mesh = SubResource("QuadMesh_5p2n8")
+mesh = SubResource("QuadMesh_458eo")
-[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_05nbr"]
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_h3rex"]
resource_name = "Material"
transparency = 1
shading_mode = 0
@@ -93,18 +93,18 @@ albedo_texture = ExtResource("12_pr1ej")
texture_repeat = false
[sub_resource type="QuadMesh" id="QuadMesh_0sl42"]
-material = SubResource("StandardMaterial3D_05nbr")
+material = SubResource("StandardMaterial3D_h3rex")
size = Vector2(4, 4)
-[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rc4du"]
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fedci"]
transparency = 1
shading_mode = 0
albedo_texture = ExtResource("36_05nbr")
[sub_resource type="QuadMesh" id="QuadMesh_oaba0"]
-material = SubResource("StandardMaterial3D_rc4du")
+material = SubResource("StandardMaterial3D_fedci")
-[sub_resource type="ViewportTexture" id="ViewportTexture_pl11u"]
+[sub_resource type="ViewportTexture" id="ViewportTexture_qkpxi"]
viewport_path = NodePath("Runner/HUD/Health/HealthViewport")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4p8vu"]
@@ -112,7 +112,7 @@ resource_local_to_scene = true
transparency = 1
shading_mode = 0
disable_fog = true
-albedo_texture = SubResource("ViewportTexture_pl11u")
+albedo_texture = SubResource("ViewportTexture_qkpxi")
texture_repeat = false
[sub_resource type="QuadMesh" id="QuadMesh_b1hbo"]
@@ -120,7 +120,7 @@ resource_local_to_scene = true
material = SubResource("StandardMaterial3D_4p8vu")
size = Vector2(10.88, 0.8)
-[sub_resource type="ViewportTexture" id="ViewportTexture_sww3w"]
+[sub_resource type="ViewportTexture" id="ViewportTexture_tel4y"]
viewport_path = NodePath("Runner/HUD/PanelLeft/PanelLeftViewport")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nody0"]
@@ -128,16 +128,12 @@ resource_local_to_scene = true
transparency = 1
shading_mode = 0
disable_fog = true
-albedo_texture = SubResource("ViewportTexture_sww3w")
+albedo_texture = SubResource("ViewportTexture_tel4y")
texture_repeat = false
[sub_resource type="QuadMesh" id="QuadMesh_ssyve"]
size = Vector2(4, 10)
-[sub_resource type="LabelSettings" id="LabelSettings_pr1ej"]
-font = ExtResource("21_05nbr")
-font_size = 50
-
[sub_resource type="ShaderMaterial" id="ShaderMaterial_x2xye"]
shader = ExtResource("14_y51pe")
shader_parameter/progress = 0.8870000421325
@@ -154,75 +150,15 @@ bg_color = Color(0, 0, 0, 0)
font = ExtResource("20_pr1ej")
font_size = 50
-[sub_resource type="FontFile" id="FontFile_rc4du"]
-cache/0/variation_coordinates = {}
-cache/0/face_index = 0
-cache/0/embolden = 0.0
-cache/0/transform = Transform2D(1, 0, 0, 1, 0, 0)
-cache/0/spacing_top = 0
-cache/0/spacing_bottom = 0
-cache/0/spacing_space = 0
-cache/0/spacing_glyph = 0
-cache/0/baseline_offset = 0.0
-cache/0/16/0/ascent = 0.0
-cache/0/16/0/descent = 0.0
-cache/0/16/0/underline_position = 0.0
-cache/0/16/0/underline_thickness = 0.0
-cache/0/16/0/scale = 1.0
-
-[sub_resource type="FontFile" id="FontFile_ay2bh"]
-cache/0/variation_coordinates = {}
-cache/0/face_index = 0
-cache/0/embolden = 0.0
-cache/0/transform = Transform2D(1, 0, 0, 1, 0, 0)
-cache/0/spacing_top = 0
-cache/0/spacing_bottom = 0
-cache/0/spacing_space = 0
-cache/0/spacing_glyph = 0
-cache/0/baseline_offset = 0.0
-cache/0/16/0/ascent = 0.0
-cache/0/16/0/descent = 0.0
-cache/0/16/0/underline_position = 0.0
-cache/0/16/0/underline_thickness = 0.0
-cache/0/16/0/scale = 1.0
-
-[sub_resource type="FontFile" id="FontFile_ag8t5"]
-cache/0/variation_coordinates = {}
-cache/0/face_index = 0
-cache/0/embolden = 0.0
-cache/0/transform = Transform2D(1, 0, 0, 1, 0, 0)
-cache/0/spacing_top = 0
-cache/0/spacing_bottom = 0
-cache/0/spacing_space = 0
-cache/0/spacing_glyph = 0
-cache/0/baseline_offset = 0.0
-cache/0/16/0/ascent = 0.0
-cache/0/16/0/descent = 0.0
-cache/0/16/0/underline_position = 0.0
-cache/0/16/0/underline_thickness = 0.0
-cache/0/16/0/scale = 1.0
-
-[sub_resource type="FontFile" id="FontFile_3jteb"]
-cache/0/variation_coordinates = {}
-cache/0/face_index = 0
-cache/0/embolden = 0.0
-cache/0/transform = Transform2D(1, 0, 0, 1, 0, 0)
-cache/0/spacing_top = 0
-cache/0/spacing_bottom = 0
-cache/0/spacing_space = 0
-cache/0/spacing_glyph = 0
-cache/0/baseline_offset = 0.0
-cache/0/16/0/ascent = 0.0
-cache/0/16/0/descent = 0.0
-cache/0/16/0/underline_position = 0.0
-cache/0/16/0/underline_thickness = 0.0
-cache/0/16/0/scale = 1.0
+[sub_resource type="LabelSettings" id="LabelSettings_pr1ej"]
+font = ExtResource("21_05nbr")
+font_size = 50
[sub_resource type="LabelSettings" id="LabelSettings_pause_counter_title"]
font = ExtResource("21_05nbr")
font_size = 50
-[sub_resource type="ViewportTexture" id="ViewportTexture_suyxu"]
+[sub_resource type="ViewportTexture" id="ViewportTexture_5q0nq"]
viewport_path = NodePath("Runner/HUD/PanelRight/PanelRightViewport")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ro5ir"]
@@ -230,7 +166,7 @@ resource_local_to_scene = true
transparency = 1
shading_mode = 0
disable_fog = true
-albedo_texture = SubResource("ViewportTexture_suyxu")
+albedo_texture = SubResource("ViewportTexture_5q0nq")
texture_repeat = false
[sub_resource type="LabelSettings" id="LabelSettings_5bid2"]
@@ -253,7 +189,7 @@ font_size = 50
[sub_resource type="ShaderMaterial" id="ShaderMaterial_gc8yu"]
shader = ExtResource("14_3xchs")
-[sub_resource type="ViewportTexture" id="ViewportTexture_bhx41"]
+[sub_resource type="ViewportTexture" id="ViewportTexture_dgi5k"]
viewport_path = NodePath("Runner/HUD/ProgressBar/ProgressBarViewport")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_p1h21"]
@@ -261,7 +197,7 @@ resource_local_to_scene = true
transparency = 1
shading_mode = 0
disable_fog = true
-albedo_texture = SubResource("ViewportTexture_bhx41")
+albedo_texture = SubResource("ViewportTexture_dgi5k")
texture_repeat = false
[sub_resource type="QuadMesh" id="QuadMesh_7mook"]
@@ -345,12 +281,13 @@ CursorManager = NodePath("CursorManager")
UseGameSpace = true
AddSpaceAsChild = true
-[node name="CursorManager" type="Node" parent="." unique_id=862696440 node_paths=PackedStringArray("runner", "playerInputController", "replayManager", "cursorMesh", "camera")]
+[node name="CursorManager" type="Node" parent="." unique_id=862696440 node_paths=PackedStringArray("runner", "playerInputController", "replayManager", "cursorMesh", "bufferCursor", "camera")]
script = ExtResource("2_nepv3")
runner = NodePath("../Runner")
playerInputController = NodePath("../PlayerInputController")
replayManager = NodePath("../ReplayManager")
cursorMesh = NodePath("../Runner/HUD/Grid/Cursor")
+bufferCursor = NodePath("../Runner/HUD/Grid/BufferCursor")
camera = NodePath("../Runner/Camera3D")
[node name="TrailRenderer" type="Node" parent="CursorManager" unique_id=2058712869 node_paths=PackedStringArray("cursor", "cursorTrail", "runner")]
@@ -389,6 +326,12 @@ script = ExtResource("27_js0lu")
mesh = SubResource("QuadMesh_xij4d")
skeleton = NodePath("../../../..")
+[node name="BufferCursor" type="MeshInstance3D" parent="Runner/HUD/Grid" unique_id=703771191]
+visible = false
+transparency = 1.0
+mesh = SubResource("QuadMesh_xij4d")
+skeleton = NodePath("../../..")
+
[node name="CursorTrail" type="MultiMeshInstance3D" parent="Runner/HUD/Grid" unique_id=913051903]
material_override = SubResource("StandardMaterial3D_ssr8x")
multimesh = SubResource("MultiMesh_e28va")
@@ -452,7 +395,7 @@ transparent_bg = true
canvas_item_default_texture_filter = 2
size = Vector2i(250, 625)
-[node name="Background" type="TextureRect" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=634060823]
+[node name="Background" type="TextureRect" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=1374853699]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
@@ -460,24 +403,7 @@ grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("11_sdncv")
-[node name="Multiplier" type="Label" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=845485554]
-anchors_preset = -1
-anchor_left = 0.5
-anchor_top = 0.65
-anchor_right = 0.5
-anchor_bottom = 0.65
-offset_left = -28.5
-offset_top = -171.25
-offset_right = 28.5
-offset_bottom = -102.25
-grow_horizontal = 2
-grow_vertical = 2
-theme = ExtResource("4_rvp5o")
-text = "1x"
-label_settings = SubResource("LabelSettings_pr1ej")
-horizontal_alignment = 1
-
-[node name="MultiplierProgress" type="Panel" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=502870620]
+[node name="MultiplierProgress" type="Panel" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=1067613329]
clip_children = 2
material = SubResource("ShaderMaterial_x2xye")
anchors_preset = -1
@@ -486,69 +412,55 @@ anchor_top = 0.65
anchor_right = 0.5
anchor_bottom = 0.65
offset_left = -128.0
-offset_top = -267.125
+offset_top = -166.25
offset_right = 128.0
-offset_bottom = -11.125
+offset_bottom = 89.75128
theme_override_styles/panel = SubResource("StyleBoxFlat_56f8v")
-[node name="Score" type="Label" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=1332908445]
+[node name="Score" type="Label" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=1330190508]
anchors_preset = -1
anchor_left = 0.5
anchor_top = 0.35
anchor_right = 0.5
anchor_bottom = 0.35
-offset_left = -96.0
-offset_top = -126.625
-offset_right = 96.0
-offset_bottom = -57.62497
+offset_left = -15.0
+offset_top = -34.5
+offset_right = 15.0
+offset_bottom = 34.500122
grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("4_rvp5o")
-text = "100,000"
+text = "0"
label_settings = SubResource("LabelSettings_usmyc")
horizontal_alignment = 1
-[node name="Grade" type="RichTextLabel" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=325733819]
-clip_contents = false
+[node name="Multiplier" type="Label" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=1660490363]
anchors_preset = -1
anchor_left = 0.5
-anchor_top = 0.86
+anchor_top = 0.65
anchor_right = 0.5
-anchor_bottom = 0.86
-offset_left = -90.0
-offset_top = -167.5
-offset_right = 90.0
-offset_bottom = -64.49988
+anchor_bottom = 0.65
+offset_left = -28.5
+offset_top = -71.25
+offset_right = 28.5
+offset_bottom = -2.2499695
grow_horizontal = 2
grow_vertical = 2
-size_flags_vertical = 4
-focus_mode = 0
-mouse_filter = 2
-theme_override_colors/font_outline_color = Color(0, 0, 0, 0.8627451)
-theme_override_fonts/normal_font = ExtResource("20_pr1ej")
-theme_override_fonts/bold_font = SubResource("FontFile_rc4du")
-theme_override_fonts/bold_italics_font = SubResource("FontFile_ay2bh")
-theme_override_fonts/italics_font = SubResource("FontFile_ag8t5")
-theme_override_fonts/mono_font = SubResource("FontFile_3jteb")
-theme_override_font_sizes/normal_font_size = 60
-bbcode_enabled = true
-text = "??"
-fit_content = true
-scroll_active = false
-autowrap_mode = 0
+theme = ExtResource("4_rvp5o")
+text = "1x"
+label_settings = SubResource("LabelSettings_pr1ej")
horizontal_alignment = 1
-vertical_alignment = 1
-[node name="ComboCount" type="Label" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=2093196584]
+[node name="ComboCount" type="Label" parent="Runner/HUD/PanelLeft/PanelLeftViewport" unique_id=531787894]
anchors_preset = -1
anchor_left = 0.5
anchor_top = 0.86
anchor_right = 0.5
anchor_bottom = 0.86
offset_left = -90.0
-offset_top = -47.5
+offset_top = -34.5
offset_right = 90.0
-offset_bottom = 21.500244
+offset_bottom = 34.5
grow_horizontal = 2
grow_vertical = 2
text = "0"
diff --git a/scenes/main.tscn b/scenes/main.tscn
index 989b8f96..aabb6a1c 100644
--- a/scenes/main.tscn
+++ b/scenes/main.tscn
@@ -8,8 +8,29 @@
[ext_resource type="Texture2D" uid="uid://men3chmi3esy" path="res://textures/ui/add.png" id="6_ya4ey"]
[ext_resource type="Shader" uid="uid://rngh60dyh10b" path="res://scripts/shaders/outline.gdshader" id="7_eb6dy"]
[ext_resource type="Texture2D" uid="uid://3e1tjlr4m0wt" path="res://user/skins/default/game/cursor.png" id="8_85g3d"]
+[ext_resource type="Texture2D" uid="uid://b3g4aw54n6bow" path="res://user/skins/default/game/grid.png" id="8_dgi5k"]
+[ext_resource type="Script" uid="uid://nwvon7h1bvhc" path="res://scripts/ui/menu/SkinPreview/TitlePreview.cs" id="9_5q0nq"]
[ext_resource type="Script" uid="uid://carutkgoqpr4e" path="res://scripts/ui/MenuCursor.cs" id="9_choun"]
[ext_resource type="Script" uid="uid://bmq7ajx48l7ng" path="res://scripts/ui/FPSCounter.cs" id="10_choun"]
+[ext_resource type="Script" uid="uid://bxshhmy8fg6nh" path="res://scripts/ui/menu/SkinPreview/PanelLeftPreview.cs" id="10_qkpxi"]
+[ext_resource type="Texture2D" uid="uid://dw2gxd3m24h4m" path="res://user/skins/default/game/hits.png" id="11_kmb1v"]
+[ext_resource type="Texture2D" uid="uid://ccdaf14yq65jf" path="res://user/skins/default/game/grid_guides.png" id="12_fuf3a"]
+[ext_resource type="Texture2D" uid="uid://bc0w1ujoshiyk" path="res://user/skins/default/game/visibility_assist.png" id="13_pibwh"]
+[ext_resource type="Texture2D" uid="uid://cxv6ey5xb6b0f" path="res://user/skins/default/game/health_background.png" id="15_5he1u"]
+[ext_resource type="Script" uid="uid://cv27mk2qd18i2" path="res://scripts/ui/menu/SkinPreview/PanelRightPreview.cs" id="15_dgi5k"]
+[ext_resource type="Texture2D" uid="uid://4x2vfpyjkri6" path="res://user/skins/default/game/health.png" id="16_5poiv"]
+[ext_resource type="Texture2D" uid="uid://80bitp5weqrb" path="res://user/skins/default/game/panel_left_background.png" id="18_chjal"]
+[ext_resource type="Shader" uid="uid://bx4888tau78tk" path="res://scripts/shaders/combo_progress.gdshader" id="19_cjqg0"]
+[ext_resource type="Script" uid="uid://c3xaw5hps8bel" path="res://scripts/ui/menu/SkinPreview/ProgressBarPreview.cs" id="20_j8jky"]
+[ext_resource type="FontFile" uid="uid://dhyog1pif7c5i" path="res://fonts/Nunito/Nunito-Bold.ttf" id="20_vchkt"]
+[ext_resource type="FontFile" uid="uid://b0ru0lfde5a21" path="res://fonts/Nunito/Nunito-SemiBold.ttf" id="21_txyw0"]
+[ext_resource type="Texture2D" uid="uid://diba7c3s8as4s" path="res://user/skins/default/game/panel_right_background.png" id="23_nvyfr"]
+[ext_resource type="Script" uid="uid://cfavwgar504b0" path="res://scripts/ui/menu/SkinPreview/HealthBarPreview.cs" id="24_kmb1v"]
+[ext_resource type="Texture2D" uid="uid://c3x2cp3tx4vqt" path="res://user/skins/default/game/misses.png" id="24_ty1g6"]
+[ext_resource type="Shader" uid="uid://bp2sv5ynsubi2" path="res://scripts/shaders/alpha_gradient.gdshader" id="25_j2jfr"]
+[ext_resource type="Script" uid="uid://c0of2i2mjcd3r" path="res://scripts/ui/menu/SkinPreview/GridPreview.cs" id="28_fuf3a"]
+[ext_resource type="Texture2D" uid="uid://dmc5f6ajp8xv1" path="res://user/skins/default/game/progress_background.png" id="28_o7ddy"]
+[ext_resource type="Texture2D" uid="uid://d3s17ehomjscd" path="res://user/skins/default/game/progress.png" id="29_0loja"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1q06g"]
bg_color = Color(0, 0, 0, 0.8784314)
@@ -104,6 +125,187 @@ corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tel4y"]
+bg_color = Color(0.16565639, 0.16565642, 0.16565639, 0.8784314)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0, 0, 0, 0.6)
+corner_radius_top_left = 12
+corner_radius_top_right = 12
+corner_radius_bottom_right = 12
+corner_radius_bottom_left = 12
+
+[sub_resource type="ViewportTexture" id="ViewportTexture_152kg"]
+viewport_path = NodePath("Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelLeft/PanelLeftViewport")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r4e17"]
+resource_local_to_scene = true
+transparency = 1
+shading_mode = 0
+disable_fog = true
+albedo_texture = SubResource("ViewportTexture_152kg")
+texture_repeat = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_tel4y"]
+size = Vector2(4, 10)
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_mlv25"]
+shader = ExtResource("19_cjqg0")
+shader_parameter/progress = 0.8870000421325
+shader_parameter/colour = Color(1, 1, 1, 1)
+shader_parameter/background_colour = Color(0.155, 0.155, 0.155, 1)
+shader_parameter/sides = 8
+shader_parameter/thickness = 3.0
+shader_parameter/size = 1.0
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a82wo"]
+bg_color = Color(0, 0, 0, 0)
+
+[sub_resource type="LabelSettings" id="LabelSettings_gdvew"]
+font = ExtResource("20_vchkt")
+font_size = 50
+
+[sub_resource type="LabelSettings" id="LabelSettings_kjtvk"]
+font = ExtResource("21_txyw0")
+font_size = 50
+
+[sub_resource type="LabelSettings" id="LabelSettings_xrs0c"]
+font = ExtResource("21_txyw0")
+font_size = 50
+
+[sub_resource type="ViewportTexture" id="ViewportTexture_fp3uj"]
+viewport_path = NodePath("Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_j4bwh"]
+resource_local_to_scene = true
+transparency = 1
+shading_mode = 0
+disable_fog = true
+albedo_texture = SubResource("ViewportTexture_fp3uj")
+texture_repeat = false
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qkpxi"]
+
+[sub_resource type="QuadMesh" id="QuadMesh_y57op"]
+material = SubResource("StandardMaterial3D_qkpxi")
+size = Vector2(4, 10)
+
+[sub_resource type="LabelSettings" id="LabelSettings_ksmap"]
+font = ExtResource("21_txyw0")
+font_size = 30
+
+[sub_resource type="LabelSettings" id="LabelSettings_ygd8o"]
+font = ExtResource("21_txyw0")
+font_size = 30
+
+[sub_resource type="LabelSettings" id="LabelSettings_2s0kr"]
+font = ExtResource("21_txyw0")
+font_size = 50
+font_color = Color(1, 1, 1, 0.768627)
+
+[sub_resource type="LabelSettings" id="LabelSettings_xaipn"]
+font = ExtResource("21_txyw0")
+font_size = 50
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_ndrjj"]
+shader = ExtResource("25_j2jfr")
+
+[sub_resource type="ViewportTexture" id="ViewportTexture_rc4du"]
+viewport_path = NodePath("Settings/SkinPreviewPanel/SkinPreview/SubViewport/ProgressBar/ProgressBarViewport")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_11yus"]
+resource_local_to_scene = true
+transparency = 1
+shading_mode = 0
+disable_fog = true
+albedo_texture = SubResource("ViewportTexture_rc4du")
+texture_repeat = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_b6ruc"]
+resource_local_to_scene = true
+material = SubResource("StandardMaterial3D_11yus")
+size = Vector2(10.88, 0.8)
+
+[sub_resource type="ViewportTexture" id="ViewportTexture_od4ux"]
+viewport_path = NodePath("Settings/SkinPreviewPanel/SkinPreview/SubViewport/Health/HealthViewport")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xhfw6"]
+resource_local_to_scene = true
+transparency = 1
+shading_mode = 0
+disable_fog = true
+albedo_texture = SubResource("ViewportTexture_od4ux")
+texture_repeat = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_1epgm"]
+resource_local_to_scene = true
+material = SubResource("StandardMaterial3D_xhfw6")
+size = Vector2(10.88, 0.8)
+
+[sub_resource type="Environment" id="Environment_gdxgs"]
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_a6jk1"]
+resource_name = "Material"
+transparency = 1
+shading_mode = 0
+albedo_texture = ExtResource("8_dgi5k")
+texture_repeat = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_augu2"]
+material = SubResource("StandardMaterial3D_a6jk1")
+size = Vector2(4, 4)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_lvhmj"]
+transparency = 1
+shading_mode = 0
+disable_ambient_light = true
+disable_fog = true
+albedo_texture = ExtResource("8_85g3d")
+texture_filter = 5
+texture_repeat = false
+distance_fade_min_distance = 1076.07
+
+[sub_resource type="QuadMesh" id="QuadMesh_tm6hj"]
+material = SubResource("StandardMaterial3D_lvhmj")
+size = Vector2(0.263, 0.263)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_kf5aa"]
+transparency = 1
+cull_mode = 2
+shading_mode = 0
+disable_fog = true
+vertex_color_use_as_albedo = true
+vertex_color_is_srgb = true
+albedo_texture = ExtResource("11_kmb1v")
+
+[sub_resource type="QuadMesh" id="QuadMesh_5p2n8"]
+
+[sub_resource type="MultiMesh" id="MultiMesh_t5ykj"]
+transform_format = 1
+use_colors = true
+mesh = SubResource("QuadMesh_5p2n8")
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_05nbr"]
+resource_name = "Material"
+transparency = 1
+shading_mode = 0
+albedo_texture = ExtResource("12_fuf3a")
+texture_repeat = false
+
+[sub_resource type="QuadMesh" id="QuadMesh_e755i"]
+material = SubResource("StandardMaterial3D_05nbr")
+size = Vector2(4, 4)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rc4du"]
+transparency = 1
+shading_mode = 0
+albedo_texture = ExtResource("13_pibwh")
+
+[sub_resource type="QuadMesh" id="QuadMesh_ro3en"]
+material = SubResource("StandardMaterial3D_rc4du")
+
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_o6xl0"]
[sub_resource type="LabelSettings" id="LabelSettings_tipki"]
@@ -160,8 +362,13 @@ layout_mode = 1
anchors_preset = -1
anchor_left = 0.25
anchor_top = 0.25
-anchor_right = 0.75
-anchor_bottom = 0.75
+anchor_right = 0.75000006
+anchor_bottom = 0.75000006
+offset_right = -6.1035156e-05
+offset_bottom = -6.1035156e-05
+grow_horizontal = 2
+grow_vertical = 2
+offset_transform_visual_only = false
theme = ExtResource("3_tipki")
theme_override_styles/panel = SubResource("StyleBoxFlat_1q06g")
@@ -432,6 +639,30 @@ text = "SETTINGS"
label_settings = SubResource("LabelSettings_osuri")
vertical_alignment = 1
+[node name="RefreshSkinPreview" type="Button" parent="Settings/Holder/Header" unique_id=693048162]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.27800003
+anchor_top = 0.15
+anchor_right = 0.48600003
+anchor_bottom = 0.9250001
+offset_left = 0.07998657
+offset_right = -0.040008545
+theme = ExtResource("3_tipki")
+text = "Refresh Preview"
+
+[node name="ShowSkinPreview" type="Button" parent="Settings/Holder/Header" unique_id=558443082]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.499
+anchor_top = 0.15
+anchor_right = 0.75500005
+anchor_bottom = 0.9250001
+offset_left = -0.1000061
+offset_right = -11.940033
+theme = ExtResource("3_tipki")
+text = "Toggle Skin Preview"
+
[node name="Profiles" type="OptionButton" parent="Settings/Holder/Header" unique_id=716644348]
layout_mode = 1
anchors_preset = -1
@@ -492,7 +723,7 @@ caret_blink = true
[node name="Outline" type="Panel" parent="Settings/Holder" unique_id=1227163057]
material = SubResource("ShaderMaterial_3poq1")
layout_mode = 1
-anchors_preset = 15
+anchors_preset = -1
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
@@ -513,6 +744,413 @@ file_mode = 2
access = 2
use_native_dialog = true
+[node name="SkinPreviewPanel" type="Panel" parent="Settings" unique_id=499692920]
+visible = false
+modulate = Color(1, 1, 1, 0)
+light_mask = 512
+visibility_layer = 512
+z_index = 1
+z_as_relative = false
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.55200005
+anchor_top = 0.279
+anchor_right = 0.919
+anchor_bottom = 0.72400004
+offset_left = -0.5600586
+offset_top = 0.11999512
+offset_right = 0.34692383
+offset_bottom = -0.2800293
+offset_transform_enabled = true
+offset_transform_pivot_ratio = Vector2(1, 1)
+offset_transform_visual_only = false
+focus_behavior_recursive = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_tel4y")
+
+[node name="Label" type="Label" parent="Settings/SkinPreviewPanel" unique_id=742694072]
+z_index = 3
+layout_mode = 1
+anchors_preset = 10
+anchor_right = 1.0
+offset_left = -1.0
+offset_top = -12.0
+offset_right = -1.0
+offset_bottom = 11.0
+grow_horizontal = 2
+text = "SKIN PREVIEW"
+horizontal_alignment = 1
+
+[node name="SkinPreview" type="SubViewportContainer" parent="Settings/SkinPreviewPanel" unique_id=2122293191]
+z_index = 2
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+stretch = true
+
+[node name="SubViewport" type="SubViewport" parent="Settings/SkinPreviewPanel/SkinPreview" unique_id=732895320]
+own_world_3d = true
+transparent_bg = true
+handle_input_locally = false
+msaa_3d = 1
+scaling_3d_scale = 1.5
+anisotropic_filtering_level = 1
+size = Vector2i(470, 320)
+render_target_update_mode = 0
+
+[node name="Combo" type="Node3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport" unique_id=385833504]
+
+[node name="Label" type="Label3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Combo" unique_id=372830576]
+transform = Transform3D(7, 0, 0, 0, 6.89365, -1.21554, 0, 1.21554, 6.89365, 0, 3.5, -10)
+pixel_size = 0.0025
+modulate = Color(1, 1, 1, 0)
+outline_modulate = Color(1, 1, 1, 0.39215687)
+text = "999"
+font = ExtResource("5_choun")
+font_size = 64
+outline_size = 4
+
+[node name="Title" type="Node3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport" unique_id=840531691]
+script = ExtResource("9_5q0nq")
+
+[node name="Label" type="Label3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Title" unique_id=2059982806]
+transform = Transform3D(2, 0, 0, 0, 1.93185, -0.517638, 0, 0.517638, 1.93185, 0, 8.25, -10)
+outline_modulate = Color(0, 0, 0, 0)
+text = "N/A - N/A"
+font = ExtResource("20_vchkt")
+font_size = 64
+autowrap_mode = 3
+width = 2500.0
+
+[node name="PanelLeft" type="MeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport" unique_id=1497917243]
+transform = Transform3D(0.984808, 0, 0.173648, 0, 0.99999994, 0, -0.173648, 0, 0.98480797, -7.5, 9.536743e-07, -9.000001)
+material_override = SubResource("StandardMaterial3D_r4e17")
+mesh = SubResource("QuadMesh_tel4y")
+script = ExtResource("10_qkpxi")
+
+[node name="PanelLeftViewport" type="SubViewport" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelLeft" unique_id=1517733272]
+disable_3d = true
+transparent_bg = true
+size = Vector2i(250, 625)
+
+[node name="Background" type="TextureRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelLeft/PanelLeftViewport" unique_id=1252591779]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("18_chjal")
+
+[node name="MultiplierProgress" type="Panel" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelLeft/PanelLeftViewport" unique_id=403597694]
+clip_children = 2
+material = SubResource("ShaderMaterial_mlv25")
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.65
+anchor_right = 0.5
+anchor_bottom = 0.65
+offset_left = -128.0
+offset_top = -166.25
+offset_right = 128.0
+offset_bottom = 89.75128
+theme_override_styles/panel = SubResource("StyleBoxFlat_a82wo")
+
+[node name="Score" type="Label" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelLeft/PanelLeftViewport" unique_id=117882971]
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.35
+anchor_right = 0.5
+anchor_bottom = 0.35
+offset_left = -30.0
+offset_top = -34.5
+offset_right = 30.0
+offset_bottom = 34.500122
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("3_tipki")
+text = "0"
+label_settings = SubResource("LabelSettings_gdvew")
+horizontal_alignment = 1
+
+[node name="Multiplier" type="Label" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelLeft/PanelLeftViewport" unique_id=1512976271]
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.65
+anchor_right = 0.5
+anchor_bottom = 0.65
+offset_left = -28.5
+offset_top = -71.25
+offset_right = 28.5
+offset_bottom = -2.2499695
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("3_tipki")
+text = "1x"
+label_settings = SubResource("LabelSettings_kjtvk")
+horizontal_alignment = 1
+
+[node name="ComboCount" type="Label" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelLeft/PanelLeftViewport" unique_id=132983092]
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.86
+anchor_right = 0.5
+anchor_bottom = 0.86
+offset_left = -90.0
+offset_top = -34.5
+offset_right = 90.0
+offset_bottom = 34.5
+grow_horizontal = 2
+grow_vertical = 2
+text = "0"
+label_settings = SubResource("LabelSettings_xrs0c")
+horizontal_alignment = 1
+
+[node name="PanelRight" type="MeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport" unique_id=1186413604]
+transform = Transform3D(0.984808, 0, -0.173648, 0, 1, 0, 0.173648, 0, 0.984808, 7.5, 0, -9)
+material_override = SubResource("StandardMaterial3D_j4bwh")
+mesh = SubResource("QuadMesh_y57op")
+script = ExtResource("15_dgi5k")
+
+[node name="PanelRightViewport" type="SubViewport" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight" unique_id=353250979]
+process_mode = 3
+disable_3d = true
+transparent_bg = true
+canvas_item_default_texture_filter = 2
+size = Vector2i(250, 625)
+
+[node name="Background" type="TextureRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=519398642]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("23_nvyfr")
+
+[node name="Accuracy" type="Label" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=1917390646]
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.35
+anchor_right = 0.5
+anchor_bottom = 0.35
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("3_tipki")
+text = "100.00%"
+label_settings = SubResource("LabelSettings_gdvew")
+horizontal_alignment = 1
+
+[node name="Hits" type="Label" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=163179924]
+modulate = Color(1, 1, 1, 0.627451)
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.625
+anchor_right = 0.5
+anchor_bottom = 0.625
+offset_right = -25.0
+offset_bottom = -4.0
+grow_horizontal = 0
+grow_vertical = 2
+size_flags_horizontal = 4
+theme = ExtResource("3_tipki")
+text = "0"
+label_settings = SubResource("LabelSettings_ksmap")
+horizontal_alignment = 2
+
+[node name="Misses" type="Label" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=1997376473]
+modulate = Color(1, 1, 1, 0.627451)
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.625
+anchor_right = 0.5
+anchor_bottom = 0.625
+offset_left = 25.0
+offset_bottom = -4.0
+grow_vertical = 2
+size_flags_horizontal = 4
+theme = ExtResource("3_tipki")
+text = "0"
+label_settings = SubResource("LabelSettings_ygd8o")
+
+[node name="SimpleMisses" type="Label" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=678419666]
+visible = false
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 4
+theme = ExtResource("3_tipki")
+text = "0"
+label_settings = SubResource("LabelSettings_2s0kr")
+
+[node name="Sum" type="Label" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=1801663974]
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.7
+anchor_right = 0.5
+anchor_bottom = 0.7
+grow_horizontal = 2
+grow_vertical = 2
+size_flags_horizontal = 4
+theme = ExtResource("3_tipki")
+text = "0"
+label_settings = SubResource("LabelSettings_xaipn")
+horizontal_alignment = 1
+
+[node name="HitsIcon" type="TextureRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=744614831]
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.625
+anchor_right = 0.5
+anchor_bottom = 0.625
+offset_top = -12.0
+offset_right = -2.0
+offset_bottom = 7.0
+grow_horizontal = 0
+grow_vertical = 2
+theme = ExtResource("3_tipki")
+texture = ExtResource("11_kmb1v")
+expand_mode = 2
+
+[node name="MissesIcon" type="TextureRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=350489808]
+anchors_preset = -1
+anchor_left = 0.5
+anchor_top = 0.625
+anchor_right = 0.5
+anchor_bottom = 0.625
+offset_left = 2.0
+offset_top = -12.0
+offset_bottom = 7.0
+grow_vertical = 2
+theme = ExtResource("3_tipki")
+texture = ExtResource("24_ty1g6")
+expand_mode = 2
+
+[node name="Line" type="ColorRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/PanelRight/PanelRightViewport" unique_id=282594885]
+material = SubResource("ShaderMaterial_ndrjj")
+anchors_preset = -1
+anchor_top = 0.65
+anchor_right = 1.0
+anchor_bottom = 0.65
+offset_left = 16.0
+offset_right = -16.0
+offset_bottom = 2.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="ProgressBar" type="MeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport" unique_id=2054063058]
+transform = Transform3D(1, -3.7252903e-09, 0, 0, 0.965926, -0.258819, 1.4901161e-08, 0.258819, 0.965926, 4.7683716e-07, 6.3, -10)
+cast_shadow = 0
+mesh = SubResource("QuadMesh_b6ruc")
+script = ExtResource("20_j8jky")
+
+[node name="Progress" type="Node3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/ProgressBar" unique_id=734363712]
+transform = Transform3D(1, 0, 0, 0, 0.96592563, 0.25881892, 0, -0.25881892, 0.96592563, 0, -3.4971423, 11.289815)
+
+[node name="Label" type="Label3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/ProgressBar/Progress" unique_id=72322109]
+transform = Transform3D(3.5, 0, 0, 0, 3.38074, -0.905867, 0, 0.905867, 3.38074, 0, 7, -10)
+pixel_size = 0.0025
+modulate = Color(1, 1, 1, 0.74509805)
+outline_modulate = Color(0, 0, 0, 0)
+text = "0:00 / 0:00"
+font = ExtResource("21_txyw0")
+font_size = 64
+
+[node name="ProgressBarViewport" type="SubViewport" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/ProgressBar" unique_id=992979397]
+disable_3d = true
+transparent_bg = true
+canvas_item_default_texture_filter = 2
+size = Vector2i(544, 40)
+size_2d_override = Vector2i(1088, 80)
+size_2d_override_stretch = true
+render_target_update_mode = 4
+
+[node name="Background" type="TextureRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/ProgressBar/ProgressBarViewport" unique_id=204557992]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("28_o7ddy")
+
+[node name="Main" type="TextureRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/ProgressBar/ProgressBarViewport" unique_id=242643232]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("29_0loja")
+expand_mode = 1
+stretch_mode = 1
+
+[node name="Health" type="MeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport" unique_id=1898914194]
+transform = Transform3D(1, 0, 0, 0, 0.965926, 0.258819, 0, -0.258819, 0.965926, 0, -6.3, -10)
+cast_shadow = 0
+mesh = SubResource("QuadMesh_1epgm")
+script = ExtResource("24_kmb1v")
+
+[node name="HealthViewport" type="SubViewport" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Health" unique_id=1286049907]
+disable_3d = true
+transparent_bg = true
+canvas_item_default_texture_filter = 2
+size = Vector2i(544, 40)
+size_2d_override = Vector2i(1088, 80)
+size_2d_override_stretch = true
+render_target_update_mode = 4
+
+[node name="Background" type="TextureRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Health/HealthViewport" unique_id=1346647656]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("15_5he1u")
+
+[node name="Main" type="TextureRect" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Health/HealthViewport" unique_id=94707981]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+texture = ExtResource("16_5poiv")
+expand_mode = 1
+stretch_mode = 1
+
+[node name="Camera3D" type="Camera3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport" unique_id=1275593072]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 3.75)
+environment = SubResource("Environment_gdxgs")
+current = true
+fov = 70.0
+size = 5.0
+
+[node name="Grid" type="MeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport" unique_id=379266135]
+mesh = SubResource("QuadMesh_augu2")
+script = ExtResource("28_fuf3a")
+
+[node name="Cursor" type="MeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Grid" unique_id=1140205940]
+mesh = SubResource("QuadMesh_tm6hj")
+skeleton = NodePath("../..")
+
+[node name="CursorTrail" type="MultiMeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Grid" unique_id=1031907347]
+material_override = SubResource("StandardMaterial3D_kf5aa")
+multimesh = SubResource("MultiMesh_t5ykj")
+
+[node name="GridGuides" type="MeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Grid" unique_id=880461795]
+transform = Transform3D(1.01, 0, 0, 0, 1.01, 0, 0, 0, 1.01, 0, 0, -0.2)
+visible = false
+mesh = SubResource("QuadMesh_e755i")
+skeleton = NodePath("../..")
+
+[node name="VisibilityAssist" type="MeshInstance3D" parent="Settings/SkinPreviewPanel/SkinPreview/SubViewport/Grid" unique_id=2848380]
+transform = Transform3D(300, 0, 0, 0, 300, 0, 0, 0, 300, 0, 0, -140)
+transparency = 0.25
+mesh = SubResource("QuadMesh_ro3en")
+skeleton = NodePath("")
+
[node name="Volume" type="Panel" parent="." unique_id=1219254705]
modulate = Color(1, 1, 1, 0)
z_index = 1
diff --git a/scenes/main_menu.tscn b/scenes/main_menu.tscn
index 4dc0fcb9..c132aad3 100644
--- a/scenes/main_menu.tscn
+++ b/scenes/main_menu.tscn
@@ -54,7 +54,10 @@
[ext_resource type="Texture2D" uid="uid://cfl8us0rpkpqs" path="res://textures/ui/github_hovered.png" id="43_sgh51"]
[ext_resource type="Script" uid="uid://c1235cyjfh4rl" path="res://scripts/ui/LinkPopupButton.cs" id="44_ybca7"]
[ext_resource type="Script" uid="uid://dqi64p5jl23cv" path="res://scripts/ui/menu/VersionLabel.cs" id="45_mb34c"]
+[ext_resource type="Texture2D" uid="uid://dyms3l4x385j" path="res://textures/ui/feedback.png" id="46_41a2d"]
+[ext_resource type="Texture2D" uid="uid://c0gv3fh2rmlcy" path="res://textures/ui/feedback_pressed.png" id="47_f5cck"]
[ext_resource type="Texture2D" uid="uid://8du82a5dxjdk" path="res://user/skins/default/ui/jukebox_play.png" id="48_q1l3m"]
+[ext_resource type="Texture2D" uid="uid://cya1kdxwisvmc" path="res://textures/ui/feedback_hovered.png" id="48_s4ogs"]
[ext_resource type="Texture2D" uid="uid://bpsvcunhigs6c" path="res://user/skins/default/ui/jukebox_skip.png" id="49_7u5pb"]
[sub_resource type="SystemFont" id="SystemFont_lsskb"]
@@ -431,7 +434,7 @@ layout_mode = 2
[node name="Header" type="Label" parent="Menus/Home/News/VBoxContainer" unique_id=1350479761]
layout_mode = 2
-text = "Score Overhaul PTB"
+text = "0.1.2 (early-26apr30)"
label_settings = SubResource("LabelSettings_0uejd")
horizontal_alignment = 1
vertical_alignment = 1
@@ -445,11 +448,12 @@ theme_override_constants/paragraph_separation = 6
theme_override_fonts/normal_font = ExtResource("7_6h3lr")
theme_override_styles/normal = SubResource("StyleBoxEmpty_k5xsf")
bbcode_enabled = true
-text = "[font_size=28][b]CHANGES[/b][font_size=18]
-- Normalized Scoring (Perfect FC = 1 million score)[br]- Judgement Overhaul (4 judgements total, previously 2)[br]- Mult. cap 8 > 6[br]- On note miss, lose Mult. / 2 rounded down[br]
-[font_size=28][b]NOTICE[/b][font_size=24]
-!! This branch will wipe your old scores set before this version !![font_size=18] [br]- You may encounter bugs, report them via #bug-reports
-- We would like to hear your feedback in our #ptb-feedback channel"
+text = "[font_size=28][b]FEATURES[/b][font_size=18]
++ Galaxy space[br]+ Tunnel space[br]+ Cursor Rotation setting[br]+ Cursor Opacity setting[br]+ Space to Pause setting[br]+ Local Offset setting[br]+ More volume settings[br]+ Super Simple HUD setting[br]+ Hold R to exit map keybind[br]+ F1 to open wiki keybind[br]+ Ctrl + M to mute keybind[br]+ Miss sounds[br]+ Menu music (currently empty, replace menu.mp3 to your skin folder)[br]* Changed Fade Out setting to a slider & updated its behaviour to work more like Fade In[br]* Added support for nightly colorset format
+[font_size=28][b]FIXES[/b][font_size=18]
+* Fixed comma decimal separator number formatting[br]* Fixed Start From slider with comma decimal separator[br]* Fixed map info covers resizing after import[br]* Fixed map list not updating on map deletion[br]* Safer cover & skin texture loading[br]* Safer note color parsing[br]* Fixed maps failing to import on systems with <4 threads[br]* Dynamic song resyncing during gameplay[br]* Fixed song progress bar incremental update delay[br]* Fixed double Esc to open game menu after opening settings[br]* Fixed flickering notes in replays[br]* Fixed clicking outside the update popup causing a softlock[br]* Fixed displayed selected profile inaccurate[br]* Fixed number range settings imprecision[br]* Fixed song search bar not focusing on key press after using slider
+[font_size=28][b]MISC[/b][font_size=18]
+* Cap framerate at 30 when unfocused[br]* Allow windowed mode to be resized"
shortcut_keys_enabled = false
[node name="Panel" type="Panel" parent="Menus/Home/News/VBoxContainer/RichTextLabel" unique_id=1035549202]
@@ -753,9 +757,11 @@ theme_override_styles/panel = SubResource("StyleBoxEmpty_18lcc")
[node name="HBoxContainer" type="HBoxContainer" parent="Menus/Play/SubTopBar" unique_id=613796792]
layout_mode = 1
anchors_preset = -1
-anchor_top = 0.5
+anchor_top = 0.179
anchor_right = 1.0
-anchor_bottom = 0.5
+anchor_bottom = 0.82100004
+offset_top = 17.976
+offset_bottom = -17.976002
grow_horizontal = 2
grow_vertical = 2
alignment = 2
@@ -763,7 +769,7 @@ alignment = 2
[node name="Settings" type="Button" parent="Menus/Play/SubTopBar/HBoxContainer" unique_id=384311335]
custom_minimum_size = Vector2(0, 36)
layout_mode = 2
-tooltip_text = "CTRL + O"
+tooltip_text = "Game settings, can be opened up at anytime using CTRL + O"
focus_mode = 0
mouse_default_cursor_shape = 2
theme = ExtResource("6_engjn")
@@ -775,6 +781,7 @@ script = ExtResource("8_yxnar")
[node name="UserFolder" type="Button" parent="Menus/Play/SubTopBar/HBoxContainer" unique_id=1212420658]
custom_minimum_size = Vector2(0, 36)
layout_mode = 2
+tooltip_text = "Opens up the game's user folder, allows you to manually import or modify files."
focus_mode = 0
mouse_default_cursor_shape = 2
theme = ExtResource("6_engjn")
@@ -786,6 +793,7 @@ script = ExtResource("27_eku7s")
[node name="Import" type="Button" parent="Menus/Play/SubTopBar/HBoxContainer" unique_id=554381373]
custom_minimum_size = Vector2(0, 36)
layout_mode = 2
+tooltip_text = "Import maps, you can mass import with this"
focus_mode = 0
mouse_default_cursor_shape = 2
theme = ExtResource("6_engjn")
@@ -1901,9 +1909,32 @@ grow_horizontal = 2
grow_vertical = 2
alignment = 2
+[node name="Feedback" type="TextureButton" parent="TopBar/LinkButtons" unique_id=169604797]
+layout_mode = 2
+size_flags_vertical = 4
+tooltip_text = "Feedback form"
+focus_mode = 0
+mouse_default_cursor_shape = 2
+texture_normal = ExtResource("46_41a2d")
+texture_pressed = ExtResource("47_f5cck")
+texture_hover = ExtResource("48_s4ogs")
+
+[node name="Button" type="Button" parent="TopBar/LinkButtons/Feedback" unique_id=1650047982]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+mouse_filter = 1
+flat = true
+script = ExtResource("44_ybca7")
+Link = "https://forms.gle/eyGTBKJskSmAux8P8"
+
[node name="GitHub" type="TextureButton" parent="TopBar/LinkButtons" unique_id=1795081095]
layout_mode = 2
size_flags_vertical = 4
+tooltip_text = "Our GitHub page"
focus_mode = 0
mouse_default_cursor_shape = 2
texture_normal = ExtResource("41_akqfu")
@@ -1925,6 +1956,7 @@ Link = "https://github.com/Rhythia"
[node name="Discord" type="TextureButton" parent="TopBar/LinkButtons" unique_id=36147158]
layout_mode = 2
size_flags_vertical = 4
+tooltip_text = "Our official Discord"
focus_mode = 0
mouse_default_cursor_shape = 2
texture_normal = ExtResource("20_qw82i")
diff --git a/scenes/results.tscn b/scenes/results.tscn
index 617d1da7..2d910e0f 100644
--- a/scenes/results.tscn
+++ b/scenes/results.tscn
@@ -66,16 +66,6 @@ font_size = 42
font = ExtResource("2_f4qdi")
font_size = 42
-[sub_resource type="LabelSettings" id="LabelSettings_gdxgs"]
-
-[sub_resource type="LabelSettings" id="LabelSettings_00qb5"]
-font_size = 12
-font_color = Color(1, 1, 1, 0.29411766)
-
-[sub_resource type="LabelSettings" id="LabelSettings_00fns"]
-font_size = 8
-font_color = Color(1, 1, 1, 0.29411766)
-
[sub_resource type="LabelSettings" id="LabelSettings_6anxq"]
font = ExtResource("3_rsbg1")
font_size = 11
@@ -314,110 +304,22 @@ offset_bottom = -96.0
color = Color(1, 1, 1, 0)
script = ExtResource("4_b55ol")
-[node name="Perfects" type="Label" parent="Holder/Graph" unique_id=1872425890]
-layout_mode = 1
-anchors_preset = 10
-anchor_right = 1.0
-offset_top = -23.0
-offset_bottom = 23.0
-grow_horizontal = 2
-text = "Perfects: #"
-label_settings = SubResource("LabelSettings_gdxgs")
-horizontal_alignment = 1
-
-[node name="Greats" type="Label" parent="Holder/Graph" unique_id=1220219417]
-layout_mode = 1
-anchors_preset = 10
-anchor_right = 1.0
-offset_top = 76.0
-offset_bottom = 93.0
-grow_horizontal = 2
-text = "Greats: #"
-label_settings = SubResource("LabelSettings_00qb5")
-horizontal_alignment = 1
-
-[node name="Okays" type="Label" parent="Holder/Graph" unique_id=436182218]
-layout_mode = 1
-anchors_preset = 10
-anchor_right = 1.0
-offset_top = 112.0
-offset_bottom = 124.0
-grow_horizontal = 2
-text = "Okays: #"
-label_settings = SubResource("LabelSettings_00fns")
-horizontal_alignment = 1
-
-[node name="Bads" type="Label" parent="Holder/Graph" unique_id=1134517622]
-layout_mode = 1
-anchors_preset = 10
-anchor_right = 1.0
-offset_top = 134.0
-offset_bottom = 146.0
-grow_horizontal = 2
-text = "Bads: #"
-label_settings = SubResource("LabelSettings_00fns")
-horizontal_alignment = 1
-
[node name="OffsetTop" type="Label" parent="Holder/Graph" unique_id=465789986]
layout_mode = 1
anchors_preset = -1
offset_left = -32.0
-offset_top = -14.0
grow_horizontal = 0
text = "0ms"
label_settings = SubResource("LabelSettings_6anxq")
horizontal_alignment = 2
vertical_alignment = 1
-[node name="JudgementGood" type="Label" parent="Holder/Graph" unique_id=79263222]
-layout_mode = 1
-anchors_preset = -1
-anchor_top = 0.578
-anchor_bottom = 0.578
-offset_left = -32.0
-offset_top = -11.480003
-offset_bottom = 11.519997
-grow_horizontal = 0
-text = "31ms"
-label_settings = SubResource("LabelSettings_6anxq")
-horizontal_alignment = 2
-vertical_alignment = 1
-
-[node name="JudgementOkay" type="Label" parent="Holder/Graph" unique_id=73984163]
-layout_mode = 1
-anchors_preset = -1
-anchor_top = 0.76900005
-anchor_bottom = 0.76900005
-offset_left = -32.0
-offset_top = -7.0400085
-offset_bottom = 6.9599915
-grow_horizontal = 0
-text = "41ms"
-label_settings = SubResource("LabelSettings_6anxq")
-horizontal_alignment = 2
-vertical_alignment = 1
-
-[node name="JudgementBad" type="Label" parent="Holder/Graph" unique_id=141723295]
-layout_mode = 1
-anchors_preset = -1
-anchor_top = 0.90000004
-anchor_bottom = 0.90000004
-offset_left = -32.0
-offset_top = -7.0
-offset_bottom = 7.0
-grow_horizontal = 0
-text = "51ms"
-label_settings = SubResource("LabelSettings_6anxq")
-horizontal_alignment = 2
-vertical_alignment = 1
-
[node name="OffsetBottom" type="Label" parent="Holder/Graph" unique_id=2053550374]
layout_mode = 1
anchors_preset = -1
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = -32.0
-offset_bottom = 14.0
grow_horizontal = 0
grow_vertical = 0
text = "55ms"
@@ -425,37 +327,14 @@ label_settings = SubResource("LabelSettings_6anxq")
horizontal_alignment = 2
vertical_alignment = 1
-[node name="PerfectDropoffLine" type="ColorRect" parent="Holder/Graph" unique_id=411211979]
-material = SubResource("ShaderMaterial_b4pmo")
-layout_mode = 1
-anchors_preset = -1
-anchor_top = 0.578
-anchor_right = 1.0
-anchor_bottom = 0.578
-offset_top = -0.4799881
-offset_bottom = 0.5200119
-color = Color(1, 1, 1, 0.12549)
-
-[node name="GoodDropoffLine" type="ColorRect" parent="Holder/Graph" unique_id=247370308]
+[node name="ScoreDropoffLine" type="ColorRect" parent="Holder/Graph" unique_id=411211979]
material = SubResource("ShaderMaterial_b4pmo")
layout_mode = 1
anchors_preset = -1
-anchor_top = 0.772
+anchor_top = 0.455
anchor_right = 1.0
-anchor_bottom = 0.772
-offset_top = -0.5200043
-offset_bottom = 0.47999573
-color = Color(1, 1, 1, 0.12549)
-
-[node name="OkayDropoffLine" type="ColorRect" parent="Holder/Graph" unique_id=549385781]
-material = SubResource("ShaderMaterial_b4pmo")
-layout_mode = 1
-anchors_preset = -1
-anchor_top = 0.90900004
-anchor_right = 1.0
-anchor_bottom = 0.90900004
-offset_top = -0.44000244
-offset_bottom = 0.55999756
+anchor_bottom = 0.455
+offset_bottom = 1.0
color = Color(1, 1, 1, 0.12549)
[node name="TopBar" type="Panel" parent="." unique_id=571217894]
@@ -591,7 +470,6 @@ text = "Watch Replay"
flat = true
[node name="Transition" type="ColorRect" parent="." unique_id=529428316]
-visible = false
self_modulate = Color(1, 1, 1, 0)
anchors_preset = 15
anchor_right = 1.0
diff --git a/scripts/KeybindsManager.cs b/scripts/KeybindsManager.cs
index 6708caf1..45f6919d 100644
--- a/scripts/KeybindsManager.cs
+++ b/scripts/KeybindsManager.cs
@@ -42,9 +42,9 @@ public override void _Input(InputEvent @event)
{
if (eventKey.Keycode == Key.F11 || (eventKey.AltPressed && (eventKey.Keycode == Key.Enter || eventKey.Keycode == Key.KpEnter)))
{
- bool value = DisplayServer.WindowGetMode() == DisplayServer.WindowMode.Windowed;
+ bool windowed = DisplayServer.WindowGetMode() == DisplayServer.WindowMode.Windowed;
- settings.Fullscreen.Value = value;
+ settings.WindowMode.Value = (windowed ? WindowDisplayMode.Fullscreen : WindowDisplayMode.Windowed).ToString();
}
break;
}
diff --git a/scripts/Rhythia.cs b/scripts/Rhythia.cs
index 15e26357..3cd8db15 100644
--- a/scripts/Rhythia.cs
+++ b/scripts/Rhythia.cs
@@ -198,6 +198,7 @@ public static void RegisterModifiers()
new AutoplayModifier(),
new GhostModifier(),
new StrobeModifier(),
+ new FlickerModifier(),
new ChaosModifier(),
new VortexModifier(),
new EarthquakeModifier(),
diff --git a/scripts/database/settings/SettingsProfile.cs b/scripts/database/settings/SettingsProfile.cs
index c0e53585..0f364d8c 100644
--- a/scripts/database/settings/SettingsProfile.cs
+++ b/scripts/database/settings/SettingsProfile.cs
@@ -292,16 +292,10 @@ public partial class SettingsProfile
#region Video
///
- /// Toggles the window to Fullsceen
+ /// Changes how the window is displayed
///
[Order]
- public SettingsItem Fullscreen { get; private set; }
-
- ///
- /// Toggles Borderless Fullscreen mode if Fullscreen is enabled
- ///
- [Order]
- public SettingsItem BorderlessFullscreen { get; private set; }
+ public SettingsItem WindowMode { get; private set; }
///
/// Locks maximum frames per second
@@ -461,6 +455,12 @@ public partial class SettingsProfile
///
public SettingsItem OptionalPlaytestParameters { get; private set; }
+ [Order]
+ ///
+ /// Hides Notifications, unless they're important
+ ///
+ public SettingsItem HideNotifications { get; private set; }
+
[Order]
///
/// Restarts settings to the game's defaults
@@ -783,13 +783,6 @@ public SettingsProfile()
Title = "Space Hit Effects",
Description = "Toggles note hit effects for the game space",
Section = SettingsSection.Spaces,
- UpdateAction = (_, init) =>
- {
- if ((bool)SpaceHitEffects.GetVariant())
- {
- CustomSpaceColor.SetVariant(false);
- }
- },
};
SpaceEffects = new(true)
@@ -1078,22 +1071,14 @@ public SettingsProfile()
#region Video
- Fullscreen = new(true)
+ WindowMode = new(nameof(WindowDisplayMode.Fullscreen))
{
- Id = "Fullscreen",
- Title = "Fullscreen",
- Description = "Toggles the window to fullscreen",
- Section = SettingsSection.Video,
- UpdateAction = (_, _) => updateWindowMode(),
- };
-
- BorderlessFullscreen = new(false)
- {
- Id = "BorderlessFullscreen",
- Title = "Borderless Fullscreen",
- Description = "Alters the Fullscreen toggle to use Borderless fullscreen instead of Exclusive, may fix some issues with drawing tablets",
+ Id = "WindowMode",
+ Title = "Window Mode",
+ Description = "Changes how the window is displayed, Borderless may fix some issues with drawing tablets",
Section = SettingsSection.Video,
UpdateAction = (_, _) => updateWindowMode(),
+ List = new(nameof(WindowDisplayMode.Fullscreen)) { Values = [.. Enum.GetNames()] },
};
LockFPS = new(false)
@@ -1530,6 +1515,14 @@ public SettingsProfile()
Section = SettingsSection.Other,
};
+ HideNotifications = new(false)
+ {
+ Id = "HideNotifications",
+ Title = "Hide Notifications",
+ Description = "Hides notifications, important ones will still display",
+ Section = SettingsSection.Other,
+ };
+
ResetToDefaults = new(default)
{
Id = "ResetToDefaults",
@@ -1594,11 +1587,14 @@ private void updateApproachTime()
private void updateWindowMode()
{
- var windowMode = Fullscreen
- ? (!BorderlessFullscreen ? DisplayServer.WindowMode.ExclusiveFullscreen : DisplayServer.WindowMode.Fullscreen)
- : DisplayServer.WindowMode.Windowed;
-
- DisplayServer.WindowSetMode(windowMode);
+ DisplayServer.WindowSetMode(
+ Enum.Parse(WindowMode.Value) switch
+ {
+ WindowDisplayMode.Fullscreen => DisplayServer.WindowMode.ExclusiveFullscreen,
+ WindowDisplayMode.Borderless => DisplayServer.WindowMode.Fullscreen,
+ _ => DisplayServer.WindowMode.Windowed,
+ }
+ );
}
private static List getAvailableMeshes()
@@ -1618,6 +1614,38 @@ private static List getAvailableMeshes()
return meshes;
}
+ private static List getAvailableSpaces()
+ {
+ List spaces =
+ [
+ "skin",
+ "circulartunnel",
+ "conspiracy",
+ "galaxy",
+ "grid",
+ "relic",
+ "solid",
+ "squircles",
+ "tritunnel",
+ "tunnel",
+ "void",
+ "vortex",
+ "waves",
+ ];
+ string spaceDir = $"{Constants.USER_FOLDER}/spaces";
+
+ if (Directory.Exists(spaceDir))
+ {
+ string[] objFiles = Directory.GetFiles(spaceDir, "*.tscn");
+ foreach (string file in objFiles)
+ {
+ spaces.Add(Path.GetFileNameWithoutExtension(file));
+ }
+ }
+
+ return spaces;
+ }
+
public static void ImportFromNightlySettings(string settingsPath)
{
string nightlySettings = File.Exists(settingsPath) ? File.ReadAllText(settingsPath) : null;
@@ -1695,7 +1723,10 @@ double importVolume(string nightlyKey, double range)
["SimpleHUD"] = () => getSetting("simple_hud") ?? nightlyProfile.SimpleHUD,
["HitPopups"] = () => getSetting("score_popup") ?? nightlyProfile.HitPopups,
["MissPopups"] = () => getSetting("show_miss_effect") ?? nightlyProfile.MissPopups,
- ["Fullscreen"] = () => getSetting("window_fullscreen") ?? nightlyProfile.Fullscreen,
+ ["WindowMode"] = () =>
+ getSetting("window_fullscreen") is bool fullscreen
+ ? (fullscreen ? nameof(WindowDisplayMode.Fullscreen) : nameof(WindowDisplayMode.Windowed))
+ : nightlyProfile.WindowMode,
["FPS"] = () => getSetting("target_fps") ?? nightlyProfile.FPS,
["VolumeMaster"] = () => 100,
["VolumeMusic"] = () => importVolume("music_volume", 70),
diff --git a/scripts/database/settings/WindowDisplayMode.cs b/scripts/database/settings/WindowDisplayMode.cs
new file mode 100644
index 00000000..9ad5af00
--- /dev/null
+++ b/scripts/database/settings/WindowDisplayMode.cs
@@ -0,0 +1,6 @@
+public enum WindowDisplayMode
+{
+ Windowed,
+ Fullscreen,
+ Borderless,
+}
diff --git a/scripts/database/settings/WindowDisplayMode.cs.uid b/scripts/database/settings/WindowDisplayMode.cs.uid
new file mode 100644
index 00000000..946b3de1
--- /dev/null
+++ b/scripts/database/settings/WindowDisplayMode.cs.uid
@@ -0,0 +1 @@
+uid://drhcijc4ymcuf
diff --git a/scripts/game/Attempt.cs b/scripts/game/Attempt.cs
index fb9b6420..3bea801e 100644
--- a/scripts/game/Attempt.cs
+++ b/scripts/game/Attempt.cs
@@ -29,7 +29,6 @@ public partial class Attempt : RefCounted
public double Length;
public double Accuracy = 100;
- public double Grade = 0;
public double Health = 100;
public double HealthStep = 15;
public bool HasHealthModifier = false;
@@ -37,13 +36,7 @@ public partial class Attempt : RefCounted
public uint Hits = 0;
public uint Misses = 0;
public uint Sum = 0;
- public double Perfects = 0;
- public double Greats = 0;
- public double Okays = 0;
- public double Bads = 0;
- public double Score = 0;
- public double UnitHitScore = 0;
- public uint NoteWeight;
+ public uint Score = 0;
public uint Combo = 0;
public uint ComboMultiplier = 1;
public uint ComboMultiplierProgress = 0;
@@ -58,6 +51,7 @@ public partial class Attempt : RefCounted
public Vector2 CursorPosition = Vector2.Zero;
public Vector2 RawCursorPosition = Vector2.Zero;
+ public Vector2 BufferCursorPosition = Vector2.Zero;
public double DistanceMM = 0;
public ulong FirstNote = 0;
@@ -70,8 +64,6 @@ public partial class Attempt : RefCounted
public uint ReplayFrameCountOffset = 0;
public uint ReplayAttemptStatusOffset = 0;
- public double Version = 1;
-
public Attempt(
Map map,
double speed,
@@ -99,21 +91,6 @@ public Attempt(
Objects[typeof(Note)] = [.. map.Notes];
HitsInfo = IsReplay ? Replays[0].Notes : new float[Map.Notes.Length];
- uint noteWeightIterations = (uint)Math.Clamp(Math.Floor((double)Map.Notes.Length / ComboMultiplierIncrement), 1, 5);
- NoteWeight += Math.Min(ComboMultiplierIncrement, (uint)Map.Notes.Length) * (1 + noteWeightIterations) * noteWeightIterations / 2;
- NoteWeight +=
- ((uint)Map.Notes.Length - Math.Min(ComboMultiplierIncrement, (uint)Map.Notes.Length) * noteWeightIterations) * (noteWeightIterations + 1);
-
- if (Modifiers.Count >= 1)
- {
- foreach (Modifier modifier in Modifiers)
- {
- ModsMultiplier += modifier.ScoreMultiplier - 1;
- }
- }
-
- UnitHitScore = 1000000f * ModsMultiplier * ((Speed - 1) / 2.5 + 1) / NoteWeight;
-
if (IsReplay)
{
foreach (var replay in Replays)
diff --git a/scripts/game/Runner.cs b/scripts/game/Runner.cs
index 17bafcbc..1fde3d1e 100644
--- a/scripts/game/Runner.cs
+++ b/scripts/game/Runner.cs
@@ -507,14 +507,12 @@ public void Stop(bool results = true)
Attempt.ID,
"You",
Attempt.Qualifies,
- (ulong)Math.Round(Attempt.Score),
+ Attempt.Score,
Attempt.Accuracy,
- Attempt.Grade,
Time.GetUnixTimeFromSystem(),
Attempt.Progress,
Attempt.Map.Length,
Speed,
- Attempt.Version,
mods
)
);
@@ -523,7 +521,7 @@ public void Stop(bool results = true)
if (Attempt.Qualifies)
{
Stats.Instance.Passes++;
- Stats.Instance.TotalScore += (ulong)Math.Round(Attempt.Score);
+ Stats.Instance.TotalScore += Attempt.Score;
if (Attempt.Accuracy == 100)
{
@@ -532,7 +530,7 @@ public void Stop(bool results = true)
if (Attempt.Score > Stats.Instance.HighestScore)
{
- Stats.Instance.HighestScore = (ulong)Math.Round(Attempt.Score);
+ Stats.Instance.HighestScore = Attempt.Score;
}
Stats.Instance.AverageAccuracy = (Stats.Instance.AverageAccuracy + Attempt.Accuracy) / Stats.Instance.Passes;
@@ -554,17 +552,15 @@ private void onHitResultChanged(int noteIndex, HitResult hitResult)
float lateness = Attempt.IsReplay
? Attempt.HitsInfo[noteIndex]
: (float)(((int)judgmentProgress - Attempt.Map.Notes[noteIndex].Millisecond) / Speed);
- float factor = 1 - (float)Math.Round(Math.Max(0, lateness - 27) / 104f, 1);
- double hitScore = Attempt.UnitHitScore * Attempt.ComboMultiplier * factor;
+ float factor = 1 - Math.Max(0, lateness - 25) / 150f;
+ uint hitScore = (uint)(100 * Attempt.ComboMultiplier * Attempt.ModsMultiplier * factor * ((Speed - 1) / 2.5 + 1));
switch (hitResult)
{
case HitResult.Hit:
- judgementCheck(factor);
Attempt.Hits++;
Attempt.Sum++;
Attempt.Accuracy = Math.Floor((float)Attempt.Hits / Attempt.Sum * 10000) / 100;
- Attempt.Grade = Math.Clamp(Attempt.Accuracy / 100 * Math.Clamp(Attempt.Score / 1000000, 0, 1), 0, 1);
Attempt.Combo++;
Attempt.ComboMultiplierProgress++;
Attempt.LastHitColour = SkinManager.Instance.Skin.NoteColors[noteIndex % SkinManager.Instance.Skin.NoteColors.Length];
@@ -581,9 +577,9 @@ private void onHitResultChanged(int noteIndex, HitResult hitResult)
if (Attempt.ComboMultiplierProgress == Attempt.ComboMultiplierIncrement)
{
- if (Attempt.ComboMultiplier < 6)
+ if (Attempt.ComboMultiplier < 8)
{
- Attempt.ComboMultiplierProgress = Attempt.ComboMultiplier == 5 ? Attempt.ComboMultiplierIncrement : 0;
+ Attempt.ComboMultiplierProgress = Attempt.ComboMultiplier == 7 ? Attempt.ComboMultiplierIncrement : 0;
Attempt.ComboMultiplier++;
}
}
@@ -593,10 +589,9 @@ private void onHitResultChanged(int noteIndex, HitResult hitResult)
Attempt.Misses++;
Attempt.Sum++;
Attempt.Accuracy = Mathf.Floor((float)Attempt.Hits / Attempt.Sum * 10000) / 100;
- Attempt.Grade = Math.Clamp(Attempt.Accuracy / 100 * Math.Clamp(Attempt.Score / 1000000, 0, 1), 0, 1);
Attempt.Combo = 0;
Attempt.ComboMultiplierProgress = 0;
- Attempt.ComboMultiplier = Math.Max(1, Attempt.ComboMultiplier - (uint)Math.Truncate((double)Attempt.ComboMultiplier / 2));
+ Attempt.ComboMultiplier = Math.Max(1, Attempt.ComboMultiplier - 1);
if (!Attempt.IsReplay)
{
@@ -711,26 +706,4 @@ private void syncSongPosition()
// VideoStreamPlayer.StreamPosition = (float)Attempt.Progress / 1000;
}
}
-
- private void judgementCheck(float factor)
- {
- switch (factor) // judgements
- {
- case 1f:
- Attempt.Perfects++; // pawfect
- break;
-
- case 0.9f:
- Attempt.Greats++; // gewd
- break;
-
- case 0.8f:
- Attempt.Okays++; // okay
- break;
-
- case 0.7f:
- Attempt.Bads++; // bad
- break;
- }
- }
}
diff --git a/scripts/game/camera/CameraLock.cs b/scripts/game/camera/CameraLock.cs
index 8db9f854..6dcbf5d6 100644
--- a/scripts/game/camera/CameraLock.cs
+++ b/scripts/game/camera/CameraLock.cs
@@ -12,6 +12,7 @@ public override void Process(
ReplayManager replayManager,
Camera3D camera,
MeshInstance3D cursor,
+ MeshInstance3D bufferCursor,
Vector2 mouseDelta,
float sensitivity
)
@@ -29,6 +30,7 @@ float sensitivity
{
attempt.RawCursorPosition = attempt.IsReplay ? replayManager.CursorPosition : attempt.RawCursorPosition + delta;
attempt.CursorPosition = attempt.RawCursorPosition.Clamp(-Constants.BOUNDS, Constants.BOUNDS);
+ attempt.BufferCursorPosition = attempt.IsReplay ? replayManager.CursorPosition : attempt.BufferCursorPosition + delta;
}
var origin = new Vector3(0, 0, 3.75f);
@@ -45,10 +47,12 @@ float sensitivity
camera.Rotation = Vector3.Zero;
Vector3 cursorPos = new(attempt.CursorPosition.X, attempt.CursorPosition.Y, 0);
+ Vector3 bufferCursorPos = new(attempt.BufferCursorPosition.X, attempt.BufferCursorPosition.Y, 0);
if (cursorPos.IsFinite())
{
cursor.Position = cursorPos;
+ bufferCursor.Position = bufferCursorPos;
}
}
}
diff --git a/scripts/game/camera/CameraMode.cs b/scripts/game/camera/CameraMode.cs
index 4826b87b..54bb012e 100644
--- a/scripts/game/camera/CameraMode.cs
+++ b/scripts/game/camera/CameraMode.cs
@@ -12,6 +12,7 @@ public abstract void Process(
ReplayManager replayManager,
Camera3D camera,
MeshInstance3D cursor,
+ MeshInstance3D bufferCursor,
Vector2 mouseDelta,
float sensitivity
);
diff --git a/scripts/game/camera/CameraSpin.cs b/scripts/game/camera/CameraSpin.cs
index e031761a..bf814465 100644
--- a/scripts/game/camera/CameraSpin.cs
+++ b/scripts/game/camera/CameraSpin.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using Godot;
public class CameraSpin : CameraMode
@@ -12,6 +12,7 @@ public override void Process(
ReplayManager replayManager,
Camera3D camera,
MeshInstance3D cursor,
+ MeshInstance3D bufferCursor,
Vector2 mouseDelta,
float sensitivity
)
@@ -48,13 +49,16 @@ float sensitivity
// Project Cursor from Camera's "ray cast"
attempt.RawCursorPosition = cameraVector2 - lookVector2 * Mathf.Abs(camera.Position.Z / lookVector.Z);
+ attempt.BufferCursorPosition = attempt.RawCursorPosition;
attempt.CursorPosition = attempt.RawCursorPosition.Clamp(-Constants.BOUNDS, Constants.BOUNDS);
Vector3 cursorPos = new(attempt.CursorPosition.X, attempt.CursorPosition.Y, 0);
+ Vector3 bufferCursorPos = new(attempt.BufferCursorPosition.X, attempt.BufferCursorPosition.Y, 0);
if (cursorPos.IsFinite())
{
cursor.Position = cursorPos;
+ bufferCursor.Position = bufferCursorPos;
}
}
}
diff --git a/scripts/game/judgments/HitResult.cs b/scripts/game/judgments/HitResult.cs
index a3272bae..7c91badf 100644
--- a/scripts/game/judgments/HitResult.cs
+++ b/scripts/game/judgments/HitResult.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
public enum HitResult
{
diff --git a/scripts/game/managers/CursorManager.cs b/scripts/game/managers/CursorManager.cs
index 2420df1c..dde3d263 100644
--- a/scripts/game/managers/CursorManager.cs
+++ b/scripts/game/managers/CursorManager.cs
@@ -19,6 +19,9 @@ public partial class CursorManager : Node
[Export]
private MeshInstance3D cursorMesh;
+ [Export]
+ private MeshInstance3D bufferCursor;
+
[Export]
private Camera3D camera;
@@ -35,6 +38,7 @@ public override void _Ready()
defaultCameraTransform = camera.Transform;
cursorMesh ??= GetNode("Cursor");
+ bufferCursor ??= GetNode("BufferCursor");
playerInputController ??= GetNode("/PlayerInputController");
replayManager ??= GetNode("ReplayManager");
}
@@ -120,7 +124,7 @@ public void UpdateCursor(Vector2 inputDelta, int cursorIndex = 0)
var attempt = runner.Attempt;
- attempt.CameraMode.Process(attempt, replayManager, camera, cursors[cursorIndex], inputDelta, sensitivity);
+ attempt.CameraMode.Process(attempt, replayManager, camera, cursors[cursorIndex], bufferCursor, inputDelta, sensitivity);
}
public void UpdateAutoplayCursor(Vector2 position)
@@ -146,18 +150,20 @@ public void UpdateAutoplayCursor(Vector2 position)
var mouseDelta = new Vector2(-yaw, -pitch) * (120f * Mathf.Pi);
- attempt.CameraMode.Process(attempt, replayManager, camera, cursors[0], mouseDelta, 1f);
+ attempt.CameraMode.Process(attempt, replayManager, camera, cursors[0], bufferCursor, mouseDelta, 1f);
return;
}
attempt.RawCursorPosition = position;
attempt.CursorPosition = position;
+ attempt.BufferCursorPosition = position;
Vector3 cursorPosition = new(position.X, position.Y, 0);
camera.Position = new Vector3(0, 0, 3.76f) + cursorPosition * (float)settings.CameraParallax;
camera.Rotation = Vector3.Zero;
cursors[0].Position = cursorPosition;
+ bufferCursor.Position = cursorPosition;
}
// Reset everything to zero so it doesn't have infinite sensitivity
@@ -166,6 +172,7 @@ private void repositionAbsolute()
camera.Rotation = Vector3.Zero;
runner.Attempt.RawCursorPosition = Vector2.Zero;
runner.Attempt.CursorPosition = Vector2.Zero;
+ runner.Attempt.BufferCursorPosition = Vector2.Zero;
}
private void updateCursorRotation(double delta) =>
diff --git a/scripts/game/managers/ReplayManager.cs b/scripts/game/managers/ReplayManager.cs
index f42f9238..1c2010d0 100644
--- a/scripts/game/managers/ReplayManager.cs
+++ b/scripts/game/managers/ReplayManager.cs
@@ -261,10 +261,6 @@ private void seek(float seekedTime)
att.Sum = 0;
att.Accuracy = 100;
att.Score = 0;
- att.Perfects = 0;
- att.Greats = 0;
- att.Okays = 0;
- att.Bads = 0;
att.Combo = 0;
att.ComboMultiplier = 1;
att.ComboMultiplierProgress = 0;
diff --git a/scripts/game/modifiers/FlickerModifier.cs b/scripts/game/modifiers/FlickerModifier.cs
new file mode 100644
index 00000000..d426b7c6
--- /dev/null
+++ b/scripts/game/modifiers/FlickerModifier.cs
@@ -0,0 +1,32 @@
+using Godot;
+
+public class FlickerModifier : Modifier, IObjectRenderModifier
+{
+ public override string Name => "Flicker";
+
+ public override Color Color => new(0xc5ff54ff);
+
+ public override bool Rankable => true;
+
+ public override double ScoreMultiplier => 1.035;
+
+ public void ModifyRenderObject(Note note, Attempt attempt)
+ {
+ double at = attempt.Settings.ApproachTime;
+
+ if (attempt.Progress / 600 / attempt.Speed % at >= at / 2)
+ {
+ if (note.Index % 2 == 0)
+ {
+ note.Opacity = 0;
+ }
+ }
+ else
+ {
+ if (note.Index % 2 != 0)
+ {
+ note.Opacity = 0;
+ }
+ }
+ }
+}
diff --git a/scripts/game/modifiers/FlickerModifier.cs.uid b/scripts/game/modifiers/FlickerModifier.cs.uid
new file mode 100644
index 00000000..f2d043e8
--- /dev/null
+++ b/scripts/game/modifiers/FlickerModifier.cs.uid
@@ -0,0 +1 @@
+uid://ciktlcnrkha2t
diff --git a/scripts/game/ui/Grid.cs b/scripts/game/ui/Grid.cs
index 515c0347..620eb038 100644
--- a/scripts/game/ui/Grid.cs
+++ b/scripts/game/ui/Grid.cs
@@ -7,12 +7,11 @@ public partial class Grid : MeshInstance3D, IUIComponent
[Export]
public Runner Runner { get; set; }
public MeshInstance3D Cursor { get; set; }
+ public MeshInstance3D BufferCursor { get; set; }
public MultiMeshInstance3D CursorTrail { get; set; }
public MeshInstance3D GridGuides { get; set; }
public MeshInstance3D VisibilityAssist { get; set; }
- private string popupLabelFormat;
-
private static readonly PackedScene hit_feedback = GD.Load("res://prefabs/hit_popup.tscn");
private static readonly PackedScene miss_feedback = GD.Load("res://prefabs/miss_icon.tscn");
private int hitPopups,
@@ -44,12 +43,22 @@ public void Init()
(float)(Constants.CURSOR_SIZE * Runner.Attempt.Settings.CursorScale)
);
+ BufferCursor ??= GetNode("BufferCursor");
+ (BufferCursor.Mesh as QuadMesh).Size = new Vector2(
+ (float)(Constants.CURSOR_SIZE * Runner.Attempt.Settings.CursorScale),
+ (float)(Constants.CURSOR_SIZE * Runner.Attempt.Settings.CursorScale)
+ );
+
(Cursor.GetActiveMaterial(0) as StandardMaterial3D).AlbedoTexture = SkinManager.Instance.Skin.CursorImage;
+ (BufferCursor.GetActiveMaterial(0) as StandardMaterial3D).AlbedoTexture = SkinManager.Instance.Skin.CursorImage;
// Cursor Transparency
float alpha = Math.Clamp((float)(double)Runner.Attempt.Settings.CursorOpacity, 0, 1);
Cursor.Transparency = 1f - alpha;
+ BufferCursor.Visible = !Runner.Attempt.Settings.CursorDrift && !Runner.Attempt.IsReplay;
+ BufferCursor.Transparency = 1f - alpha / 4;
+
CursorTrail ??= GetNode("CursorTrail");
(CursorTrail.MaterialOverride as StandardMaterial3D).AlbedoTexture = SkinManager.Instance.Skin.CursorImage;
@@ -65,34 +74,13 @@ private void onHitResultChanged(int noteIndex, HitResult result)
float lateness = Runner.Attempt.IsReplay
? Runner.Attempt.HitsInfo[noteIndex]
: (float)(((int)Runner.Attempt.Progress - Runner.Attempt.Map.Notes[noteIndex].Millisecond) / Runner.Speed);
- float factor = 1 - (float)Math.Round(Math.Max(0, lateness - 30) / 104f, 1);
- double hitScore = Math.Truncate(Runner.Attempt.UnitHitScore * Runner.Attempt.ComboMultiplier * factor);
-
- string[] listOfJudgements = { "perfect", "great", "okay", "bad" };
- string judgement = "";
+ float factor = 1 - Math.Max(0, lateness - 25) / 150f;
+ uint hitScore = (uint)(100 * Runner.Attempt.ComboMultiplier * Runner.Attempt.ModsMultiplier * factor * ((Runner.Speed - 1) / 2.5 + 1));
switch (result)
{
case HitResult.Hit:
- switch (factor) // judgements
- {
- case 1f:
- judgement = listOfJudgements[0]; // pawfect
- break;
-
- case 0.9f:
- judgement = listOfJudgements[1]; // gewd
- break;
-
- case 0.8f:
- judgement = listOfJudgements[2]; // okay
- break;
-
- case 0.7f:
- judgement = listOfJudgements[3]; // bad
- break;
- }
- spawnHitIcon(noteIndex, hitScore, judgement);
+ spawnHitIcon(noteIndex, hitScore);
break;
case HitResult.Miss:
spawnMissIcon(noteIndex);
@@ -100,20 +88,17 @@ private void onHitResultChanged(int noteIndex, HitResult result)
}
}
- private void spawnHitIcon(int objIndex, double hitScore, string judgement)
+ private void spawnHitIcon(int objIndex, uint hitScore)
{
- if (!Runner.Attempt.Settings.HitPopups || hitPopups >= 8)
+ if (!Runner.Attempt.Settings.HitPopups || hitPopups >= 64)
return;
hitPopups++;
Label3D popup = hit_feedback.Instantiate();
AddChild(popup);
- popupLabelFormat = popup.Text;
-
- popup.Text = string.Format(CultureInfo.CurrentCulture, popupLabelFormat, hitScore.ToString(CultureInfo.CurrentCulture), judgement);
popup.GlobalPosition = new Vector3(Runner.Attempt.Map.Notes[objIndex].X, -1.4f, 0);
- // popup.Text = hitScore.ToString(CultureInfo.CurrentCulture);
+ popup.Text = hitScore.ToString(CultureInfo.CurrentCulture);
Tween tween = popup.CreateTween();
tween.TweenProperty(popup, "transparency", 1, 0.25f);
tween
diff --git a/scripts/game/ui/PanelLeft.cs b/scripts/game/ui/PanelLeft.cs
index a6f9b50e..e7c229a9 100644
--- a/scripts/game/ui/PanelLeft.cs
+++ b/scripts/game/ui/PanelLeft.cs
@@ -15,10 +15,6 @@ public partial class PanelLeft : UIComponent
multiplier;
private Label altCombo;
- private RichTextLabel grade;
-
- private string Grade = "??";
-
public override void _ExitTree()
{
if (Runner.Attempt == null)
@@ -33,7 +29,6 @@ public override void Init()
score = viewport.GetNode