netfishing/ui/network/join_game_page.gd

175 lines
4.5 KiB
GDScript

class_name JoinGamePage
extends Control
signal join_requested(endpoint: String)
signal back_requested
@onready var _address: LineEdit = %Address
@onready var _join_button: BubbleButton = %JoinButton
@onready var _cancel_button: BubbleButton = %CancelButton
@onready var _back_button: BubbleButton = %BackButton
@onready var _open_close_button: BubbleButton = %OpenCloseButton
@onready var _status: Label = %Status
@onready var _session_summary: Label = %SessionSummary
var _network_session: NetworkSession
var _saved_servers: SavedServerStore
var _gameplay_context: bool = false
func _ready() -> void:
_join_button.pressed.connect(_on_join_pressed)
_cancel_button.pressed.connect(_on_cancel_pressed)
_back_button.pressed.connect(_on_back_pressed)
_open_close_button.pressed.connect(_on_open_close_pressed)
_address.text_submitted.connect(_on_address_submitted)
hide()
func setup(
network_session: NetworkSession,
saved_servers: SavedServerStore,
gameplay_context: bool,
) -> void:
_network_session = network_session
_saved_servers = saved_servers
_gameplay_context = gameplay_context
if not _network_session.state_changed.is_connected(_on_state_changed):
_network_session.state_changed.connect(_on_state_changed)
if not _network_session.status_message_changed.is_connected(
_on_status_message_changed
):
_network_session.status_message_changed.connect(
_on_status_message_changed
)
if not _network_session.connection_error.is_connected(
_on_connection_error
):
_network_session.connection_error.connect(_on_connection_error)
if not _network_session.peer_count_changed.is_connected(
_on_peer_count_changed
):
_network_session.peer_count_changed.connect(_on_peer_count_changed)
_refresh()
func open_page(preserved_endpoint: String = "") -> void:
if not preserved_endpoint.is_empty():
_address.text = preserved_endpoint
elif _address.text.is_empty():
_address.text = "127.0.0.1:7777"
show()
_refresh()
_address.grab_focus()
_address.select_all()
func close_page() -> void:
hide()
get_viewport().gui_release_focus()
func get_endpoint_text() -> String:
return _address.text
func set_status(message: String) -> void:
_status.text = message
func _on_join_pressed() -> void:
_request_join()
func _on_address_submitted(_value: String) -> void:
_request_join()
func _request_join() -> void:
if _network_session.state in [
NetworkSession.State.CONNECTION_FAILED,
NetworkSession.State.SERVER_LOST,
]:
_network_session.reset_failure()
var endpoint: ConnectionEndpoint = EndpointParser.parse(_address.text)
if not endpoint.is_valid():
_status.text = endpoint.error_message
return
_address.text = endpoint.normalized_display
join_requested.emit(endpoint.normalized_display)
func _on_cancel_pressed() -> void:
if _network_session != null:
_network_session.cancel_connection()
_refresh()
func _on_back_pressed() -> void:
if (
_network_session != null
and _network_session.state in [
NetworkSession.State.CONNECTING,
NetworkSession.State.AUTHENTICATING,
]
):
_network_session.cancel_connection()
back_requested.emit()
func _on_open_close_pressed() -> void:
if _network_session == null or not _network_session.is_host():
return
_network_session.set_host_open(not _network_session.is_open_host())
_refresh()
func _on_state_changed(_state: NetworkSession.State) -> void:
_refresh()
func _on_status_message_changed(message: String) -> void:
_status.text = message
_refresh()
func _on_connection_error(message: String) -> void:
_status.text = message
_refresh()
func _on_peer_count_changed(player_count: int, max_players: int) -> void:
_session_summary.text = "%d / %d players" % [
player_count,
max_players,
]
func _refresh() -> void:
if not is_node_ready() or _network_session == null:
return
var connecting: bool = _network_session.state in [
NetworkSession.State.CONNECTING,
NetworkSession.State.AUTHENTICATING,
]
_address.editable = not connecting
_join_button.disabled = connecting
_cancel_button.visible = connecting
_open_close_button.visible = (
_gameplay_context and _network_session.is_host()
)
if _open_close_button.visible:
_open_close_button.text = (
"close\ngame"
if _network_session.is_open_host()
else "open\ngame"
)
_session_summary.visible = (
_gameplay_context
and _network_session.state != NetworkSession.State.INACTIVE
)
if _session_summary.visible:
_session_summary.text = "%d / %d players" % [
_network_session.get_player_count(),
_network_session.get_session_max_players(),
]