feat(game): add free ball mode and improve ball state handling

* add Free Ball game mode and lobby selection
* refactor base mode ball state tracking for reaped/sunk balls
* add player ownership tracking and colored-ball support
* add initial 9-ball mode implementation
* update 8-ball and snooker modes to use base ball handling
* replicate ball linear velocity for multiplayer synchronization
* improve ball collision sound propagation and physics settings
* reenable game music and initialize game signals
* improve lobby input focus and mode selection behavior
* adjust cue impulse origin and default game mode
This commit is contained in:
2026-08-10 21:22:52 -05:00
parent 26dcfe0d1b
commit e3bdb21cd2
19 changed files with 234 additions and 62 deletions

View File

@@ -4,6 +4,8 @@ class_name Lobby extends LobbyBase
func _ready() -> void:
setup_signals()
host_address_input.grab_focus()
func _exit_tree() -> void:
# TODO: Maybe no longer needed...
if Globals.multiplayer_data.is_multiplayer_active: return
@@ -38,6 +40,7 @@ func _on_receive_match_list(matches_list: Array) -> void:
_create_match_entry(match_entry)
client.lobby_fully_connected = true
new_match_name_input.grab_focus()
func _on_match_list_entry_activated(match_id: String) -> void:
for match_entry in match_list.get_children():
@@ -48,6 +51,8 @@ func _on_match_list_entry_activated(match_id: String) -> void:
match_entry.join_bttn.text = "Delete"
match_entry.join_bttn.visible = true
match_create_vbox.visible = false
match_search_input.visible = false
match_search_bttn.visible = false
match_entry.join_bttn.pressed.disconnect(_join_match)
match_entry.join_bttn.pressed.connect(
@@ -62,8 +67,11 @@ func _on_match_list_entry_removed(match_id: String) -> void:
push_warning("Client: Removed Match List Entry...", match_id)
if active_match && (match_id == active_match.match_id):
active_match = null
match_create_vbox.visible = true
active_match = null
match_create_vbox.visible = true
match_search_input.visible = true
match_search_bttn.visible = false
new_match_name_input.grab_focus()
for match_entry in match_list.get_children():
if not active_match: