summaryrefslogtreecommitdiff
path: root/Network/Network.gd
blob: 1222b929d3270179243ba60515655005afe9c4e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
extends Node


signal connection_succeeded()
signal connection_failed()
signal player_list_changed()
signal game_error()
signal game_started()
signal game_ended()


const PORT = 10567

const MAX_PEERS = 2


var peer: ENetMultiplayerPeer = null

var player = {
	idx = 0,
	name = "",
	character = "Tux",
}
var winning_player = player

# Dictionary { id = { idx: 1, name: "" } }
var players = {}
var players_ready = []


func _ready():
	multiplayer.connect("peer_connected", Callable(self, '_player_connected'))
	multiplayer.connect("peer_disconnected", Callable(self, "_player_disconnected"))
	multiplayer.connect("connected_to_server", Callable(self, "_connection_succeeded"))
	multiplayer.connect("connection_failed", Callable(self, "_connection_failed"))
	multiplayer.connect("server_disconnected", Callable(self, "_server_disconnected"))
	Global.connect("game_started", Callable(self, "_on_Global_game_started"))
	Global.connect("game_ended", Callable(self, "_on_Global_game_ended"))
	Global.connect("game_won", Callable(self, "_on_Global_game_won"))


@rpc("any_peer") func register_player(player_name):
	var id = multiplayer.get_remote_sender_id()
	self.players[id] = {
		name = player_name,
		ip = self.peer.get_peer(id).get_remote_address(),
	}
	emit_signal("player_list_changed")


@rpc("any_peer") func unregister_player(id):
	self.players.erase(id)
	emit_signal("player_list_changed")


func host_game(player_name):
	self.player.name = player_name
	self.peer = ENetMultiplayerPeer.new()
	self.peer.create_server(self.PORT, self.MAX_PEERS)
	multiplayer.multiplayer_peer = self.peer


func join_game(ip, player_name):
	self.player.name = player_name
	self.peer = ENetMultiplayerPeer.new()
	self.peer.create_client(ip, self.PORT)
	multiplayer.multiplayer_peer = self.peer


func leave_game():
	rpc("_leave_game")
	multiplayer.multiplayer_peer = null


@rpc("any_peer") func _leave_game():
	var id = multiplayer.get_remote_sender_id()
	self.peer.disconnect_peer(id)


func get_player_count():
	return self.players.size() + 1


func _on_Global_game_started():
	# preconfigure game and set idx to each player
	var idx = 1
	for id in self.players:
		self.players[id].idx = idx
		rpc_id(id, "_preconfigure_game", idx, Global.Level_Map)
		idx += 1
	
	# start game for everyone
	rpc("_start_game")


@rpc("any_peer") func _preconfigure_game(idx, level_map):
	self.player.idx = idx
	Global.Level_Map = level_map
	

@rpc("any_peer", "call_local") func _start_game():
	emit_signal("game_started")


func _on_Global_game_ended():
	# tell all peers to end the game
	rpc("_end_game")


func _on_Global_game_won(winning_player):
	rpc("_end_game", winning_player)


@rpc("any_peer", "call_local") func _end_game(winning_player):
	self.winning_player = winning_player
	emit_signal("game_ended")


func _player_connected(_id):
	rpc("register_player", self.player.name)


func _player_disconnected(id):
	# if game is in progress:
		# self.end_game() ?
	# else
		#rpc("unregister_player", id)
	rpc("unregister_player", id)


func _connection_succeeded():
	emit_signal("connection_succeeded")


func _connection_failed():
	multiplayer.multiplayer_peer = null # remove peer
	emit_signal("connection_failed")


func _server_disconnected():
	emit_signal("game_error", "Server disconnected!")
	#self.end_game("")