Sunday Update: graphic and bots improvements, ConfigFile, menu settings
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
extends Node
|
||||
|
||||
const FILE_PATH = "user://local_storage"
|
||||
|
||||
const RESOLUTIONS = [Vector2(1920,1080),Vector2(1600,900),Vector2(1366,758),Vector2(1280,720),Vector2(1136,640),Vector2(1024,576)]
|
||||
|
||||
const CONTROL_ACTIONS = ["controls_thrust", "controls_break", "controls_add_road", "controls_next_road_type", "controls_prev_road_type", "controls_next_road_variant", "controls_prev_road_variant", "controls_reset", "controls_menu"]
|
||||
|
||||
const INPUT_UI_MAPPING = {"ui_accept" : "controls_add_road", "ui_select" : "controls_add_road", "ui_up" : "controls_next_road_variant", "ui_down" : "controls_prev_road_variant", "ui_left" : "controls_prev_road_type", "ui_right" : "controls_next_road_type"}
|
||||
|
||||
var config_file:ConfigFile = ConfigFile.new()
|
||||
|
||||
|
||||
|
||||
func _ready():
|
||||
config_file.load(FILE_PATH)
|
||||
|
||||
|
||||
func save():
|
||||
config_file.save(FILE_PATH)
|
||||
|
||||
|
||||
func get_value(section:String, key:String, default = null):
|
||||
return config_file.get_value(section,key,default)
|
||||
|
||||
|
||||
func set_value(section:String, key:String, value):
|
||||
config_file.set_value(section,key,value)
|
||||
@@ -0,0 +1,62 @@
|
||||
extends Node
|
||||
|
||||
const FILE_PATH = "user://local_storage"
|
||||
|
||||
|
||||
|
||||
func _ready():
|
||||
apply_settings()
|
||||
|
||||
|
||||
func apply_settings():
|
||||
apply_locale()
|
||||
apply_game_server()
|
||||
apply_resolution()
|
||||
apply_controls()
|
||||
|
||||
|
||||
func apply_locale():
|
||||
TranslationServer.set_locale(config.get_value("system","locale","en"))
|
||||
|
||||
|
||||
func apply_game_server():
|
||||
var server_addr = config.get_value("game_server", "server_addr")
|
||||
if server_addr != null && not server_addr.empty():
|
||||
game_server.set_server_addr(server_addr)
|
||||
var api_addr = config.get_value("game_server","api_addr")
|
||||
if api_addr != null && not api_addr.empty():
|
||||
game_server.set_api_addr(api_addr)
|
||||
|
||||
|
||||
func apply_resolution():
|
||||
var view_port = get_tree().get_root()
|
||||
OS.set_window_fullscreen(config.get_value("graphics","fullscreen", true))
|
||||
|
||||
var resolution = config.get_value("graphics","resolution",config.RESOLUTIONS[0])
|
||||
if OS.is_window_fullscreen():
|
||||
var base_size = Vector2(1920, 1080)
|
||||
var scale= base_size.x / resolution.x
|
||||
get_tree().set_screen_stretch(SceneTree.STRETCH_MODE_2D,SceneTree.STRETCH_ASPECT_EXPAND,base_size,scale)
|
||||
else:
|
||||
OS.set_window_size(resolution)
|
||||
get_tree().set_screen_stretch(SceneTree.STRETCH_MODE_VIEWPORT,SceneTree.STRETCH_ASPECT_IGNORE,OS.get_window_size(),1)
|
||||
|
||||
|
||||
func apply_controls():
|
||||
InputMap.load_from_globals()
|
||||
var control_map = config.get_value("controls","mapping",{})
|
||||
for action in InputMap.get_actions():
|
||||
if control_map.has(action):
|
||||
for event in InputMap.get_action_list(action):
|
||||
if event is InputEventKey && control_map[action].has("key"):
|
||||
InputMap.action_erase_event(action, event)
|
||||
event.set_scancode(OS.find_scancode_from_string(control_map[action]["key"]))
|
||||
InputMap.action_add_event(action,event)
|
||||
elif event is InputEventJoypadButton && control_map[action].has("joypad"):
|
||||
InputMap.action_erase_event(action, event)
|
||||
event.set_button_index(control_map[action]["joypad"])
|
||||
InputMap.action_add_event(action,event)
|
||||
|
||||
for ui_mapping in config.INPUT_UI_MAPPING:
|
||||
for event in InputMap.get_action_list(config.INPUT_UI_MAPPING[ui_mapping]):
|
||||
InputMap.action_add_event(ui_mapping, event)
|
||||
@@ -0,0 +1,53 @@
|
||||
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")
|
||||
find_node("sun").set_visible(config.get_value("graphics","light", false))
|
||||
if find_node("sun").is_visible_in_tree():
|
||||
find_node("sun").set_shadow(config.get_value("graphics","shadows", false))
|
||||
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,51 @@
|
||||
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):
|
||||
if get_child_count() > road_index:
|
||||
return get_child(road_index)
|
||||
else:
|
||||
return null
|
||||
|
||||
|
||||
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