174 lines
4.7 KiB
GDScript3
174 lines
4.7 KiB
GDScript3
|
extends Spatial
|
||
|
|
||
|
var _current_player_index
|
||
|
|
||
|
var _turn_number
|
||
|
|
||
|
var _round_counter = 0
|
||
|
|
||
|
var _other_players = []
|
||
|
|
||
|
var _map
|
||
|
|
||
|
var _game_started = false
|
||
|
|
||
|
var _ability_left = false
|
||
|
|
||
|
var _previous_hex = null
|
||
|
|
||
|
func _ready():
|
||
|
$GUI/Player_name_panel/HBoxContainer/Player_name.text = Player.get_player_name()
|
||
|
_other_players = NetworkingSync._player_in_same_game_room_list.duplicate()
|
||
|
_other_players.erase([Player.get_player_id(), Player.get_player_name()])
|
||
|
init_game()
|
||
|
fill_player_list()
|
||
|
|
||
|
if Player.is_host():
|
||
|
init_game_state()
|
||
|
|
||
|
NetworkingSync.send_ready_signal()
|
||
|
|
||
|
func init_game():
|
||
|
create_map()
|
||
|
_turn_number = 1
|
||
|
$GUI/Bottom_left_panel/VBoxContainer/HBoxContainer/Turn_indicator.text = str(_turn_number)
|
||
|
|
||
|
func fill_player_list():
|
||
|
for player in _other_players:
|
||
|
add_other_players_to_list(player[1])
|
||
|
|
||
|
func update_player_list():
|
||
|
for child in $GUI/Player_info/VBoxContainer/Player_list.get_children():
|
||
|
child.queue_free()
|
||
|
|
||
|
fill_player_list()
|
||
|
|
||
|
func add_other_players_to_list(player_name):
|
||
|
var player = load("res://Scenes/Matchmaking/Game_room/Player_entry.tscn").instance()
|
||
|
player.set_player_name(player_name)
|
||
|
$GUI/Player_info/VBoxContainer/Player_list.add_child(player)
|
||
|
|
||
|
func create_map():
|
||
|
_map = load("res://Scenes/Matchmaking/Game/Map/Map.tscn").instance()
|
||
|
add_child(_map)
|
||
|
|
||
|
func init_game_state():
|
||
|
yield(NetworkingSync, "all_ready")
|
||
|
var starting_player_index = calculate_stating_player_index()
|
||
|
|
||
|
set_starting_player(starting_player_index)
|
||
|
for player in _other_players:
|
||
|
rpc_id(player[0], "set_starting_player", starting_player_index)
|
||
|
|
||
|
func is_my_turn():
|
||
|
return NetworkingSync._player_in_same_game_room_list[_current_player_index][0] == Player.get_player_id()
|
||
|
|
||
|
func calculate_stating_player_index():
|
||
|
return int(rand_range(0, len(NetworkingSync._player_in_same_game_room_list)))
|
||
|
|
||
|
remote func set_starting_player(starting_player_index):
|
||
|
_current_player_index = starting_player_index
|
||
|
$GUI/Top_panel/Top_panel_container/Player_indicator.text = str(NetworkingSync._player_in_same_game_room_list[_current_player_index][1])
|
||
|
update_current_player()
|
||
|
|
||
|
|
||
|
func update_current_player():
|
||
|
if is_my_turn():
|
||
|
_ability_left = true
|
||
|
_round_counter = 0
|
||
|
_previous_hex = null
|
||
|
$GUI/Bottom_left_panel/VBoxContainer/Next_turn_button.disabled = false
|
||
|
else:
|
||
|
$GUI/Bottom_left_panel/VBoxContainer/Next_turn_button.disabled = true
|
||
|
|
||
|
func _on_Next_turn_button_pressed():
|
||
|
next_turn()
|
||
|
|
||
|
func next_turn():
|
||
|
next_player()
|
||
|
for player in _other_players:
|
||
|
rpc_id(player[0], "next_player")
|
||
|
_turn_number += 1
|
||
|
$GUI/Bottom_left_panel/VBoxContainer/HBoxContainer/Turn_indicator.text = str(_turn_number)
|
||
|
|
||
|
remote func next_player():
|
||
|
_current_player_index = (_current_player_index + 1) % len(NetworkingSync._player_in_same_game_room_list)
|
||
|
$GUI/Top_panel/Top_panel_container/Player_indicator.text = str(NetworkingSync._player_in_same_game_room_list[_current_player_index][1])
|
||
|
update_current_player()
|
||
|
|
||
|
func game_started():
|
||
|
return _game_started
|
||
|
|
||
|
func color_the_hex(hex_node):
|
||
|
for player in _other_players:
|
||
|
rpc_id(player[0], "color_the_hex_to_player_color", hex_node._x, hex_node._y)
|
||
|
color_the_hex_to_player_color(hex_node._x, hex_node._y)
|
||
|
|
||
|
remote func color_the_hex_to_player_color(hex_x, hex_y):
|
||
|
_map._hexes[hex_x][hex_y].set_color(_current_player_index)
|
||
|
|
||
|
func ability_left():
|
||
|
return _ability_left
|
||
|
|
||
|
func get_previous_hex():
|
||
|
return _previous_hex
|
||
|
|
||
|
func try_to_occupy_hex(hex_node):
|
||
|
color_the_hex(hex_node)
|
||
|
occupy_hex(hex_node._x, hex_node._y)
|
||
|
for player in _other_players:
|
||
|
rpc_id(player[0], "occupy_hex", hex_node._x, hex_node._y)
|
||
|
|
||
|
_previous_hex = hex_node
|
||
|
_round_counter += 1
|
||
|
|
||
|
if _round_counter >= _turn_number:
|
||
|
next_turn()
|
||
|
else:
|
||
|
if !hex_node.is_any_neighbour_free():
|
||
|
left_game()
|
||
|
|
||
|
remote func occupy_hex(hex_x, hex_y):
|
||
|
_map._hexes[hex_x][hex_y].occupy_hex()
|
||
|
|
||
|
func left_game():
|
||
|
for player in _other_players:
|
||
|
rpc_id(player[0], "player_left", Player.get_player_id(), Player.get_player_name())
|
||
|
end_game(false)
|
||
|
|
||
|
func end_game(is_winning):
|
||
|
if is_winning:
|
||
|
$End_game_panel/Label.text = "You won."
|
||
|
$GUI.visible = false
|
||
|
$End_game_panel.visible = true
|
||
|
|
||
|
remote func player_left(player_id, player_name):
|
||
|
_other_players.erase([player_id, player_name])
|
||
|
NetworkingSync._player_in_same_game_room_list.erase([player_id, player_name])
|
||
|
update_player_list()
|
||
|
check_for_win()
|
||
|
next_player()
|
||
|
|
||
|
func check_for_win():
|
||
|
if len(_other_players) <= 0:
|
||
|
end_game(true)
|
||
|
|
||
|
func back_to_lobby():
|
||
|
get_tree().change_scene("res://Scenes/Matchmaking/Lobby/Lobby.tscn")
|
||
|
|
||
|
func _on_Back_to_lobby_button_pressed():
|
||
|
back_to_lobby()
|
||
|
|
||
|
func _on_Surrender_button_pressed():
|
||
|
$Menu_panel.visible = false
|
||
|
left_game()
|
||
|
|
||
|
func _input(event):
|
||
|
if Input.is_key_pressed(KEY_ESCAPE) and $Menu_panel.visible:
|
||
|
$Menu_panel.visible = false
|
||
|
elif Input.is_key_pressed(KEY_ESCAPE) and !$Menu_panel.visible:
|
||
|
$Menu_panel.visible = true
|
||
|
|
||
|
func _on_Close_pressed():
|
||
|
$Menu_panel.visible = false
|