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

@ -36,6 +36,10 @@ func _run_host() -> void:
as NetworkPlayerListService
)
var bans := main.get_node("%HostBanStore") as HostBanStore
assert(bool(main.call(
"_apply_world", WorldLayout.STARTER_ISLAND, 1, true
)))
assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1))
assert(session.start_private_host(TEST_PORT))
assert(session.set_host_open(true))
@ -65,7 +69,7 @@ func _run_host() -> void:
assert(players_page != null)
players_page.call("_refresh")
assert(_has_button_text(players_page, "deop"))
assert(_has_button_text(players_page, "clear art"))
assert(_has_button_tooltip(players_page, "scrub art"))
var unban_deadline: int = Time.get_ticks_msec() + 12000
while (
@ -149,9 +153,9 @@ func _run_client() -> void:
assert(players_page != null)
players_page.call("_refresh")
var tabs := players_page.get("_tabs") as HBoxContainer
assert((tabs.get_child(2) as Button).visible)
players_page.call("_select_tab", 2)
assert(int(players_page.get("_current_tab")) == 2)
assert((tabs.get_child(3) as Button).visible)
players_page.call("_select_tab", 3)
assert(int(players_page.get("_current_tab")) == 3)
var local_entry: PlayerListEntry = _entry_for_peer(
service, session.get_local_peer_id()
)
@ -176,7 +180,7 @@ func _run_client() -> void:
await process_frame
assert(not session.is_local_operator())
assert(not service.is_local_moderator())
assert(not (tabs.get_child(2) as Button).visible)
assert(not (tabs.get_child(3) as Button).visible)
assert(int(players_page.get("_current_tab")) == 0)
service.request_unban.rpc_id(1, SECOND_BANNED_FINGERPRINT)
var disconnect_deadline: int = Time.get_ticks_msec() + 10000
@ -252,3 +256,11 @@ func _has_button_text(root_node: Node, text: String) -> bool:
if button != null and button.text == text:
return true
return false
func _has_button_tooltip(root_node: Node, tooltip: String) -> bool:
for node: Node in root_node.find_children("*", "Button", true, false):
var button := node as Button
if button != null and button.tooltip_text == tooltip:
return true
return false