late Sunday update: netcode changes, bot improvements, bot development
This commit is contained in:
@@ -4,14 +4,13 @@ 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 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", "controls_capture"]
|
||||
|
||||
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)
|
||||
|
||||
|
||||
@@ -20,10 +20,10 @@ func apply_locale():
|
||||
|
||||
|
||||
func apply_game_server():
|
||||
var server_addr = config.get_value("game_server", "server_addr")
|
||||
var server_addr = config.get_value("system", "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")
|
||||
var api_addr = config.get_value("system","api_addr")
|
||||
if api_addr != null && not api_addr.empty():
|
||||
game_server.set_api_addr(api_addr)
|
||||
|
||||
@@ -39,6 +39,7 @@ func apply_resolution():
|
||||
get_tree().set_screen_stretch(SceneTree.STRETCH_MODE_2D,SceneTree.STRETCH_ASPECT_EXPAND,base_size,scale)
|
||||
else:
|
||||
OS.set_window_size(resolution)
|
||||
OS.set_window_position(Vector2((OS.get_screen_size().x - resolution.x) / 2, (OS.get_screen_size().y - resolution.y) / 2)) # center screen
|
||||
get_tree().set_screen_stretch(SceneTree.STRETCH_MODE_VIEWPORT,SceneTree.STRETCH_ASPECT_IGNORE,OS.get_window_size(),1)
|
||||
|
||||
|
||||
|
||||
+14
-2
@@ -16,7 +16,8 @@ func _ready():
|
||||
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)
|
||||
route.set_road(roads_factory.START, -1)
|
||||
route.rpc("set_road",roads_factory.START, -1)
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
@@ -25,6 +26,16 @@ func _physics_process(delta):
|
||||
check_autotrack()
|
||||
|
||||
|
||||
func get_player(player_id:String):
|
||||
if get_node("players") != null && get_node("players").has_node(player_id):
|
||||
return get_node("players").get_node(player_id)
|
||||
return null
|
||||
|
||||
|
||||
func get_player_by_network_id(network_id:int):
|
||||
return get_player(str(network_id))
|
||||
|
||||
|
||||
func set_player_order():
|
||||
players = get_node("players").get_children()
|
||||
players.sort_custom(PlayerSorter,"sort")
|
||||
@@ -45,7 +56,8 @@ 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)
|
||||
route.set_road(roads_factory.STRAIGHT, -1)
|
||||
route.rpc("set_road", roads_factory.STRAIGHT, -1)
|
||||
|
||||
|
||||
class PlayerSorter:
|
||||
|
||||
@@ -3,6 +3,8 @@ extends Node
|
||||
const MAX_PEERS = 4
|
||||
const LOBBY_READY_WAIT_TIME = 3
|
||||
|
||||
const DEFAULT_BOT_DIFFICULTY = 0.5
|
||||
|
||||
var Game = preload("res://scenes/game/Game.tscn")
|
||||
var Player = preload("res://scenes/player/Player.tscn")
|
||||
var HumanPlayer = preload("res://scenes/player/HumanPlayer.tscn")
|
||||
@@ -13,6 +15,7 @@ var players = {}
|
||||
|
||||
var game_name = ""
|
||||
var bots:bool = false
|
||||
var bot_difficulty:float = DEFAULT_BOT_DIFFICULTY
|
||||
var game_running:bool = false
|
||||
|
||||
signal players_changed(players)
|
||||
@@ -74,7 +77,7 @@ remotesync func prepare_game():
|
||||
var player = players[p_id]
|
||||
|
||||
var player_scene = Player.instance()
|
||||
player_scene.set_network_master(p_id)
|
||||
# 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)
|
||||
@@ -96,13 +99,14 @@ remotesync func prepare_game():
|
||||
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.set_player_color(Color(util.randf(),util.randf(),util.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_difficulty(bot_difficulty)
|
||||
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()):
|
||||
@@ -134,6 +138,11 @@ remotesync func set_bots(has_bots:bool):
|
||||
bots = has_bots
|
||||
|
||||
|
||||
remotesync func set_bot_difficulty(new_bot_difficulty:float):
|
||||
if new_bot_difficulty >= 0 && new_bot_difficulty <= 1:
|
||||
bot_difficulty = new_bot_difficulty
|
||||
|
||||
|
||||
func quit_game():
|
||||
if game != null:
|
||||
game.queue_free()
|
||||
|
||||
+16
-6
@@ -14,13 +14,24 @@ func get_last_road():
|
||||
|
||||
|
||||
func get_road(road_index):
|
||||
if get_child_count() > road_index:
|
||||
if road_index >= 0 && get_child_count() > road_index:
|
||||
return get_child(road_index)
|
||||
else:
|
||||
return null
|
||||
|
||||
|
||||
remotesync func add_road(type, creator):
|
||||
master func add_road(type):
|
||||
if is_network_master():
|
||||
var sender_id = get_tree().get_rpc_sender_id()
|
||||
if sender_id == 0:
|
||||
sender_id = 1
|
||||
var creator = gamestate.game.get_player_by_network_id(sender_id)
|
||||
if creator != null && creator.is_in_group("first"):
|
||||
set_road(type,creator.get_name())
|
||||
rpc("set_road", type, creator.get_name())
|
||||
|
||||
|
||||
puppet func set_road(type, creator):
|
||||
var transform = get_global_transform()
|
||||
var last_road = get_last_road()
|
||||
if last_road != null:
|
||||
@@ -35,10 +46,9 @@ remotesync func add_road(type, creator):
|
||||
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())
|
||||
var player = gamestate.game.get_player(str(creator))
|
||||
if player != null:
|
||||
new_road.set_color(player.get_player_color())
|
||||
|
||||
add_child(new_road)
|
||||
|
||||
|
||||
@@ -5,6 +5,9 @@ var LobbyMenu = preload("res://scenes/menus/LobbyMenu.tscn")
|
||||
|
||||
func _ready():
|
||||
find_node("bots").set_pressed(config.get_value("game","bots", true))
|
||||
find_node("bot_difficulty").set_value(config.get_value("game","bot_difficulty", gamestate.DEFAULT_BOT_DIFFICULTY))
|
||||
find_node("bot_difficulty").set_editable(find_node("bots").is_pressed())
|
||||
find_node("bot_difficulty").set_tooltip(tr("BOT_DIFFICULTY"))
|
||||
|
||||
|
||||
func _draw():
|
||||
@@ -14,7 +17,8 @@ func _draw():
|
||||
func _on_host_pressed():
|
||||
var port = find_node("port").get_value()
|
||||
var bots = find_node("bots").is_pressed()
|
||||
var err = server.host_game(int(port), bots)
|
||||
var bot_difficulty = find_node("bot_difficulty").get_value()
|
||||
var err = server.host_game(int(port), bots, bot_difficulty)
|
||||
|
||||
if err == OK:
|
||||
var lobby_menu = LobbyMenu.instance()
|
||||
@@ -30,4 +34,8 @@ func _on_host_pressed():
|
||||
|
||||
func _on_back_pressed():
|
||||
queue_free()
|
||||
get_tree().get_root().get_node("multiplayer_menu").show()
|
||||
get_tree().get_root().get_node("multiplayer_menu").show()
|
||||
|
||||
|
||||
func _on_bots_toggled(button_pressed):
|
||||
find_node("bot_difficulty").set_editable(button_pressed)
|
||||
@@ -1,5 +1,7 @@
|
||||
extends Control
|
||||
|
||||
var SettingsMenu = preload("res://scenes/menus/SettingsMenu.tscn")
|
||||
|
||||
|
||||
func _draw():
|
||||
find_node("resume").grab_focus()
|
||||
@@ -10,7 +12,9 @@ func _on_resume_pressed():
|
||||
|
||||
|
||||
func _on_settings_pressed():
|
||||
pass
|
||||
var settings_menu = SettingsMenu.instance()
|
||||
get_parent().add_child(settings_menu)
|
||||
hide()
|
||||
|
||||
|
||||
func _on_end_pressed():
|
||||
|
||||
@@ -33,7 +33,7 @@ func _draw():
|
||||
find_node("ready").grab_focus()
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
func _process(delta):
|
||||
if not countdown_timer.is_stopped():
|
||||
get_node("countdown").text = str(int(countdown_timer.get_time_left()) + 1)
|
||||
|
||||
|
||||
@@ -5,6 +5,9 @@ onready var player_settings = find_node("player_settings")
|
||||
|
||||
func _ready():
|
||||
find_node("bots").set_pressed(config.get_value("game","bots", true))
|
||||
find_node("bot_difficulty").set_value(config.get_value("game","bot_difficulty", gamestate.DEFAULT_BOT_DIFFICULTY))
|
||||
find_node("bot_difficulty").set_editable(find_node("bots").is_pressed())
|
||||
find_node("bot_difficulty").set_tooltip(tr("BOT_DIFFICULTY"))
|
||||
|
||||
|
||||
func _draw():
|
||||
@@ -15,10 +18,15 @@ func _on_start_pressed():
|
||||
var name = player_settings.get_name_node().text
|
||||
var color = player_settings.get_color_node().color
|
||||
var bots = find_node("bots").is_pressed()
|
||||
var bot_difficulty = find_node("bot_difficulty").get_value()
|
||||
queue_free()
|
||||
server.local_game(name,color,bots)
|
||||
server.local_game(name,color,bots,bot_difficulty)
|
||||
|
||||
|
||||
func _on_back_pressed():
|
||||
queue_free()
|
||||
get_tree().get_root().get_node("main_menu").show()
|
||||
|
||||
|
||||
func _on_bots_toggled(button_pressed):
|
||||
find_node("bot_difficulty").set_editable(button_pressed)
|
||||
|
||||
@@ -42,4 +42,9 @@ func _server_disconnected():
|
||||
func show_error_dialog(text:String):
|
||||
var dialog = get_node("error_dialog")
|
||||
dialog.set_text(text)
|
||||
dialog.popup_centered()
|
||||
dialog.popup_centered()
|
||||
|
||||
|
||||
func _on_info_pressed():
|
||||
var dialog = get_node("info_popup")
|
||||
dialog.popup_centered()
|
||||
|
||||
@@ -8,6 +8,9 @@ func _ready():
|
||||
game_title += " by " + player_name
|
||||
find_node("name").set_text(game_title)
|
||||
find_node("bots").set_pressed(config.get_value("game","bots", true))
|
||||
find_node("bot_difficulty").set_value(config.get_value("game","bot_difficulty", gamestate.DEFAULT_BOT_DIFFICULTY))
|
||||
find_node("bot_difficulty").set_editable(find_node("bots").is_pressed())
|
||||
find_node("bot_difficulty").set_tooltip(tr("BOT_DIFFICULTY"))
|
||||
|
||||
|
||||
func _draw():
|
||||
@@ -21,7 +24,8 @@ func _on_create_pressed():
|
||||
var bots = 0
|
||||
if find_node("bots").is_pressed():
|
||||
bots = 1
|
||||
req.post_request('client/game/create', to_json({'name' : server_name, 'bots' : bots}))
|
||||
var bot_difficulty = find_node("bot_difficulty").get_value()
|
||||
req.post_request('client/game/create', to_json({'name' : server_name, 'bots' : bots, 'bot_difficulty' : bot_difficulty}))
|
||||
|
||||
|
||||
func _on_game_created(result, response_code, headers, body):
|
||||
@@ -44,3 +48,7 @@ func _on_name_text_changed(new_text):
|
||||
func _on_back_pressed():
|
||||
queue_free()
|
||||
get_tree().get_root().get_node("multiplayer_menu").show()
|
||||
|
||||
|
||||
func _on_bots_toggled(button_pressed):
|
||||
find_node("bot_difficulty").set_editable(button_pressed)
|
||||
|
||||
@@ -77,7 +77,7 @@ func get_games(only_open:bool):
|
||||
if only_open:
|
||||
req.get_request('client/games?open')
|
||||
else:
|
||||
req.get_request('client/games')
|
||||
req.get_request('client/games')
|
||||
|
||||
|
||||
func _on_get_games(result, response_code, headers, body):
|
||||
@@ -94,7 +94,7 @@ func _on_get_games(result, response_code, headers, body):
|
||||
name += "/4)"
|
||||
if game.bots:
|
||||
name += " [with Bots]"
|
||||
games_list.add_item(name)
|
||||
games_list.add_item(name)
|
||||
if game.running:
|
||||
games_list.set_item_icon(games_list.get_item_count()-1, games_list.get_node("running_icon").get_button_icon())
|
||||
elif game.has('private') && game.private:
|
||||
|
||||
@@ -16,6 +16,10 @@ func _ready():
|
||||
init_mapping()
|
||||
|
||||
|
||||
func apply():
|
||||
config.set_value("controls","mapping",new_inputs)
|
||||
|
||||
|
||||
func init_mapping():
|
||||
new_inputs = {}
|
||||
for action in config.CONTROL_ACTIONS:
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
extends Tabs
|
||||
|
||||
onready var player_settings = find_node("settings_player")
|
||||
|
||||
|
||||
func _ready():
|
||||
# game
|
||||
find_node("bots").set_pressed(config.get_value("game","bots", true))
|
||||
find_node("bot_difficulty").set_value(config.get_value("game","bot_difficulty", gamestate.DEFAULT_BOT_DIFFICULTY))
|
||||
find_node("bot_difficulty").set_tooltip(tr("BOT_DIFFICULTY"))
|
||||
|
||||
|
||||
func apply():
|
||||
config.set_value("game","player_name",player_settings.get_name_node().get_text())
|
||||
config.set_value("game","player_color",player_settings.get_color_node().color)
|
||||
config.set_value("game","bots",find_node("bots").is_pressed())
|
||||
config.set_value("game","bot_difficulty",find_node("bot_difficulty").get_value())
|
||||
@@ -0,0 +1,24 @@
|
||||
extends Tabs
|
||||
|
||||
|
||||
func _ready():
|
||||
find_node("fullscreen").set_pressed(config.get_value("graphics","fullscreen", true))
|
||||
find_node("light").set_pressed(config.get_value("graphics","light", false))
|
||||
find_node("shadows").set_pressed(config.get_value("graphics","shadows", false))
|
||||
find_node("shadows").set_disabled(not find_node("light").is_pressed())
|
||||
|
||||
for resolution in config.RESOLUTIONS:
|
||||
find_node("resolution").add_item(str(resolution.x) + " * " + str(resolution.y))
|
||||
|
||||
find_node("resolution").select(config.RESOLUTIONS.find(config.get_value("graphics","resolution", config.RESOLUTIONS[0])))
|
||||
|
||||
|
||||
func apply():
|
||||
config.set_value("graphics","resolution",config.RESOLUTIONS[find_node("resolution").get_selected()])
|
||||
config.set_value("graphics","fullscreen",find_node("fullscreen").is_pressed())
|
||||
config.set_value("graphics","light",find_node("light").is_pressed())
|
||||
config.set_value("graphics","shadows",find_node("shadows").is_pressed())
|
||||
|
||||
|
||||
func _on_light_toggled(button_pressed):
|
||||
find_node("shadows").set_disabled(not button_pressed)
|
||||
@@ -1,35 +1,14 @@
|
||||
extends Control
|
||||
|
||||
onready var player_settings = find_node("settings_player")
|
||||
onready var game_tab = find_node("game")
|
||||
onready var controls_tab = find_node("controls")
|
||||
onready var graphics_tab = find_node("graphics")
|
||||
onready var system_tab = find_node("system")
|
||||
|
||||
var locale
|
||||
|
||||
|
||||
func _ready():
|
||||
get_node("menu/back").connect("pressed",self,"_on_back_pressed")
|
||||
|
||||
# game
|
||||
find_node("bots").set_pressed(config.get_value("game","bots", true))
|
||||
|
||||
# graphics
|
||||
find_node("fullscreen").set_pressed(config.get_value("graphics","fullscreen", true))
|
||||
find_node("light").set_pressed(config.get_value("graphics","light", false))
|
||||
find_node("shadows").set_pressed(config.get_value("graphics","shadows", false))
|
||||
find_node("shadows").set_disabled(not find_node("light").is_pressed())
|
||||
|
||||
for resolution in config.RESOLUTIONS:
|
||||
find_node("resolution").add_item(str(resolution.x) + " * " + str(resolution.y))
|
||||
|
||||
find_node("resolution").select(config.RESOLUTIONS.find(config.get_value("graphics","resolution", config.RESOLUTIONS[0])))
|
||||
|
||||
# system
|
||||
find_node("server_addr").set_text(game_server.get_server_addr())
|
||||
find_node("api_addr").set_text(game_server.get_api_addr())
|
||||
_init_locales()
|
||||
system_tab.connect("locale_changed", self, "on_locale_changed")
|
||||
|
||||
|
||||
func _draw():
|
||||
@@ -38,79 +17,30 @@ func _draw():
|
||||
|
||||
func _on_back_pressed():
|
||||
queue_free()
|
||||
get_tree().get_root().get_node("main_menu").show()
|
||||
if get_parent().has_node("ingame_menu"):
|
||||
get_parent().get_node("ingame_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()
|
||||
|
||||
|
||||
func _on_locales_item_selected(index):
|
||||
match index:
|
||||
0:
|
||||
locale = "en"
|
||||
1:
|
||||
locale = "de"
|
||||
_:
|
||||
locale = "en"
|
||||
TranslationServer.set_locale(locale)
|
||||
func on_locale_changed():
|
||||
game_tab.set_name(tr("GAME"))
|
||||
controls_tab.set_name(tr("CONTROLS"))
|
||||
graphics_tab.set_name(tr("GRAPHICS"))
|
||||
system_tab.set_name(tr("SYSTEM"))
|
||||
|
||||
|
||||
func _init_locales():
|
||||
var locales = find_node("locales")
|
||||
locales.clear()
|
||||
locales.add_item(tr("LOCALE_EN"))
|
||||
locales.add_item(tr("LOCALE_DE"))
|
||||
locale = config.get_value("system","locale","en")
|
||||
match locale:
|
||||
"en":
|
||||
locales.select(0)
|
||||
_on_locales_item_selected(0)
|
||||
"de":
|
||||
locales.select(1)
|
||||
_on_locales_item_selected(1)
|
||||
|
||||
|
||||
func _on_locales_tree_exiting():
|
||||
config_apply.apply_locale()
|
||||
|
||||
|
||||
func _on_save_pressed():
|
||||
_on_apply_pressed()
|
||||
_on_back_pressed()
|
||||
|
||||
|
||||
func _on_apply_pressed():
|
||||
# game
|
||||
config.set_value("game","player_name",player_settings.get_name_node().get_text())
|
||||
config.set_value("game","player_color",player_settings.get_color_node().color)
|
||||
config.set_value("game","bots",find_node("bots").is_pressed())
|
||||
|
||||
# graphics
|
||||
config.set_value("graphics","resolution",config.RESOLUTIONS[find_node("resolution").get_selected()])
|
||||
config.set_value("graphics","fullscreen",find_node("fullscreen").is_pressed())
|
||||
config.set_value("graphics","light",find_node("light").is_pressed())
|
||||
config.set_value("graphics","shadows",find_node("shadows").is_pressed())
|
||||
|
||||
# controls
|
||||
config.set_value("controls","mapping",find_node("settings_controls").new_inputs)
|
||||
|
||||
# system
|
||||
config.set_value("system","locale",locale)
|
||||
var server_addr = find_node("server_addr").get_text()
|
||||
if server_addr.empty():
|
||||
server_addr = game_server.SERVER_ADDR
|
||||
config.set_value("system","server_addr",server_addr)
|
||||
|
||||
var api_addr = find_node("api_addr").get_text()
|
||||
if api_addr.empty():
|
||||
api_addr = game_server.API_ADDR
|
||||
config.set_value("system","api_addr",api_addr)
|
||||
game_tab.apply()
|
||||
graphics_tab.apply()
|
||||
controls_tab.apply()
|
||||
system_tab.apply()
|
||||
|
||||
config.save()
|
||||
|
||||
config_apply.apply_settings()
|
||||
|
||||
|
||||
func _on_light_toggled(button_pressed):
|
||||
find_node("shadows").set_disabled(not button_pressed)
|
||||
config_apply.apply_settings()
|
||||
@@ -0,0 +1,55 @@
|
||||
extends Tabs
|
||||
|
||||
var locale
|
||||
|
||||
signal locale_changed()
|
||||
|
||||
|
||||
func _ready():
|
||||
find_node("server_addr").set_text(game_server.get_server_addr())
|
||||
find_node("api_addr").set_text(game_server.get_api_addr())
|
||||
_init_locales()
|
||||
|
||||
|
||||
func apply():
|
||||
config.set_value("system","locale",locale)
|
||||
var server_addr = find_node("server_addr").get_text()
|
||||
if server_addr.empty():
|
||||
server_addr = game_server.SERVER_ADDR
|
||||
config.set_value("system","server_addr",server_addr)
|
||||
|
||||
var api_addr = find_node("api_addr").get_text()
|
||||
if api_addr.empty():
|
||||
api_addr = game_server.API_ADDR
|
||||
config.set_value("system","api_addr",api_addr)
|
||||
|
||||
|
||||
func _on_locales_item_selected(index):
|
||||
match index:
|
||||
0:
|
||||
locale = "en"
|
||||
1:
|
||||
locale = "de"
|
||||
_:
|
||||
locale = "en"
|
||||
TranslationServer.set_locale(locale)
|
||||
emit_signal("locale_changed")
|
||||
|
||||
|
||||
func _init_locales():
|
||||
var locales = find_node("locales")
|
||||
locales.clear()
|
||||
locales.add_item(tr("LOCALE_EN"))
|
||||
locales.add_item(tr("LOCALE_DE"))
|
||||
locale = config.get_value("system","locale","en")
|
||||
match locale:
|
||||
"en":
|
||||
locales.select(0)
|
||||
_on_locales_item_selected(0)
|
||||
"de":
|
||||
locales.select(1)
|
||||
_on_locales_item_selected(1)
|
||||
|
||||
|
||||
func _on_system_settings_menu_tree_exiting():
|
||||
config_apply.apply_locale()
|
||||
@@ -26,11 +26,13 @@ func _ready():
|
||||
server_secret=argument.split("=")[1]
|
||||
if argument.split("=")[0] == "--bots":
|
||||
gamestate.set_bots(bool(int(argument.split("=")[1])))
|
||||
if argument.split("=")[0] == "--bot-difficulty":
|
||||
gamestate.set_bot_difficulty(float(argument.split("=")[1]))
|
||||
if argument.split("=")[0] == "--server-addr":
|
||||
game_server.set_server_addr(str(argument.split("=")[1]))
|
||||
if argument.split("=")[0] == "--api-addr":
|
||||
game_server.set_api_addr(str(argument.split("=")[1]))
|
||||
|
||||
|
||||
if dedicated_server:
|
||||
var err = host_game(port)
|
||||
if err == OK:
|
||||
@@ -44,21 +46,24 @@ func _ready():
|
||||
quit_server()
|
||||
|
||||
|
||||
func host_game(port:int, set_bots:bool = false):
|
||||
func host_game(port:int, set_bots:bool = false, bot_difficulty:float = gamestate.DEFAULT_BOT_DIFFICULTY):
|
||||
var host = NetworkedMultiplayerENet.new()
|
||||
var err = host.create_server(port, MAX_PEERS)
|
||||
get_tree().set_network_peer(host)
|
||||
|
||||
|
||||
get_tree().connect("network_peer_connected", self, "_client_connected")
|
||||
get_tree().connect("network_peer_disconnected", self,"_client_disconnected")
|
||||
|
||||
|
||||
gamestate.connect("players_changed",self,"_players_changed")
|
||||
gamestate.connect("game_ready",self,"_game_ready")
|
||||
gamestate.connect("game_ended",self,"_game_ended")
|
||||
|
||||
|
||||
if set_bots:
|
||||
gamestate.bots = true
|
||||
|
||||
|
||||
if set_bots && bot_difficulty != gamestate.DEFAULT_BOT_DIFFICULTY:
|
||||
gamestate.bot_difficulty = bot_difficulty
|
||||
|
||||
if timer == null:
|
||||
timer = Timer.new()
|
||||
timer.set_name("timer")
|
||||
@@ -66,18 +71,19 @@ func host_game(port:int, set_bots:bool = false):
|
||||
timer.set_one_shot(true)
|
||||
timer.set_autostart(false)
|
||||
add_child(timer)
|
||||
|
||||
if err != OK:
|
||||
|
||||
if err != OK:
|
||||
emit_signal("server_error", "HOST", err)
|
||||
|
||||
|
||||
return err
|
||||
|
||||
|
||||
func local_game(name:String, color:Color, bots:bool):
|
||||
func local_game(name:String, color:Color, bots:bool, bot_difficulty:float):
|
||||
var localhost = NetworkedMultiplayerENet.new()
|
||||
localhost.create_server(0, 0)
|
||||
get_tree().set_network_peer(localhost)
|
||||
gamestate.bots = bots
|
||||
gamestate.bot_difficulty = bot_difficulty
|
||||
gamestate.set_player(get_tree().get_network_unique_id(), name, color)
|
||||
gamestate.prepare_game()
|
||||
gamestate.post_start_game()
|
||||
@@ -96,6 +102,7 @@ func _client_connected(id):
|
||||
if dedicated_server:
|
||||
print(server_id + "peer connected: " + str(id))
|
||||
gamestate.rpc_id(id, "set_bots" ,gamestate.bots)
|
||||
gamestate.rpc_id(id, "bot_difficulty" ,gamestate.bot_difficulty)
|
||||
if not timer.is_stopped():
|
||||
timer.disconnect("timeout",self,"quit_server")
|
||||
timer.stop()
|
||||
@@ -108,11 +115,11 @@ func _client_disconnected(id):
|
||||
if gamestate.game_running:
|
||||
emit_signal("server_error", "DISCONNECTED", [id])
|
||||
gamestate.rpc("remove_player" ,id)
|
||||
else:
|
||||
else:
|
||||
gamestate.rpc("remove_player" ,id)
|
||||
|
||||
|
||||
func _players_changed(players):
|
||||
func _players_changed(players):
|
||||
if get_tree().is_network_server():
|
||||
if dedicated_server:
|
||||
update_server_data()
|
||||
@@ -161,10 +168,10 @@ func _game_ready(all_ready):
|
||||
func _game_ended():
|
||||
get_tree().disconnect("network_peer_connected", self, "_client_connected")
|
||||
get_tree().disconnect("network_peer_disconnected", self,"_client_disconnected")
|
||||
|
||||
|
||||
gamestate.disconnect("players_changed",self,"_players_changed")
|
||||
gamestate.disconnect("game_ready",self,"_game_ready")
|
||||
gamestate.disconnect("game_ended",self,"_game_ended")
|
||||
|
||||
|
||||
get_tree().set_refuse_new_network_connections(false)
|
||||
get_tree().set_network_peer(null)
|
||||
@@ -3,39 +3,39 @@ extends Spatial
|
||||
class_name BaseInventory
|
||||
|
||||
var road_straights = [
|
||||
roads_factory.BUMP,
|
||||
roads_factory.BUMP_SMALL,
|
||||
roads_factory.STRAIGHT,
|
||||
roads_factory.STRAIGHT_SMALL,
|
||||
roads_factory.BUMP,
|
||||
roads_factory.BUMP_SMALL,
|
||||
roads_factory.STRAIGHT,
|
||||
roads_factory.STRAIGHT_SMALL,
|
||||
]
|
||||
|
||||
var roads_right = [
|
||||
roads_factory.CURVE_RIGHT,
|
||||
roads_factory.CURVE_LARGE_RIGHT,
|
||||
roads_factory.CURVE_SMALL_RIGHT,
|
||||
roads_factory.SKEW_RIGHT,
|
||||
roads_factory.CURVE_RIGHT,
|
||||
roads_factory.CURVE_LARGE_RIGHT,
|
||||
roads_factory.CURVE_SMALL_RIGHT,
|
||||
roads_factory.SKEW_RIGHT,
|
||||
roads_factory.CURVED_RIGHT,
|
||||
]
|
||||
|
||||
var roads_left = [
|
||||
roads_factory.CURVE_LEFT,
|
||||
roads_factory.CURVE_LARGE_LEFT,
|
||||
roads_factory.CURVE_SMALL_LEFT,
|
||||
roads_factory.SKEW_LEFT,
|
||||
roads_factory.CURVED_LEFT,
|
||||
roads_factory.CURVE_LEFT,
|
||||
roads_factory.CURVE_LARGE_LEFT,
|
||||
roads_factory.CURVE_SMALL_LEFT,
|
||||
roads_factory.SKEW_LEFT,
|
||||
roads_factory.CURVED_LEFT,
|
||||
]
|
||||
|
||||
var roads_up = [
|
||||
roads_factory.RAMP_UP,
|
||||
roads_factory.RAMP_CURVED_UP,
|
||||
roads_factory.RAMP_SMALL_UP,
|
||||
]
|
||||
roads_factory.RAMP_UP,
|
||||
roads_factory.RAMP_CURVED_UP,
|
||||
roads_factory.RAMP_SMALL_UP,
|
||||
]
|
||||
|
||||
var roads_down = [
|
||||
roads_factory.RAMP_DOWN,
|
||||
roads_factory.RAMP_CURVED_DOWN,
|
||||
roads_factory.RAMP_SMALL_DOWN,
|
||||
]
|
||||
]
|
||||
|
||||
var roads_special = [
|
||||
roads_factory.LOOP,
|
||||
@@ -65,10 +65,10 @@ func set_item():
|
||||
if item:
|
||||
item.free()
|
||||
item = roads_factory.get_road_instance(roads[type][index])
|
||||
|
||||
|
||||
if player != null:
|
||||
item.set_color(player.get_player_color())
|
||||
|
||||
|
||||
item.rotate_y(PI/2)
|
||||
|
||||
|
||||
emit_signal("item_changed", roads[type][index], player)
|
||||
@@ -1,52 +1,62 @@
|
||||
extends Spatial
|
||||
|
||||
class_name BotPlayer
|
||||
|
||||
var player:Player
|
||||
|
||||
const MAX_OFFSET = 8.0
|
||||
const OFFSET_STEPS = 0.01
|
||||
const OFFSET_STEPS = 0.1
|
||||
const PRE_BREAK_DISTANCE = 3.0
|
||||
|
||||
var break_constrain = 0.0
|
||||
var break_distance = 0.0
|
||||
var thrust_distance = 0.0
|
||||
|
||||
export var overspeed_rate:float = 0.3
|
||||
export var underspeed_rate:float = 0.1
|
||||
export var difficulty:float = 0.0
|
||||
var rate = 0.0
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
func _process(delta):
|
||||
if is_network_master() && player != null:
|
||||
if player.is_out:
|
||||
if player.is_out():
|
||||
if player.is_resetable:
|
||||
player.reset()
|
||||
else:
|
||||
if player.get_road() != null:
|
||||
var road = player.get_road()
|
||||
var rate = util.randf()
|
||||
var speed = player.current_speed
|
||||
var offset = 0
|
||||
var distance = player.follow.get_offset()
|
||||
var tmp_break_constrain = 0.0
|
||||
var distance = player.follow.get_offset() - OFFSET_STEPS
|
||||
var tmp_constrain = 0.0
|
||||
|
||||
break_constrain = 0.0
|
||||
break_distance = 0.0
|
||||
thrust_distance = 0.0
|
||||
|
||||
while tmp_break_constrain == 0.0 and offset < MAX_OFFSET && road != null:
|
||||
while offset <= MAX_OFFSET && road != null:
|
||||
var constrain_index = road.get_constrain_index(distance)
|
||||
var road_length = road.get_lane_curve(player.lane).get_baked_length()
|
||||
if constrain_index >= 0:
|
||||
tmp_break_constrain = road.speed_constrains[constrain_index].z
|
||||
if tmp_break_constrain > break_constrain:
|
||||
break_constrain = tmp_break_constrain
|
||||
tmp_constrain = road.speed_constrains[constrain_index].z
|
||||
if tmp_constrain > 0 && (break_constrain == 0.0 || tmp_constrain < break_constrain):
|
||||
break_constrain = tmp_constrain
|
||||
if break_distance == 0:
|
||||
break_distance = offset
|
||||
if tmp_constrain < 0 && thrust_distance == 0:
|
||||
thrust_distance = offset
|
||||
|
||||
distance += OFFSET_STEPS
|
||||
offset += OFFSET_STEPS
|
||||
|
||||
if distance >= road_length:
|
||||
if distance >= road_length && gamestate.game != null:
|
||||
distance = 0
|
||||
road = gamestate.game.route.get_road(road.get_index()+1)
|
||||
|
||||
if break_constrain > 0 && speed > break_constrain - 0.04 && rate > overspeed_rate:
|
||||
if break_constrain > 0 && speed > break_constrain - 0.005 && break_distance < thrust_distance + PRE_BREAK_DISTANCE && rate < difficulty:
|
||||
player.thrust = -1
|
||||
elif speed - 0.08 < break_constrain && rate > underspeed_rate:
|
||||
elif speed - 0.01 < break_constrain:
|
||||
player.thrust = 1
|
||||
elif break_constrain == 0 && rate > underspeed_rate:
|
||||
elif break_constrain == 0.0 && rate < difficulty || speed < 0.02:
|
||||
player.thrust = 1
|
||||
else:
|
||||
player.thrust = 0
|
||||
@@ -57,9 +67,9 @@ func set_player(path:String):
|
||||
get_node("inventory").set_player(player)
|
||||
|
||||
|
||||
func set_overspeed_rate(new_overspeed_rate:float):
|
||||
overspeed_rate = new_overspeed_rate
|
||||
func set_difficulty(new_difficulty:float):
|
||||
difficulty = new_difficulty
|
||||
|
||||
|
||||
func set_underspeed_rate(new_underspeed_rate:float):
|
||||
underspeed_rate = new_underspeed_rate
|
||||
func _on_rate_timer_timeout():
|
||||
rate = util.randf()
|
||||
|
||||
@@ -14,7 +14,8 @@ func _on_raceCar_road_entered(road):
|
||||
if route.get_last_road().get_index() <= (road.get_index() +2):
|
||||
type = rand.randi_range(0,roads.size() -2) # TODO: remove special, loop need fixes!
|
||||
index = rand.randi_range(0, roads[type].size() -1)
|
||||
route.rpc("add_road", roads[type][index], player.get_index())
|
||||
route.set_road(roads[type][index], -1)
|
||||
route.rpc("set_road", roads[type][index], -1)
|
||||
|
||||
|
||||
func set_player(new_player:Player):
|
||||
|
||||
@@ -5,27 +5,27 @@ onready var camera:InterpolatedCamera = get_node("camera")
|
||||
onready var ingame_menu:Spatial = find_node("ingame_menu")
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
func _process(delta):
|
||||
if is_network_master() && player != null:
|
||||
if Input.is_action_just_pressed("controls_menu"):
|
||||
ingame_menu.set_visible(not ingame_menu.is_visible_in_tree())
|
||||
if player.is_out:
|
||||
if player.is_out():
|
||||
camera.set_speed(0.1)
|
||||
if player.timer.get_time_left() > 0:
|
||||
get_node("hud/reset").set_text(str(int(player.timer.get_time_left()) + 1))
|
||||
else:
|
||||
get_node("hud/reset").set_text(tr("RESET"))
|
||||
if Input.is_action_pressed("controls_reset"):
|
||||
if player.reset():
|
||||
camera.set_speed(10)
|
||||
get_node("hud/reset").set_text("")
|
||||
player.rpc("reset")
|
||||
elif not ingame_menu.is_visible_in_tree():
|
||||
camera.set_speed(10)
|
||||
get_node("hud/reset").set_text("")
|
||||
if Input.is_action_pressed("controls_thrust"):
|
||||
player.thrust = 1
|
||||
player.rpc_unreliable("set_thrust",1)
|
||||
elif Input.is_action_pressed("controls_break"):
|
||||
player.thrust = -1
|
||||
player.rpc_unreliable("set_thrust",-1)
|
||||
else:
|
||||
player.thrust = 0
|
||||
player.rpc_unreliable("set_thrust",0)
|
||||
|
||||
get_node("hud/speed_slider").set_value(player.current_speed * 1000)
|
||||
|
||||
|
||||
@@ -13,17 +13,17 @@ func _ready():
|
||||
connect("item_changed",preview,"_on_inventory_item_changed")
|
||||
|
||||
|
||||
func _physics_process(delta):
|
||||
func _process(delta):
|
||||
if is_network_master():
|
||||
if player != null:
|
||||
if not player.is_out && player.is_in_group("first"):
|
||||
if not player.is_out() && player.is_in_group("first"):
|
||||
get_node("../hud/inventory").show()
|
||||
if item == null:
|
||||
set_item()
|
||||
if preview.item:
|
||||
preview.item.show()
|
||||
if Input.is_action_just_pressed("controls_add_road"):
|
||||
route.rpc("add_road", roads[type][index], player.get_index())
|
||||
route.rpc("add_road", roads[type][index])
|
||||
if Input.is_action_just_pressed("controls_prev_road_type"):
|
||||
type -= 1
|
||||
if type < 0:
|
||||
|
||||
@@ -6,12 +6,12 @@ var player:Player
|
||||
var item:Road
|
||||
|
||||
|
||||
func _ready():
|
||||
func _ready():
|
||||
gamestate.game.route.connect("road_added",self,"_on_route_road_added")
|
||||
|
||||
|
||||
func _on_route_road_added(road):
|
||||
if is_network_master() && item:
|
||||
if is_network_master() && item && road:
|
||||
var transform = road.get_global_transform();
|
||||
var curve = road.get_curve()
|
||||
transform = transform.translated(curve.get_point_position(curve.get_point_count() -1))
|
||||
|
||||
+33
-15
@@ -109,9 +109,7 @@ func _physics_process(delta):
|
||||
torque_penalty = road.get_torque_penalty(penalty_index)
|
||||
force_penalty = road.get_force_penalty(penalty_index)
|
||||
path_penalty = road.get_path_penalty(penalty_index)
|
||||
is_out = true
|
||||
is_resetable = false
|
||||
timer.start()
|
||||
rpc("set_out")
|
||||
|
||||
check_position()
|
||||
else:
|
||||
@@ -173,11 +171,27 @@ func set_player_color(new_color):
|
||||
race_car.get_node("body").set_surface_material(1,material)
|
||||
|
||||
|
||||
func is_out():
|
||||
return is_out
|
||||
|
||||
|
||||
remotesync func set_out():
|
||||
is_out = true
|
||||
is_resetable = false
|
||||
timer.start()
|
||||
|
||||
|
||||
remotesync func set_in():
|
||||
is_out = false
|
||||
is_resetable = false
|
||||
|
||||
|
||||
remotesync func set_first(is_first:bool):
|
||||
if is_first:
|
||||
add_to_group("first")
|
||||
else:
|
||||
remove_from_group("first")
|
||||
if get_tree().get_rpc_sender_id() == 0 || get_tree().get_rpc_sender_id() == get_network_master():
|
||||
if is_first:
|
||||
add_to_group("first")
|
||||
else:
|
||||
remove_from_group("first")
|
||||
|
||||
|
||||
master func check_position():
|
||||
@@ -185,16 +199,24 @@ master func check_position():
|
||||
rset("slave_position", position)
|
||||
|
||||
|
||||
master func set_thrust(new_thrust:int):
|
||||
var sender_id = get_tree().get_rpc_sender_id()
|
||||
if is_network_master() || gamestate.game.get_player_by_network_id(sender_id) == self && [-1,0,1].has(new_thrust):
|
||||
thrust = new_thrust
|
||||
|
||||
|
||||
master func reset():
|
||||
if is_resetable:
|
||||
var sender_id = get_tree().get_rpc_sender_id()
|
||||
if (is_network_master() || gamestate.game.get_player_by_network_id(sender_id) == self) && is_resetable:
|
||||
has_next = false
|
||||
current_speed = 0
|
||||
|
||||
var road = race_car.road
|
||||
road.body.set_collision_layer_bit(get_index(),1)
|
||||
|
||||
while road.reset_index != 0:
|
||||
road = route.get_road(road.get_index() - road.reset_index)
|
||||
var reset_index = road.reset_index
|
||||
for i in range(reset_index):
|
||||
road = route.get_road(road.get_index() - 1)
|
||||
road.body.set_collision_layer_bit(get_index(),1)
|
||||
|
||||
path.curve.clear_points()
|
||||
@@ -213,11 +235,7 @@ master func reset():
|
||||
|
||||
follow.set_transform(road.get_transform())
|
||||
|
||||
is_out = false
|
||||
is_resetable = false
|
||||
return true
|
||||
else:
|
||||
return false
|
||||
rpc("set_in")
|
||||
|
||||
|
||||
func set_start(new_lane:int):
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
extends Node
|
||||
|
||||
export(float) var frames_per_second = 5.0
|
||||
|
||||
var is_active:bool = false
|
||||
var is_saving:bool = false
|
||||
|
||||
var _frametick = 1.0/frames_per_second
|
||||
var _thread:Thread
|
||||
|
||||
var images = []
|
||||
|
||||
|
||||
func _ready():
|
||||
_thread = Thread.new()
|
||||
|
||||
|
||||
func _process(delta):
|
||||
if Input.is_action_just_pressed("controls_capture") && not is_saving:
|
||||
is_active = not is_active
|
||||
find_node("recording").set_visible(is_active)
|
||||
if not is_active:
|
||||
is_saving = true
|
||||
find_node("saving").set_visible(true)
|
||||
_thread.start(self, "save_images")
|
||||
if is_active:
|
||||
_frametick += delta
|
||||
if (_frametick > 1.0/frames_per_second):
|
||||
get_viewport().set_clear_mode(Viewport.CLEAR_MODE_ONLY_NEXT_FRAME)
|
||||
var img = get_viewport().get_texture().get_data()
|
||||
img.flip_y()
|
||||
images.append(img)
|
||||
|
||||
|
||||
func save_images(userdata):
|
||||
var dir = Directory.new()
|
||||
var timestamp = OS.get_unix_time()
|
||||
if dir.open("user://capture/") != OK:
|
||||
dir.open("user://")
|
||||
dir.make_dir("capture")
|
||||
|
||||
dir.open("user://capture/")
|
||||
dir.make_dir(str(timestamp))
|
||||
|
||||
for img in images:
|
||||
img.save_png("user://capture/" + str(timestamp) + "/" + str(img) + ".png")
|
||||
|
||||
images = []
|
||||
is_saving = false
|
||||
find_node("saving").set_visible(false)
|
||||
|
||||
if(_thread.is_active()):
|
||||
_thread.wait_to_finish()
|
||||
Reference in New Issue
Block a user