cw-generator/scenes/multiplayer_connect.gd

124 lines
3.3 KiB
GDScript

extends Control
var server := "localhost"
var port := "3784"
var ws := WebSocketPeer.new()
var available_freqs = []
var mmb_self: MultiMorseBanner
var mmb_others: Dictionary[String, MultiMorseBanner]
class PlayerData:
var num: int
var color: Color
var tone: int
func _init(num, color, tone):
self.num = num
self.color = color
self.tone = tone
var player_data := [
PlayerData.new(0, Color( 0, 255, 0), 880),
PlayerData.new(1, Color(255, 0, 0), 880),
PlayerData.new(2, Color( 0, 0, 255), 880),
PlayerData.new(3, Color(255, 0, 255), 880),
]
func _ready() -> void:
# FIXME: connection handling / reconnect
# FIXME: status / error messages
# FIXME: randomize default join frquency
# FIXME: automatic refresh
print("ws://%s:%s" % [server, port])
ws.connect_to_url("ws://%s:%s" % [server, port])
func refresh_list() -> void:
pass
func _process(_delta: float) -> void:
ws.poll()
var state := ws.get_ready_state()
# print("moin ", state)
while state == WebSocketPeer.STATE_OPEN and ws.get_available_packet_count():
_handle_packet()
func _handle_packet() -> void:
var data := ws.get_packet().get_string_from_utf8()
print(data)
var parsed: Dictionary = JSON.parse_string(data)
if typeof(parsed) != TYPE_DICTIONARY or not parsed.has("type"):
return
print("parsed ", parsed)
match parsed["type"]:
"hello":
# fetch frequency list on first join
_on_refresh_button_pressed()
"join":
_join_freq(parsed["freq"])
"freq-list":
%FreqList.clear()
for freq in parsed["freqs"]:
var text = "%s MHz (%d present)" % [freq["freq"], freq["players"]]
print("Adding ", text)
var idx: int = %FreqList.add_item(text)
%FreqList.set_item_metadata(idx, freq)
func _join_freq(freq: String, player_id: String, other_players: Array[String]):
for child in %PlayerContainer.get_children():
%PlayerContainer.remove_child(child)
mmb_self = make_player(0)
for n, player_id in enumeerate(other_players):
make_player(n + 1)
%FreqLabel.text = "%s MHz" % freq
%ConnectView.hide()
%MorseView.show()
func _on_refresh_button_pressed() -> void:
var refresh_cmd := {"cmd": "list", "type": "cw-generator"}
var data := JSON.stringify(refresh_cmd) + "\n"
ws.send_text(data)
func _on_create_button_pressed() -> void:
var freq: String = "%.3f" % float(%FrequencyCreator.text)
var refresh_cmd := {"cmd": "create", "type": "cw-generator", "freq": freq}
var data := JSON.stringify(refresh_cmd) + "\n"
ws.send_text(data)
func _on_freq_list_join(index: int, at_position: Vector2, mouse_button_index: int) -> void:
var meta = %FreqList.get_item_metadata(index)
var freq: String = meta["freq"]
print("Yop ", index, " metadata ", freq)
var join_cmd := {"cmd": "join", "freq": freq, "type": "cw-generator"}
ws.send_text(JSON.stringify(join_cmd) + "\n")
func make_player(no: int):
var pd: PlayerData
if no < player_data.size():
pd = player_data[no]
else:
pd = PlayerData.new(no, Color(randi_range(0, 255), randi_range(0, 255), randi_range(0, 255)), randi_range(440, 440 * 3))
var mmb = MultiMorseBanner.new_banner(pd.num, pd.color, pd.tone)
%PlayerContainer.add_child(mmb)
return mmb
func _on_morse_button_button_down() -> void:
if not mmb_self:
return
mmb_self.set_morse_state(true)
func _on_morse_button_button_up() -> void:
if not mmb_self:
return
mmb_self.set_morse_state(false)