feat: expand progression and multiplayer systems

Add named save slots, progression import/export, and a unified play flow. Add live friend requests, presence, invitations, and relationship controls without durable discovery-server social storage. Advance the network protocol with isolated channels, movement reconciliation, late-join recovery, fishing replication, and animation synchronization. Preserve per-species catch totals, refine generated-world startup and water recovery, and complete the related input and interface improvements.
This commit is contained in:
Alexander Sellite 2026-08-23 20:48:38 -04:00
parent 1db1a5b754
commit 3b84bfe3a0
97 changed files with 7869 additions and 982 deletions

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=24 format=3]
[gd_scene load_steps=25 format=3]
[ext_resource type="Script" path="res://ui/title_screen.gd" id="1_script"]
[ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"]
@ -20,6 +20,7 @@
[ext_resource type="Texture2D" path="res://ui/icons/main_menu/credits.png" id="18_credits"]
[ext_resource type="Texture2D" path="res://ui/icons/main_menu/delete_save.png" id="19_delete_save"]
[ext_resource type="PackedScene" path="res://ui/new_game_setup_page.tscn" id="20_new_game_setup"]
[ext_resource type="PackedScene" path="res://ui/save_slots_page.tscn" id="21_save_slots"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_water"]
shader = ExtResource("4_water_shader")
@ -260,21 +261,21 @@ offset_bottom = 318.0
script = ExtResource("8_bubble_cluster")
profile = ExtResource("9_bubble_profile")
[node name="ContinueButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"]
[node name="PlayButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"]
unique_name_in_owner = true
offset_left = 123.0
offset_top = 86.0
offset_right = 307.0
offset_bottom = 264.0
offset_left = 106.0
offset_top = 71.0
offset_right = 290.0
offset_bottom = 249.0
texture_filter = 1
icon = ExtResource("16_continue")
tooltip_text = "continue"
accessibility_name = "continue"
tooltip_text = "play"
accessibility_name = "play"
script = ExtResource("7_bubble_button")
profile = ExtResource("9_bubble_profile")
neutral_size = Vector2(184, 178)
desktop_anchor = Vector2(215, 175)
compact_anchor = Vector2(215, 175)
desktop_anchor = Vector2(198, 160)
compact_anchor = Vector2(198, 164)
minimum_font_size = 19
maximum_font_size = 30
horizontal_amplitude = 1.8
@ -285,6 +286,8 @@ deformation_period = 6.7
[node name="NewGameButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"]
unique_name_in_owner = true
visible = false
focus_mode = 0
offset_left = 42.0
offset_top = 4.0
offset_right = 170.0
@ -310,18 +313,18 @@ deformation_period = 5.9
[node name="SettingsButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"]
unique_name_in_owner = true
offset_left = 264.0
offset_top = 17.0
offset_right = 384.0
offset_bottom = 133.0
offset_left = 254.0
offset_top = 12.0
offset_right = 374.0
offset_bottom = 128.0
texture_filter = 1
icon = ExtResource("13_settings_dark")
tooltip_text = "settings"
accessibility_name = "settings"
script = ExtResource("7_bubble_button")
profile = ExtResource("9_bubble_profile")
desktop_anchor = Vector2(324, 75)
compact_anchor = Vector2(324, 68)
desktop_anchor = Vector2(314, 70)
compact_anchor = Vector2(333, 75)
compact_minimum_size = Vector2(94, 90)
minimum_font_size = 15
maximum_font_size = 22
@ -332,10 +335,10 @@ deformation_period = 6.3
[node name="CreditsButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"]
unique_name_in_owner = true
offset_left = 330.0
offset_top = 125.0
offset_right = 414.0
offset_bottom = 207.0
offset_left = 54.0
offset_top = 209.0
offset_right = 138.0
offset_bottom = 291.0
texture_filter = 1
icon = ExtResource("18_credits")
tooltip_text = "credits"
@ -343,8 +346,8 @@ accessibility_name = "credits"
script = ExtResource("7_bubble_button")
profile = ExtResource("9_bubble_profile")
neutral_size = Vector2(84, 82)
desktop_anchor = Vector2(372, 166)
compact_anchor = Vector2(372, 166)
desktop_anchor = Vector2(96, 250)
compact_anchor = Vector2(82, 258)
compact_minimum_size = Vector2(62, 62)
minimum_font_size = 12
maximum_font_size = 17
@ -357,10 +360,10 @@ deformation_period = 5.6
[node name="JoinGameButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"]
unique_name_in_owner = true
offset_left = 126.0
offset_top = 224.0
offset_right = 248.0
offset_bottom = 342.0
offset_left = 21.0
offset_top = 11.0
offset_right = 143.0
offset_bottom = 129.0
texture_filter = 1
icon = ExtResource("12_online_dark")
tooltip_text = "join game"
@ -368,8 +371,8 @@ accessibility_name = "join game"
script = ExtResource("7_bubble_button")
profile = ExtResource("9_bubble_profile")
neutral_size = Vector2(122, 118)
desktop_anchor = Vector2(187, 268)
compact_anchor = Vector2(187, 268)
desktop_anchor = Vector2(82, 70)
compact_anchor = Vector2(63, 75)
compact_minimum_size = Vector2(82, 80)
minimum_font_size = 15
maximum_font_size = 22
@ -382,6 +385,8 @@ deformation_period = 5.7
[node name="DeleteSaveButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"]
unique_name_in_owner = true
visible = false
focus_mode = 0
offset_left = -11.0
offset_top = 122.0
offset_right = 123.0
@ -406,10 +411,10 @@ deformation_period = 5.4
[node name="QuitButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"]
unique_name_in_owner = true
offset_left = 275.0
offset_top = 217.0
offset_right = 369.0
offset_bottom = 309.0
offset_left = 255.0
offset_top = 204.0
offset_right = 349.0
offset_bottom = 296.0
texture_filter = 1
icon = ExtResource("14_x_dark")
tooltip_text = "quit"
@ -417,8 +422,8 @@ accessibility_name = "quit"
script = ExtResource("7_bubble_button")
profile = ExtResource("9_bubble_profile")
neutral_size = Vector2(94, 92)
desktop_anchor = Vector2(322, 263)
compact_anchor = Vector2(322, 263)
desktop_anchor = Vector2(302, 250)
compact_anchor = Vector2(317, 254)
compact_minimum_size = Vector2(68, 68)
minimum_font_size = 14
maximum_font_size = 18
@ -497,3 +502,13 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="SaveSlotsPage" parent="ResponsiveTitleStage/TitlePresentationScaleRoot" instance=ExtResource("21_save_slots")]
unique_name_in_owner = true
z_index = 220
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2