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

@ -52,6 +52,7 @@ var _canvas_states: Dictionary[String, Dictionary] = {}
var _canvas_nodes: Dictionary[String, SurfaceDrawingCanvas] = {}
var _selected_canvas_id: String = ""
var _hovered_canvas_id: String = ""
var _last_hovered_canvas_id: String = ""
var _brush_preview: MultiMeshInstance3D
var _brush_preview_multimesh: MultiMesh
var _brush_preview_material: ShaderMaterial
@ -236,6 +237,7 @@ func activate(
return
_active = true
_placing_grid = false
_last_hovered_canvas_id = ""
_clear_stamp_mode()
_eraser_mode = false
_clear_armed_guide_action(false)
@ -267,6 +269,7 @@ func deactivate() -> void:
_reset_stroke()
_selected_canvas_id = ""
_hovered_canvas_id = ""
_last_hovered_canvas_id = ""
_aim_hit.clear()
_hide_previews()
_refresh_stencil_visibility()
@ -849,10 +852,22 @@ func select_saved_stamp(path: String) -> bool:
func export_aimed_canvas() -> String:
_update_aim()
if _hovered_canvas_id.is_empty():
var canvas_id: String = (
_hovered_canvas_id
if not _hovered_canvas_id.is_empty()
else _last_hovered_canvas_id
)
var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id)
if (
canvas_id.is_empty()
or canvas == null
or not is_instance_valid(canvas)
or canvas.is_hidden_by_relationship()
):
_last_hovered_canvas_id = ""
_emit_hud_state("aim at artwork before exporting")
return ""
return export_canvas_png(_hovered_canvas_id)
return export_canvas_png(canvas_id)
func export_canvas_png(canvas_id: String) -> String:
@ -1070,6 +1085,8 @@ func _update_aim() -> void:
selected_layer = layer
_selected_canvas_id = found_canvas_id
_hovered_canvas_id = found_hovered_canvas_id
if not _hovered_canvas_id.is_empty():
_last_hovered_canvas_id = _hovered_canvas_id
if previous_canvas_id != _selected_canvas_id:
_reset_stroke()
_update_previews()
@ -2865,6 +2882,7 @@ func _clear_session_artwork_state() -> void:
_canvas_sequence = 0
_selected_canvas_id = ""
_hovered_canvas_id = ""
_last_hovered_canvas_id = ""
_stroke_history_by_peer.clear()
_cell_last_stroke.clear()
_last_local_stroke_id = ""
@ -2900,6 +2918,8 @@ func _remove_canvas_state(canvas_id: String) -> void:
_selected_canvas_id = ""
if _hovered_canvas_id == canvas_id:
_hovered_canvas_id = ""
if _last_hovered_canvas_id == canvas_id:
_last_hovered_canvas_id = ""
func _emit_artwork_changed() -> void: