Browse Source
fixed player count
fixed player count
61 changed files with 495 additions and 460 deletions
-
8default_env.tres
-
30project.godot
-
4resources/lanes/start/1.tres
-
4resources/lanes/start/2.tres
-
4resources/lanes/start/3.tres
-
4resources/lanes/start/4.tres
-
BINresources/ui/i18n.de.translation
-
BINresources/ui/i18n.en.translation
-
8scenes/game/Game.tscn
-
8scenes/menus/DirectHostMenu.tscn
-
13scenes/menus/DirectJoinMenu.tscn
-
2scenes/menus/MainMenu.tscn
-
1scenes/player/HumanPlayer.tscn
-
10scenes/player/Player.tscn
-
5scenes/road/roadBump.tscn
-
4scenes/road/roadCornerLarge.tscn
-
5scenes/road/roadCornerLargeFlipped.tscn
-
5scenes/road/roadCornerLarger.tscn
-
5scenes/road/roadCornerLargerFlipped.tscn
-
6scenes/road/roadCornerSmall.tscn
-
6scenes/road/roadCornerSmallFlipped.tscn
-
11scenes/road/roadCurved.tscn
-
11scenes/road/roadCurvedFlipped.tscn
-
6scenes/road/roadLoop.tscn
-
3scenes/road/roadRamp.tscn
-
2scenes/road/roadRampFlipped.tscn
-
3scenes/road/roadRampLong.tscn
-
3scenes/road/roadRampLongCurved.tscn
-
2scenes/road/roadRampLongCurvedFlipped.tscn
-
2scenes/road/roadRampLongFlipped.tscn
-
2scenes/road/roadStraight.tscn
-
2scenes/road/roadStraightLong.tscn
-
9scenes/road/roadStraightLongBump.tscn
-
5scenes/road/roadStraightSkew.tscn
-
5scenes/road/roadStraightSkewFlipped.tscn
-
170scripts/game/game.gd
-
152scripts/game/gamestate.gd
-
6scripts/game/local_storage.gd
-
6scripts/game/route.gd
-
59scripts/game/world.gd
-
4scripts/menus/direct_host.gd
-
13scripts/menus/direct_join.gd
-
2scripts/menus/ingame.gd
-
18scripts/menus/lobby.gd
-
2scripts/menus/main.gd
-
2scripts/menus/server.gd
-
2scripts/menus/server_create.gd
-
8scripts/networking/client.gd
-
4scripts/networking/game_server.gd
-
47scripts/networking/server.gd
-
10scripts/player/base_inventory.gd
-
46scripts/player/base_player.gd
-
46scripts/player/bot_controls.gd
-
2scripts/player/bot_inventory.gd
-
4scripts/player/human_controls.gd
-
3scripts/player/human_inventory.gd
-
10scripts/player/inventory_preview.gd
-
99scripts/player/player.gd
-
4scripts/player/race_car.gd
-
27scripts/road/road.gd
-
1scripts/road/roads_factory.gd
@ -1,9 +1,15 @@ |
|||
[gd_resource type="Environment" load_steps=2 format=2] |
|||
|
|||
[sub_resource type="ProceduralSky" id=1] |
|||
sky_top_color = Color( 1, 0.945098, 0.65098, 1 ) |
|||
sky_horizon_color = Color( 0.984314, 0.956863, 0.898039, 1 ) |
|||
ground_bottom_color = Color( 0, 0, 0, 1 ) |
|||
ground_horizon_color = Color( 0.321569, 0.321569, 0.321569, 1 ) |
|||
ground_curve = 0.00594603 |
|||
sun_color = Color( 0.980392, 0.815686, 0.376471, 1 ) |
|||
|
|||
[resource] |
|||
background_mode = 2 |
|||
background_sky = SubResource( 1 ) |
|||
ambient_light_color = Color( 1, 1, 1, 1 ) |
|||
ambient_light_color = Color( 1, 0.980392, 0.929412, 1 ) |
|||
ambient_light_sky_contribution = 0.0 |
@ -1,13 +1,18 @@ |
|||
[gd_scene load_steps=3 format=2] |
|||
[gd_scene load_steps=4 format=2] |
|||
|
|||
[ext_resource path="res://assets/road/roadCurved.obj" type="ArrayMesh" id=1] |
|||
[ext_resource path="res://resources/road/roadCurved.tres" type="Curve3D" id=2] |
|||
[ext_resource path="res://scripts/road/road.gd" type="Script" id=2] |
|||
[ext_resource path="res://resources/road/roadCurved.tres" type="Curve3D" id=3] |
|||
|
|||
[node name="roadCurved" type="MeshInstance"] |
|||
mesh = ExtResource( 1 ) |
|||
material/0 = null |
|||
material/1 = null |
|||
material/2 = null |
|||
script = ExtResource( 2 ) |
|||
speed_constrains = PoolVector3Array( 0, 0.5, 0.14, 1.5, 2, 0.14 ) |
|||
force_penalties = PoolVector3Array( 0, 0, 4 ) |
|||
torque_penalties = PoolVector3Array( 0, 0, 2 ) |
|||
|
|||
[node name="Path" type="Path" parent="."] |
|||
curve = ExtResource( 2 ) |
|||
curve = ExtResource( 3 ) |
@ -1,13 +1,18 @@ |
|||
[gd_scene load_steps=3 format=2] |
|||
[gd_scene load_steps=4 format=2] |
|||
|
|||
[ext_resource path="res://assets/road/roadCurvedFlipped.obj" type="ArrayMesh" id=1] |
|||
[ext_resource path="res://resources/road/roadCurvedFlipped.tres" type="Curve3D" id=2] |
|||
[ext_resource path="res://scripts/road/road.gd" type="Script" id=2] |
|||
[ext_resource path="res://resources/road/roadCurvedFlipped.tres" type="Curve3D" id=3] |
|||
|
|||
[node name="roadCurvedFlipped" type="MeshInstance"] |
|||
mesh = ExtResource( 1 ) |
|||
material/0 = null |
|||
material/1 = null |
|||
material/2 = null |
|||
script = ExtResource( 2 ) |
|||
speed_constrains = PoolVector3Array( 0, 0.5, 0.14, 1.5, 2, 0.14 ) |
|||
force_penalties = PoolVector3Array( 0, 0, 4 ) |
|||
torque_penalties = PoolVector3Array( 0, 0, 2 ) |
|||
|
|||
[node name="Path" type="Path" parent="."] |
|||
curve = ExtResource( 2 ) |
|||
curve = ExtResource( 3 ) |
@ -1,150 +1,50 @@ |
|||
extends Node |
|||
extends Spatial |
|||
|
|||
const MAX_PEERS = 4 |
|||
const LOBBY_READY_WAIT_TIME = 3 |
|||
class_name Game |
|||
|
|||
var World = preload("res://scenes/game/World.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 players:Array |
|||
var route:Route |
|||
var first:Player |
|||
var last:Player |
|||
|
|||
var players = {} |
|||
const REMOVE_LAST = 2 |
|||
|
|||
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() |
|||
func _ready(): |
|||
route = get_node("route") |
|||
if is_network_master(): |
|||
route.rpc("add_road",roads_factory.START, -1) |
|||
|
|||
|
|||
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) |
|||
func _physics_process(delta): |
|||
if is_network_master(): |
|||
set_player_order() |
|||
check_autotrack() |
|||
|
|||
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 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 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) |
|||
|
|||
func new_first(player): |
|||
if first != null: |
|||
first.rpc("set_first",false) |
|||
first = player |
|||
first.rpc("set_first",true) |
|||
|
|||
remotesync func remove_player(id): |
|||
players.erase(id) |
|||
|
|||
if has_node("/root/world"): |
|||
var world = get_node("/root/world") |
|||
var world_players = world.get_node("players") |
|||
if world_players.has_node(str(id)): |
|||
world_players.remove_child(world_players.get_node(str(id))) |
|||
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) |
|||
|
|||
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) |
|||
|
|||
var world = World.instance() |
|||
get_tree().get_root().add_child(world) |
|||
|
|||
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)) |
|||
player_scene.set_player_name(player.name) |
|||
player_scene.set_player_color(player.color) |
|||
world.get_node("players").add_child(player_scene) |
|||
|
|||
if p_id == get_tree().get_network_unique_id(): |
|||
controls = HumanPlayer.instance() |
|||
controls.set_name("HumanControl_" + str(p_id)) |
|||
world.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)) |
|||
player_scene.set_player_color(Color(randf(),randf(),randf())) |
|||
world.get_node("players").add_child(player_scene) |
|||
player_scene.add_to_group("bots") |
|||
if get_tree().is_network_server(): |
|||
var bot = BotPlayer.instance() |
|||
bot.set_name("bot" + str(bot_index)) |
|||
world.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 has_node("/root/world"): |
|||
get_node("/root/world").queue_free() |
|||
|
|||
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") |
|||
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") |
@ -1,59 +0,0 @@ |
|||
extends Spatial |
|||
|
|||
var players:Array |
|||
var route:Route |
|||
var first:Player |
|||
var last:Player |
|||
|
|||
const REMOVE_LAST = 1 |
|||
|
|||
|
|||
func _ready(): |
|||
route = get_node("route") |
|||
if is_network_master(): |
|||
route.rpc("add_road","Start", -1) |
|||
|
|||
func _physics_process(delta): |
|||
if is_network_master(): |
|||
set_player_order() |
|||
#destroy_after_last() |
|||
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) |
|||
var p_id = first.get_network_master() |
|||
route.rpc("set_network_master",p_id) |
|||
|
|||
|
|||
func destroy_after_last(): |
|||
if last != null: |
|||
if last.position.x != -1: |
|||
var max_index = last.position.x - REMOVE_LAST |
|||
if max_index > 0: |
|||
for i in range(max_index): |
|||
route.rpc("remove_road", i) |
|||
|
|||
|
|||
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 |
@ -1,46 +0,0 @@ |
|||
extends Node |
|||
|
|||
class_name BasePlayer |
|||
|
|||
export var player_color:Color |
|||
var player_name:String |
|||
|
|||
var is_out:bool = false |
|||
var position:Vector2 |
|||
var road_index:int = -1 |
|||
|
|||
puppet var slave_position:Vector2 |
|||
|
|||
|
|||
func get_race_car(): |
|||
pass |
|||
|
|||
|
|||
func get_player_name(): |
|||
return player_name |
|||
|
|||
|
|||
func set_player_name(new_name): |
|||
player_name = new_name |
|||
|
|||
|
|||
func get_player_color(): |
|||
return player_color |
|||
|
|||
|
|||
func set_player_color(new_color): |
|||
player_color = new_color |
|||
var material = SpatialMaterial.new() |
|||
material.set_albedo(player_color) |
|||
get_race_car().get_node("body").set_surface_material(1,material) |
|||
|
|||
|
|||
func set_start(position:int): |
|||
pass |
|||
|
|||
|
|||
remotesync func set_first(is_first:bool): |
|||
if is_first: |
|||
add_to_group("first") |
|||
else: |
|||
remove_from_group("first") |
Write
Preview
Loading…
Cancel
Save
Reference in new issue