init public repo
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
extends Spatial
|
||||
|
||||
class_name Game
|
||||
|
||||
var players:Array
|
||||
var route:Route
|
||||
var first:Player
|
||||
var last:Player
|
||||
|
||||
const REMOVE_LAST = 2
|
||||
|
||||
|
||||
func _ready():
|
||||
route = get_node("route")
|
||||
if is_network_master():
|
||||
route.rpc("add_road",roads_factory.START, -1)
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
if is_network_master():
|
||||
set_player_order()
|
||||
check_autotrack()
|
||||
|
||||
|
||||
func set_player_order():
|
||||
players = get_node("players").get_children()
|
||||
players.sort_custom(PlayerSorter,"sort")
|
||||
if players.size() > 0 && players[0] != first:
|
||||
new_first(players[0])
|
||||
if players.size() > 0 && players[players.size()-1] != last:
|
||||
last = players[players.size()-1]
|
||||
|
||||
|
||||
func new_first(player):
|
||||
if first != null:
|
||||
first.rpc("set_first",false)
|
||||
first = player
|
||||
first.rpc("set_first",true)
|
||||
|
||||
|
||||
func check_autotrack():
|
||||
if first != null:
|
||||
if first.position.x != -1 && route.get_last_road() != null:
|
||||
if first.position.x == route.get_last_road().get_index():
|
||||
route.rpc("add_road", roads_factory.STRAIGHT, -1)
|
||||
|
||||
|
||||
class PlayerSorter:
|
||||
static func sort(a, b):
|
||||
return a.position.x > b.position.x || a.position.x == b.position.x && a.position.y > b.position.y
|
||||
@@ -0,0 +1,152 @@
|
||||
extends Node
|
||||
|
||||
const MAX_PEERS = 4
|
||||
const LOBBY_READY_WAIT_TIME = 3
|
||||
|
||||
var Game = preload("res://scenes/game/Game.tscn")
|
||||
var Player = preload("res://scenes/player/Player.tscn")
|
||||
var HumanPlayer = preload("res://scenes/player/HumanPlayer.tscn")
|
||||
var BotPlayer = preload("res://scenes/player/BotPlayer.tscn")
|
||||
|
||||
var game:Game
|
||||
var players = {}
|
||||
|
||||
var game_name = ""
|
||||
var bots:bool = false
|
||||
var game_running:bool = false
|
||||
|
||||
signal players_changed(players)
|
||||
signal game_ready(ready)
|
||||
signal game_started()
|
||||
signal game_ended()
|
||||
|
||||
|
||||
remote func set_player(id, new_name:String = " ", new_color:Color = Color.black, new_ready:bool = false):
|
||||
players[id] = {"name" : new_name, "color" : new_color, "ready" : new_ready, "prepared" : false}
|
||||
emit_signal("players_changed", players)
|
||||
|
||||
if get_tree().is_network_server():
|
||||
var all_ready = true
|
||||
for p_id in players:
|
||||
rpc_id(id, "set_player", p_id, players[p_id].name, players[p_id].color, players[p_id].ready)
|
||||
rpc_id(p_id, "set_player", id, new_name, new_color, new_ready)
|
||||
all_ready = all_ready && players[p_id].ready
|
||||
rpc("game_ready", all_ready)
|
||||
|
||||
|
||||
func update_player(new_name:String = " ", new_color:Color = Color.black, new_ready:bool = false):
|
||||
if get_tree().is_network_server():
|
||||
set_player(get_tree().get_network_unique_id(), new_name, new_color, new_ready)
|
||||
else:
|
||||
rpc("set_player",get_tree().get_network_unique_id(), new_name, new_color, new_ready)
|
||||
|
||||
|
||||
remotesync func remove_player(id):
|
||||
players.erase(id)
|
||||
|
||||
if game != null:
|
||||
var game_players = game.get_node("players")
|
||||
if game_players.has_node(str(id)):
|
||||
game_players.remove_child(game_players.get_node(str(id)))
|
||||
|
||||
emit_signal("players_changed", players)
|
||||
|
||||
|
||||
remotesync func game_ready(all_ready:bool):
|
||||
if get_tree().is_network_server():
|
||||
if all_ready:
|
||||
game_running = true
|
||||
else:
|
||||
game_running = false
|
||||
emit_signal("game_ready", all_ready)
|
||||
|
||||
|
||||
remotesync func prepare_game():
|
||||
get_tree().set_pause(true)
|
||||
|
||||
game = Game.instance()
|
||||
get_tree().get_root().add_child(game)
|
||||
|
||||
get_tree().get_root().get_node("main_menu").hide()
|
||||
|
||||
for p_id in players:
|
||||
var controls
|
||||
var player = players[p_id]
|
||||
|
||||
var player_scene = Player.instance()
|
||||
player_scene.set_network_master(p_id)
|
||||
player_scene.set_name(str(p_id))
|
||||
game.get_node("players").add_child(player_scene)
|
||||
player_scene.set_player_name(player.name)
|
||||
player_scene.set_player_color(player.color)
|
||||
|
||||
if p_id == get_tree().get_network_unique_id():
|
||||
controls = HumanPlayer.instance()
|
||||
controls.set_name("HumanControl_" + str(p_id))
|
||||
game.add_child(controls)
|
||||
controls.set_player(player_scene.get_path())
|
||||
controls.set_network_master(p_id)
|
||||
|
||||
player_scene.set_start(player_scene.get_index())
|
||||
|
||||
if bots:
|
||||
for index in range(MAX_PEERS-players.size()):
|
||||
var bot_index = players.size() + index
|
||||
var player_scene = Player.instance()
|
||||
player_scene.set_name("bot_player" + str(bot_index))
|
||||
game.get_node("players").add_child(player_scene)
|
||||
player_scene.set_player_name("Bot " + str(bot_index))
|
||||
player_scene.set_player_color(Color(randf(),randf(),randf()))
|
||||
player_scene.add_to_group("bots")
|
||||
if get_tree().is_network_server():
|
||||
var bot = BotPlayer.instance()
|
||||
bot.set_name("bot" + str(bot_index))
|
||||
game.add_child(bot)
|
||||
bot.set_player(player_scene.get_path())
|
||||
bot.set_network_master(get_tree().get_network_unique_id())
|
||||
player_scene.set_start(bot_index)
|
||||
if players.has(get_tree().get_network_unique_id()):
|
||||
rpc_id(1, "player_prepared", get_tree().get_network_unique_id())
|
||||
|
||||
if get_tree().is_network_server():
|
||||
if players.has(get_tree().get_network_unique_id()):
|
||||
player_prepared(get_tree().get_network_unique_id())
|
||||
else:
|
||||
rpc_id(1, "player_prepared", get_tree().get_network_unique_id())
|
||||
|
||||
|
||||
remotesync func player_prepared(id):
|
||||
if get_tree().is_network_server():
|
||||
players[id].prepared = true
|
||||
var all_prepared = true
|
||||
for p_id in players:
|
||||
all_prepared = all_prepared && players[p_id].prepared
|
||||
if all_prepared:
|
||||
rpc("post_start_game")
|
||||
|
||||
|
||||
remotesync func post_start_game():
|
||||
get_tree().set_pause(false)
|
||||
emit_signal("game_started")
|
||||
|
||||
|
||||
remotesync func set_bots(has_bots:bool):
|
||||
bots = has_bots
|
||||
|
||||
|
||||
func quit_game():
|
||||
if game != null:
|
||||
game.queue_free()
|
||||
game = null
|
||||
|
||||
players.clear()
|
||||
if get_tree().get_root().has_node("multiplayer_menu"):
|
||||
get_tree().get_root().get_node("multiplayer_menu").show()
|
||||
get_tree().get_root().get_node("main_menu").hide()
|
||||
elif get_tree().get_root().has_node("main_menu"):
|
||||
get_tree().get_root().get_node("main_menu").show()
|
||||
game_running = false
|
||||
bots = false
|
||||
game_name = ""
|
||||
|
||||
emit_signal("game_ended")
|
||||
@@ -0,0 +1,58 @@
|
||||
extends Node
|
||||
|
||||
const FILE_PATH = "user://local_storage"
|
||||
|
||||
|
||||
func _ready():
|
||||
TranslationServer.set_locale(read_value("locale","en"))
|
||||
|
||||
|
||||
func read_content():
|
||||
var f = File.new()
|
||||
var err = f.open(FILE_PATH, File.READ)
|
||||
var content = {}
|
||||
if err == OK:
|
||||
content = parse_json(f.get_as_text())
|
||||
f.close()
|
||||
if content == null:
|
||||
content = {}
|
||||
return content
|
||||
|
||||
|
||||
func write_content(content:Dictionary):
|
||||
var f = File.new()
|
||||
var err = f.open(FILE_PATH, File.WRITE)
|
||||
#var err = f.open_encrypted_with_pass(FILE_PATH, File.WRITE, OS.get_unique_id())
|
||||
f.store_string(to_json(content))
|
||||
f.close()
|
||||
|
||||
|
||||
func write_value(key:String, value):
|
||||
var content = read_content()
|
||||
content[key] = value
|
||||
write_content(content)
|
||||
|
||||
|
||||
func read_value(key:String, default = null):
|
||||
var content = read_content()
|
||||
if content.has(key) && content.get(key) != null:
|
||||
return content.get(key)
|
||||
else:
|
||||
return default
|
||||
|
||||
|
||||
func delete_value(key:String):
|
||||
var content = read_content()
|
||||
content.erase(key)
|
||||
write_content(content)
|
||||
|
||||
|
||||
func write_values(new_content:Dictionary):
|
||||
var content = read_content()
|
||||
for key in new_content:
|
||||
content[key] = new_content[key]
|
||||
write_content(content)
|
||||
|
||||
|
||||
func read_values():
|
||||
return read_content()
|
||||
@@ -0,0 +1,48 @@
|
||||
extends Spatial
|
||||
|
||||
class_name Route
|
||||
|
||||
signal road_added(road)
|
||||
signal road_removed(road)
|
||||
|
||||
|
||||
func get_last_road():
|
||||
if get_child_count() > 0:
|
||||
return get_child(get_child_count() - 1)
|
||||
else:
|
||||
return null
|
||||
|
||||
|
||||
func get_road(road_index):
|
||||
return get_child(road_index)
|
||||
|
||||
|
||||
remotesync func add_road(type, creator):
|
||||
var transform = get_global_transform()
|
||||
var last_road = get_last_road()
|
||||
if last_road != null:
|
||||
transform = last_road.get_global_transform();
|
||||
var curve = last_road.get_curve()
|
||||
transform = transform.translated(curve.get_point_position(curve.get_point_count() - 1))
|
||||
if last_road.get_end_rotation().length() != 0:
|
||||
transform.basis = transform.basis.rotated(last_road.get_end_rotation().normalized(), last_road.get_end_rotation().length())
|
||||
|
||||
var new_road = roads_factory.get_road_instance(type)
|
||||
new_road.set_global_transform(transform)
|
||||
new_road.set_preview(false)
|
||||
new_road.set_creator(creator)
|
||||
|
||||
if creator > 0:
|
||||
var player = gamestate.game.get_node(str(creator))
|
||||
if player != null:
|
||||
new_road.set_color(player.get_player_color())
|
||||
|
||||
add_child(new_road)
|
||||
|
||||
emit_signal("road_added", new_road)
|
||||
|
||||
|
||||
remotesync func remove_road(road_index):
|
||||
var road = get_child(road_index)
|
||||
remove_child(road)
|
||||
emit_signal("road_removed", road)
|
||||
Reference in New Issue
Block a user