Sunday Update: graphic and bots improvements, ConfigFile, menu settings

This commit is contained in:
Lurkars
2019-07-28 13:32:28 +02:00
commit c95bb8fb55
445 changed files with 186278 additions and 0 deletions
+28
View File
@@ -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)
+62
View File
@@ -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)
+53
View File
@@ -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
+152
View File
@@ -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")
+51
View File
@@ -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)