From 4e7fe7a26cf43c652c4ee2c199527d8e28aa2da9 Mon Sep 17 00:00:00 2001 From: Lurkars Date: Wed, 24 Jul 2019 08:46:03 +0200 Subject: [PATCH] fixed player count --- default_env.tres | 8 +- project.godot | 30 ++-- resources/lanes/start/1.tres | 4 +- resources/lanes/start/2.tres | 4 +- resources/lanes/start/3.tres | 4 +- resources/lanes/start/4.tres | 4 +- resources/ui/i18n.de.translation | Bin 3372 -> 3372 bytes resources/ui/i18n.en.translation | Bin 3101 -> 3101 bytes scenes/game/{World.tscn => Game.tscn} | 8 +- scenes/menus/DirectHostMenu.tscn | 8 +- scenes/menus/DirectJoinMenu.tscn | 13 +- scenes/menus/MainMenu.tscn | 2 +- scenes/player/HumanPlayer.tscn | 1 - scenes/player/Player.tscn | 10 +- scenes/road/roadBump.tscn | 5 +- scenes/road/roadCornerLarge.tscn | 4 +- scenes/road/roadCornerLargeFlipped.tscn | 5 +- scenes/road/roadCornerLarger.tscn | 5 +- scenes/road/roadCornerLargerFlipped.tscn | 5 +- scenes/road/roadCornerSmall.tscn | 6 +- scenes/road/roadCornerSmallFlipped.tscn | 6 +- scenes/road/roadCurved.tscn | 11 +- scenes/road/roadCurvedFlipped.tscn | 11 +- scenes/road/roadLoop.tscn | 6 +- scenes/road/roadRamp.tscn | 3 + scenes/road/roadRampFlipped.tscn | 2 + scenes/road/roadRampLong.tscn | 3 + scenes/road/roadRampLongCurved.tscn | 3 + scenes/road/roadRampLongCurvedFlipped.tscn | 2 + scenes/road/roadRampLongFlipped.tscn | 2 + scenes/road/roadStraight.tscn | 2 + scenes/road/roadStraightLong.tscn | 2 + scenes/road/roadStraightLongBump.tscn | 9 ++ scenes/road/roadStraightSkew.tscn | 5 + scenes/road/roadStraightSkewFlipped.tscn | 5 + scripts/game/game.gd | 170 +++++---------------- scripts/game/gamestate.gd | 152 ++++++++++++++++++ scripts/game/local_storage.gd | 6 +- scripts/game/route.gd | 8 +- scripts/game/world.gd | 59 ------- scripts/menus/direct_host.gd | 4 +- scripts/menus/direct_join.gd | 17 +-- scripts/menus/ingame.gd | 2 +- scripts/menus/lobby.gd | 18 +-- scripts/menus/main.gd | 2 +- scripts/menus/server.gd | 2 +- scripts/menus/server_create.gd | 2 +- scripts/networking/client.gd | 8 +- scripts/networking/game_server.gd | 4 +- scripts/networking/server.gd | 49 +++--- scripts/player/base_inventory.gd | 10 +- scripts/player/base_player.gd | 46 ------ scripts/player/bot_controls.gd | 46 +++--- scripts/player/bot_inventory.gd | 2 +- scripts/player/human_controls.gd | 4 +- scripts/player/human_inventory.gd | 3 +- scripts/player/inventory_preview.gd | 10 +- scripts/player/player.gd | 101 ++++++++---- scripts/player/race_car.gd | 4 +- scripts/road/road.gd | 27 +++- scripts/road/roads_factory.gd | 1 + 61 files changed, 495 insertions(+), 460 deletions(-) rename scenes/game/{World.tscn => Game.tscn} (67%) create mode 100644 scripts/game/gamestate.gd delete mode 100644 scripts/game/world.gd delete mode 100644 scripts/player/base_player.gd diff --git a/default_env.tres b/default_env.tres index ff6e4b2..6d6e3e0 100644 --- a/default_env.tres +++ b/default_env.tres @@ -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 diff --git a/project.godot b/project.godot index 4f7b21b..506edfd 100644 --- a/project.godot +++ b/project.godot @@ -14,10 +14,10 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://scripts/player/base_inventory.gd" }, { -"base": "Node", -"class": "BasePlayer", +"base": "Spatial", +"class": "Game", "language": "GDScript", -"path": "res://scripts/player/base_player.gd" +"path": "res://scripts/game/game.gd" }, { "base": "Spatial", "class": "GameServer", @@ -29,7 +29,7 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://scripts/networking/game_server_requests.gd" }, { -"base": "BasePlayer", +"base": "Node", "class": "Player", "language": "GDScript", "path": "res://scripts/player/player.gd" @@ -61,7 +61,7 @@ _global_script_classes=[ { } ] _global_script_class_icons={ "BaseInventory": "", -"BasePlayer": "", +"Game": "", "GameServer": "", "GameServerRequests": "", "Player": "", @@ -81,7 +81,7 @@ config/icon="res://icon.png" [autoload] -game="*res://scripts/game/game.gd" +gamestate="*res://scripts/game/gamestate.gd" client="*res://scripts/networking/client.gd" server="*res://scripts/networking/server.gd" game_server="*res://scripts/networking/game_server.gd" @@ -89,13 +89,6 @@ roads_factory="*res://scripts/road/roads_factory.gd" local_storage="*res://scripts/game/local_storage.gd" Util="*res://scripts/Util.gd" -[display] - -window/size/width=1920 -window/size/height=1080 -window/size/resizable=false -window/size/fullscreen=true - [input] ui_cancel={ @@ -175,12 +168,11 @@ debug_camera_4={ [layer_names] -3d_physics/layer_1="basic" -3d_physics/layer_2="player_1" -3d_physics/layer_3="player_2" -3d_physics/layer_4="player_3" -3d_physics/layer_5="player_4" -3d_physics/layer_6="preview" +3d_physics/layer_1="player_1" +3d_physics/layer_2="player_2" +3d_physics/layer_3="player_3" +3d_physics/layer_4="player_4" +3d_physics/layer_5="preview" [locale] diff --git a/resources/lanes/start/1.tres b/resources/lanes/start/1.tres index cf76ceb..9a717c3 100644 --- a/resources/lanes/start/1.tres +++ b/resources/lanes/start/1.tres @@ -2,6 +2,6 @@ [resource] _data = { -"points": PoolVector3Array( 0, 0, 0, 0, 0, 1.14889, -0.08757, 0, 1.70223, 0, 0, -1.14889, 0, 0, 0, 0, 0, 4 ), -"tilts": PoolRealArray( 0, 0 ) +"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.14889, -0.08757, 0, 1.70223, 0, 0, -1.14889, 0, 0, 0, 0, 0, 4 ), +"tilts": PoolRealArray( 0, 0, 1.13505e-43 ) } diff --git a/resources/lanes/start/2.tres b/resources/lanes/start/2.tres index c228382..c37acb3 100644 --- a/resources/lanes/start/2.tres +++ b/resources/lanes/start/2.tres @@ -2,6 +2,6 @@ [resource] _data = { -"points": PoolVector3Array( 0, 0, 0, 0, 0, 1.91243, 0.08757, 0, 1.20223, 0, 0, -1.91243, 0, 0, 0, 0, 0, 4 ), -"tilts": PoolRealArray( 0, 0 ) +"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.91243, 0.08757, 0, 1.20223, 0, 0, -1.91243, 0, 0, 0, 0, 0, 4 ), +"tilts": PoolRealArray( 0, 0, 1.13505e-43 ) } diff --git a/resources/lanes/start/3.tres b/resources/lanes/start/3.tres index 3e50963..feeb8e1 100644 --- a/resources/lanes/start/3.tres +++ b/resources/lanes/start/3.tres @@ -2,6 +2,6 @@ [resource] _data = { -"points": PoolVector3Array( 0, 0, 0, 0, 0, 1.78621, 0.0824, 0, 0.702227, 0, 0, -1.78621, 0, 0, 0, 0, 0, 4 ), -"tilts": PoolRealArray( 0, 0 ) +"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.78621, 0.0824, 0, 0.702227, 0, 0, -1.78621, 0, 0, 0, 0, 0, 4 ), +"tilts": PoolRealArray( 0, 0, 1.13505e-43 ) } diff --git a/resources/lanes/start/4.tres b/resources/lanes/start/4.tres index a7a0a56..14a7b8d 100644 --- a/resources/lanes/start/4.tres +++ b/resources/lanes/start/4.tres @@ -2,6 +2,6 @@ [resource] _data = { -"points": PoolVector3Array( 0, 0, 0, 0, 0, 1.79777, -0.0824, 0, 0.202227, 0, 0, -1.79777, 0, 0, 0, 0, 0, 4 ), -"tilts": PoolRealArray( 0, 0 ) +"points": PoolVector3Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.79777, -0.0824, 0, 0.202227, 0, 0, -1.79777, 0, 0, 0, 0, 0, 4 ), +"tilts": PoolRealArray( 0, 0, 1.13505e-43 ) } diff --git a/resources/ui/i18n.de.translation b/resources/ui/i18n.de.translation index fc9d2e70027cae9220e97c825ad7c26e6e4429a8..1d5cb449450ea47c0993207f6fb61f5f9204a71c 100644 GIT binary patch literal 3372 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 literal 3101 zcmbtXc}!Gi5dS!&vZ5f?t>}WgphQ{--WNpUiJ~l2NQ`J*mgRxKUhLb&qQ(@|ih`Be zcxxh6yu~}x5KX;mqiL&Yt%};%HmygRs@PhU^wHleZ|n={e|^bh=J)$%=9`)Cdyi#S z_N+-leS)9^Af$UjvZh((1vwt8Q?^^Z#V#kP|Mzr7cpr#Il3hNJO|sZsHmlv@by;Ma zs3uWJqF-d$Z(Y( zr|QYj>8hQj>RjkN)uz}I*lx%oNVSIl2=*owf2!g4YV1bXO^|bttB~&@cOaDaS5=e! z8|+pU(}@#Dj}CSOM6Ys2=y=uc@Mv#O)Zn48M{6+oOaz{$a%NTMs5%!qPqoRn5Vl=| zi7N+Q0;z&jL)JmIL1?W})m>1#5pn`J5E@F9txc-G3r#nJmNSv z#L@aU7wb;jV9;4pevY~K>W3>&0T{C$^3Z&TW*r8hdrNV&mXp&pK!K(lBq8ZiGTmao z4Snd@Dcd$^&a)|I+txbrgU|)%erlf|9MKC-oTta=nugw3W-I!oGzKTe~sod`dx z$@@pao(3$xo>N5ajwcs@xenG7*4w@q0KoI)x|@z)D!&e%YNWo~PQQD24lwmi!hT1N zMn%m8;JUj+Nz?Yhk1+Yc^owrXik9~QXtp$a=6C#@c69@A=W}j*vUuqL@RWzXT5T11 z$1Xy5uJgxxUk@$B{>=aVUF@p+NKSjxK0Kc>pU;bZ0L=U6wnmTa4?m8ZTebYzWvtUo zdqKFqpM5z+(tPWbNx#n1v;o!!XyLCUzVpsbN$D1Yj$o2=6Uh?oVy%2XFhn&mvY>F;2ljI z^NlO!Zb<;3UPzelzIsq?k;>DZ|*jTV=O{)cD>S|6#L6WoBa&K0nU0&YaeE6Mob$&6Vr8wXVff2`4&hx~I)y3&#Hh z%zhl75na5n1nYcHncx3pQBxlP;dW0#Jl;JRn&-iOFOzSjQxMfbXCpms zm0v(}e*VrkKc6%30C?()_Bs|>G0zPreori`yepEChwo{4$(il+_mb90IN!lQ*UD=E zl$V6gygy_KV)L!GQZYSC2$Lm95lWV6_oy_bG%(xgbSlD^CF^yH(1(PiPE~~e*V3?< zlwi9eGOD_!L?S>}Xz1I`<2T(dk5^Qh3~|jFiddBsAN&%3qe8AGz<+({BSlQGOCGOD zybL>(&>k>oa^MBs=JtRDp-k#uV_1`r82n^ndw@xpbn!^vGi(=<3sa&=7pVxjLiS1y zp=)kE9h{Wf5HcYY8+QN^p9;Ss`W;6Mii-1v)r6sR{o9K06c;V<8s$=Hp_rYhE|?x< zBLa=Pys{|s6?=t}-S2+GKwoH$VM-q=!QZDPC_M+Q%hqxUKl>bRQ7TpByR4o9;jud0 zMxUGZ`znyLW@N_s=i;Bo>_ilAmkQObX&$;mo94$Sq1KeD)ItLi8%)0le}umO_Sdzg znjCezdSqWk<*yq_tumxrP;t$x!?b{T^<6$4!BjO>Tk|T;k=eB`cFgxk)>2_DC=mWU zLZ$r&OXs4LgoIP;h7GQmDxTwOLuES#ir&VZ5AHZ(6!>p7!%{ZViA;BvTkXXK#_3t* z!;RPxzqVzQC~;M|tpy?}UZ0-2D!ZQ|3Z#5rk#UL{E5%NsnDc1JYu4sj!u+Mr!aoN8 E0BpXU*8l(j diff --git a/scenes/game/World.tscn b/scenes/game/Game.tscn similarity index 67% rename from scenes/game/World.tscn rename to scenes/game/Game.tscn index b99d0cf..53c84ff 100644 --- a/scenes/game/World.tscn +++ b/scenes/game/Game.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=3 format=2] -[ext_resource path="res://scripts/game/world.gd" type="Script" id=1] +[ext_resource path="res://scripts/game/game.gd" type="Script" id=1] [ext_resource path="res://scripts/game/route.gd" type="Script" id=2] -[node name="world" type="Spatial"] +[node name="game" type="Spatial"] script = ExtResource( 1 ) [node name="route" type="Spatial" parent="."] @@ -12,8 +12,8 @@ script = ExtResource( 2 ) [node name="players" type="Spatial" parent="."] [node name="sun" type="DirectionalLight" parent="."] -transform = Transform( 0.324827, 0.775291, 0.541675, -0.754407, -0.133022, 0.642788, 0.570402, -0.617438, 0.541675, 0, 100, 0 ) +transform = Transform( 0.324827, 0.775291, 0.541675, -0.754407, -0.133022, 0.642788, 0.570402, -0.617438, 0.541675, 0, 0, 0 ) visible = false -light_energy = 5.0 +light_color = Color( 0.921569, 0.741176, 0.368627, 1 ) directional_shadow_mode = 1 directional_shadow_max_distance = 25.0 diff --git a/scenes/menus/DirectHostMenu.tscn b/scenes/menus/DirectHostMenu.tscn index 78c6716..8db59f1 100644 --- a/scenes/menus/DirectHostMenu.tscn +++ b/scenes/menus/DirectHostMenu.tscn @@ -43,15 +43,16 @@ margin_right = 65.0 margin_bottom = 33.0 text = "PORT" -[node name="port" type="LineEdit" parent="menu/GridContainer"] +[node name="port" type="SpinBox" parent="menu/GridContainer"] margin_left = 69.0 margin_right = 266.0 margin_bottom = 40.0 focus_neighbour_right = NodePath("../bots") focus_neighbour_bottom = NodePath("../../back") size_flags_horizontal = 3 -text = "8128" -max_length = 5 +max_value = 65535.0 +value = 8128.0 +align = 2 [node name="bots" type="CheckButton" parent="menu/GridContainer"] margin_left = 270.0 @@ -90,6 +91,5 @@ custom_fonts/font = ExtResource( 3 ) text = "BACK" icon = ExtResource( 5 ) flat = true -[connection signal="text_changed" from="menu/GridContainer/port" to="." method="_on_port_text_changed"] [connection signal="pressed" from="menu/host" to="." method="_on_host_pressed"] [connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"] diff --git a/scenes/menus/DirectJoinMenu.tscn b/scenes/menus/DirectJoinMenu.tscn index 40b9a00..cfd6fb2 100644 --- a/scenes/menus/DirectJoinMenu.tscn +++ b/scenes/menus/DirectJoinMenu.tscn @@ -62,17 +62,16 @@ size_flags_vertical = 1 text = "PORT" valign = 1 -[node name="port" type="LineEdit" parent="menu/GridContainer"] +[node name="port" type="SpinBox" parent="menu/GridContainer"] margin_left = 69.0 margin_top = 41.0 margin_right = 407.0 margin_bottom = 78.0 focus_neighbour_top = NodePath("../ip") focus_neighbour_bottom = NodePath("../../join") -text = "8128" -max_length = 5 -caret_blink = true -caret_blink_speed = 0.5 +max_value = 65535.0 +value = 8128.0 +align = 2 [node name="join" type="Button" parent="menu"] anchor_left = 1.0 @@ -103,9 +102,5 @@ custom_fonts/font = ExtResource( 3 ) text = "BACK" icon = ExtResource( 5 ) flat = true - -[node name="error_dialog" type="AcceptDialog" parent="."] -margin_right = 138.0 -margin_bottom = 84.0 [connection signal="pressed" from="menu/join" to="." method="_on_join_pressed"] [connection signal="pressed" from="menu/back" to="." method="_on_back_pressed"] diff --git a/scenes/menus/MainMenu.tscn b/scenes/menus/MainMenu.tscn index 424ce5d..b89a270 100644 --- a/scenes/menus/MainMenu.tscn +++ b/scenes/menus/MainMenu.tscn @@ -83,8 +83,8 @@ margin_right = 138.0 margin_bottom = 84.0 window_title = "ALERT" dialog_text = "Server disconnected!" -[connection signal="pressed" from="menu/GridContainer/multiplayer" to="." method="_on_online_pressed"] [connection signal="pressed" from="menu/GridContainer/multiplayer" to="." method="_on_multiplayer_pressed"] +[connection signal="pressed" from="menu/GridContainer/multiplayer" to="." method="_on_online_pressed"] [connection signal="pressed" from="menu/GridContainer/practice" to="." method="_on_practice_pressed"] [connection signal="pressed" from="menu/GridContainer/settings" to="." method="_on_settings_pressed"] [connection signal="pressed" from="menu/GridContainer/quit" to="." method="_on_quit_pressed"] diff --git a/scenes/player/HumanPlayer.tscn b/scenes/player/HumanPlayer.tscn index 4c54fac..bf8aa37 100644 --- a/scenes/player/HumanPlayer.tscn +++ b/scenes/player/HumanPlayer.tscn @@ -90,7 +90,6 @@ uppercase = true visible = false [node name="inventory" type="Spatial" parent="."] -editor/display_folded = true script = ExtResource( 5 ) [node name="viewport" type="Viewport" parent="inventory"] diff --git a/scenes/player/Player.tscn b/scenes/player/Player.tscn index 79c87c9..3ece485 100644 --- a/scenes/player/Player.tscn +++ b/scenes/player/Player.tscn @@ -30,11 +30,10 @@ v_offset = 0.015 rotation_mode = 4 loop = false -[node name="raceCar" type="RigidBody" parent="Path/PathFollow"] -mass = 40.0 -axis_lock_angular_x = true -axis_lock_angular_y = true -axis_lock_angular_z = true +[node name="raceCar" type="KinematicBody" parent="Path/PathFollow"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +collision_layer = 31 +collision_mask = 31 script = ExtResource( 2 ) [node name="body" type="MeshInstance" parent="Path/PathFollow/raceCar"] @@ -79,6 +78,7 @@ transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0.3, transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.075, 0.2 ) enabled = true cast_to = Vector3( 0, -0.2, 0 ) +collision_mask = 0 [node name="ResetTimer" type="Timer" parent="."] wait_time = 3.0 diff --git a/scenes/road/roadBump.tscn b/scenes/road/roadBump.tscn index daa388f..3be7c6a 100644 --- a/scenes/road/roadBump.tscn +++ b/scenes/road/roadBump.tscn @@ -12,8 +12,9 @@ material/1 = null material/2 = null script = ExtResource( 2 ) reset_index = 1 -speed_constrains = PoolVector3Array( 0.45, 0.8, 0.09, 0.45, 0.8, -0.02, 1.15, 1.55, 0.09 ) -force_penalties = PoolVector3Array( 0, 30, 20, 0, 0, -30, 0, 20, 20 ) +speed_constrains = PoolVector3Array( 0.45, 0.8, 0.12, 0.45, 0.8, -0.02, 1.15, 1.55, 0.12 ) +force_penalties = PoolVector3Array( 0, 5, 10, 0, 0, 0, 0, 0, 7 ) +path_penalties = [ 0.0, 0.5 ] [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadCornerLarge.tscn b/scenes/road/roadCornerLarge.tscn index 587c5a4..cbd6b15 100644 --- a/scenes/road/roadCornerLarge.tscn +++ b/scenes/road/roadCornerLarge.tscn @@ -12,8 +12,8 @@ material/2 = null script = ExtResource( 2 ) end_rotation = Vector3( 0, -1.571, 0 ) speed_constrains = PoolVector3Array( 0.2, 0.6, 0.13, 0.6, 1.5, 0.1, 1.5, 2.36, 0.13 ) -force_penalties = PoolVector3Array( 0, 0, 50 ) -torque_penalties = PoolVector3Array( 0, 0, 2 ) +force_penalties = PoolVector3Array( 2, 0, 8 ) +torque_penalties = PoolVector3Array( 0.5, 0.1, 0.1 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadCornerLargeFlipped.tscn b/scenes/road/roadCornerLargeFlipped.tscn index 44a389b..495a527 100644 --- a/scenes/road/roadCornerLargeFlipped.tscn +++ b/scenes/road/roadCornerLargeFlipped.tscn @@ -11,10 +11,9 @@ material/1 = null material/2 = null script = ExtResource( 2 ) end_rotation = Vector3( 0, 1.571, 0 ) -end_rotation_phi = 1.571 speed_constrains = PoolVector3Array( 0.2, 0.6, 0.13, 0.6, 1.5, 0.1, 1.5, 2.36, 0.13 ) -force_penalties = PoolVector3Array( 0, 0, 50 ) -torque_penalties = PoolVector3Array( 0, 0, -2 ) +force_penalties = PoolVector3Array( 1, 0, 5 ) +torque_penalties = PoolVector3Array( 0, 1, 1.5 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadCornerLarger.tscn b/scenes/road/roadCornerLarger.tscn index 2c803c6..9d10b68 100644 --- a/scenes/road/roadCornerLarger.tscn +++ b/scenes/road/roadCornerLarger.tscn @@ -11,10 +11,9 @@ material/1 = null material/2 = null script = ExtResource( 2 ) end_rotation = Vector3( 0, -1.571, 0 ) -end_rotation_phi = -1.571 speed_constrains = PoolVector3Array( 0.3, 1, 0.16, 1, 2.7, 0.13, 2.7, 3.93, 0.16 ) -force_penalties = PoolVector3Array( 0, 0, 50 ) -torque_penalties = PoolVector3Array( 0, 0, 2 ) +force_penalties = PoolVector3Array( 0, 0, 5 ) +torque_penalties = PoolVector3Array( 0, 0, 1 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadCornerLargerFlipped.tscn b/scenes/road/roadCornerLargerFlipped.tscn index 769788d..9862dce 100644 --- a/scenes/road/roadCornerLargerFlipped.tscn +++ b/scenes/road/roadCornerLargerFlipped.tscn @@ -11,10 +11,9 @@ material/1 = null material/2 = null script = ExtResource( 2 ) end_rotation = Vector3( 0, 1.571, 0 ) -end_rotation_phi = 1.571 speed_constrains = PoolVector3Array( 0.3, 1, 0.16, 1, 2.7, 0.13, 2.7, 3.93, 0.16 ) -force_penalties = PoolVector3Array( 0, 0, 50 ) -torque_penalties = PoolVector3Array( 0, 0, -2 ) +force_penalties = PoolVector3Array( 0, 0, 5 ) +torque_penalties = PoolVector3Array( 0, 0, -1 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadCornerSmall.tscn b/scenes/road/roadCornerSmall.tscn index 7331352..00935f2 100644 --- a/scenes/road/roadCornerSmall.tscn +++ b/scenes/road/roadCornerSmall.tscn @@ -11,9 +11,9 @@ material/1 = null material/2 = null script = ExtResource( 2 ) end_rotation = Vector3( 0, -1.571, 0 ) -speed_constrains = PoolVector3Array( 0.1, 0.79, 0.07 ) -force_penalties = PoolVector3Array( 0, 0, 50 ) -torque_penalties = PoolVector3Array( 0, 0, 2 ) +speed_constrains = PoolVector3Array( 0.1, 0.79, 0.08 ) +force_penalties = PoolVector3Array( 0, 0, 5 ) +torque_penalties = PoolVector3Array( 0, 0, 1 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadCornerSmallFlipped.tscn b/scenes/road/roadCornerSmallFlipped.tscn index 2a5a83f..4b6ffb9 100644 --- a/scenes/road/roadCornerSmallFlipped.tscn +++ b/scenes/road/roadCornerSmallFlipped.tscn @@ -11,9 +11,9 @@ material/1 = null material/2 = null script = ExtResource( 2 ) end_rotation = Vector3( 0, 1.571, 0 ) -speed_constrains = PoolVector3Array( 0.1, 0.79, 0.07 ) -force_penalties = PoolVector3Array( 0, 0, 50 ) -torque_penalties = PoolVector3Array( 0, 0, -2 ) +speed_constrains = PoolVector3Array( 0.1, 0.79, 0.08 ) +force_penalties = PoolVector3Array( 0, 0, 5 ) +torque_penalties = PoolVector3Array( 0, 0, -1 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadCurved.tscn b/scenes/road/roadCurved.tscn index de80405..044cc94 100644 --- a/scenes/road/roadCurved.tscn +++ b/scenes/road/roadCurved.tscn @@ -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 ) diff --git a/scenes/road/roadCurvedFlipped.tscn b/scenes/road/roadCurvedFlipped.tscn index 1a796e3..ba6ca31 100644 --- a/scenes/road/roadCurvedFlipped.tscn +++ b/scenes/road/roadCurvedFlipped.tscn @@ -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 ) diff --git a/scenes/road/roadLoop.tscn b/scenes/road/roadLoop.tscn index d742090..634f12c 100644 --- a/scenes/road/roadLoop.tscn +++ b/scenes/road/roadLoop.tscn @@ -12,9 +12,9 @@ material/1 = null material/2 = null script = ExtResource( 2 ) reset_index = 2 -speed_constrains = PoolVector3Array( 2.5, 4.8, -0.1, 4.8, 7.6, -0.13 ) -force_penalties = PoolVector3Array( 0, 1, -20, 0, -10, -10 ) -torque_penalties = PoolVector3Array( 0, 0, 0 ) +speed_constrains = PoolVector3Array( 2.5, 4.8, -0.09, 4.8, 7.6, -0.13 ) +force_penalties = PoolVector3Array( 0, 0, 0, 0, -1, -0.1 ) +path_penalties = [ 5.0 ] [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadRamp.tscn b/scenes/road/roadRamp.tscn index 35a3a04..72941b8 100644 --- a/scenes/road/roadRamp.tscn +++ b/scenes/road/roadRamp.tscn @@ -10,6 +10,9 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +reset_index = 1 +speed_constrains = PoolVector3Array( 0, 1, -0.05 ) +path_penalties = [ 1.0 ] [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadRampFlipped.tscn b/scenes/road/roadRampFlipped.tscn index d3612e5..bf8b49c 100644 --- a/scenes/road/roadRampFlipped.tscn +++ b/scenes/road/roadRampFlipped.tscn @@ -10,6 +10,8 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +speed_constrains = PoolVector3Array( 0, 0.3, 0.12 ) +force_penalties = PoolVector3Array( 0, 0, 4 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadRampLong.tscn b/scenes/road/roadRampLong.tscn index d746319..4095b27 100644 --- a/scenes/road/roadRampLong.tscn +++ b/scenes/road/roadRampLong.tscn @@ -10,6 +10,9 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +reset_index = 1 +speed_constrains = PoolVector3Array( 0, 2, -0.05 ) +path_penalties = [ 2.0 ] [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadRampLongCurved.tscn b/scenes/road/roadRampLongCurved.tscn index 0230919..2b3ad8e 100644 --- a/scenes/road/roadRampLongCurved.tscn +++ b/scenes/road/roadRampLongCurved.tscn @@ -10,6 +10,9 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +reset_index = 1 +speed_constrains = PoolVector3Array( 0.25, 1.5, -0.05 ) +path_penalties = [ 1.25 ] [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadRampLongCurvedFlipped.tscn b/scenes/road/roadRampLongCurvedFlipped.tscn index d11e721..f580c7f 100644 --- a/scenes/road/roadRampLongCurvedFlipped.tscn +++ b/scenes/road/roadRampLongCurvedFlipped.tscn @@ -10,6 +10,8 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +speed_constrains = PoolVector3Array( 0.25, 0.4, 0.12 ) +force_penalties = PoolVector3Array( 0, 0, 3.5 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadRampLongFlipped.tscn b/scenes/road/roadRampLongFlipped.tscn index fc1aac8..7ab9dbd 100644 --- a/scenes/road/roadRampLongFlipped.tscn +++ b/scenes/road/roadRampLongFlipped.tscn @@ -10,6 +10,8 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +speed_constrains = PoolVector3Array( 0, 0.1, 0.12 ) +force_penalties = PoolVector3Array( 0, 0, 4 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadStraight.tscn b/scenes/road/roadStraight.tscn index f05b3a8..b6c326d 100644 --- a/scenes/road/roadStraight.tscn +++ b/scenes/road/roadStraight.tscn @@ -10,6 +10,8 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +first_speed_factor = 0.8 +creator_speed_factor = 0.8 [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadStraightLong.tscn b/scenes/road/roadStraightLong.tscn index 601fccb..6d3e034 100644 --- a/scenes/road/roadStraightLong.tscn +++ b/scenes/road/roadStraightLong.tscn @@ -10,6 +10,8 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +first_speed_factor = 0.8 +creator_speed_factor = 0.8 [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadStraightLongBump.tscn b/scenes/road/roadStraightLongBump.tscn index 5414486..dcc0a7d 100644 --- a/scenes/road/roadStraightLongBump.tscn +++ b/scenes/road/roadStraightLongBump.tscn @@ -10,6 +10,15 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +reset_index = 1 +speed_constrains = PoolVector3Array( 0.1, 0.8, 0.13, 0.1, 0.8, -0.05, 1.2, 1.6, 0.13 ) +force_penalties = PoolVector3Array( 0, 4, 15, 0, 0, 0, 0, 0, 5 ) +torque_penalties = PoolVector3Array( 0.2, 0, 0, 0, 0, 0, 0.1, 0, 0 ) +path_penalties = [ 0.0, 0.7 ] [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) + +[node name="PathFollow" type="PathFollow" parent="Path"] +transform = Transform( 1, 0, 0, 0, 0.743809, -0.668391, 0, 0.668391, 0.743809, 0, 0.100104, 1.55236 ) +offset = 1.62 diff --git a/scenes/road/roadStraightSkew.tscn b/scenes/road/roadStraightSkew.tscn index b72ff65..e31de68 100644 --- a/scenes/road/roadStraightSkew.tscn +++ b/scenes/road/roadStraightSkew.tscn @@ -10,6 +10,11 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +first_speed_factor = 0.9 +creator_speed_factor = 0.9 +speed_constrains = PoolVector3Array( 0, 0.2, 0.14 ) +force_penalties = PoolVector3Array( 0, 0, 3 ) +torque_penalties = PoolVector3Array( 0, 0, 2 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scenes/road/roadStraightSkewFlipped.tscn b/scenes/road/roadStraightSkewFlipped.tscn index f42f1e9..4e5a8eb 100644 --- a/scenes/road/roadStraightSkewFlipped.tscn +++ b/scenes/road/roadStraightSkewFlipped.tscn @@ -10,6 +10,11 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) +first_speed_factor = 0.9 +creator_speed_factor = 0.9 +speed_constrains = PoolVector3Array( 0, 0.2, 0.14 ) +force_penalties = PoolVector3Array( 0, 0, 3 ) +torque_penalties = PoolVector3Array( 0, 0, 2 ) [node name="Path" type="Path" parent="."] curve = ExtResource( 3 ) diff --git a/scripts/game/game.gd b/scripts/game/game.gd index 73d791c..3960c93 100644 --- a/scripts/game/game.gd +++ b/scripts/game/game.gd @@ -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) - - 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 _physics_process(delta): + if is_network_master(): + set_player_order() + check_autotrack() -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 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] -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))) - - emit_signal("players_changed", players) +func new_first(player): + if first != null: + first.rpc("set_first",false) + first = player + first.rpc("set_first",true) -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) +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) -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 \ No newline at end of file diff --git a/scripts/game/gamestate.gd b/scripts/game/gamestate.gd new file mode 100644 index 0000000..f7bc4bd --- /dev/null +++ b/scripts/game/gamestate.gd @@ -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") diff --git a/scripts/game/local_storage.gd b/scripts/game/local_storage.gd index 4ef1534..7c4d914 100644 --- a/scripts/game/local_storage.gd +++ b/scripts/game/local_storage.gd @@ -10,10 +10,12 @@ func _ready(): func read_content(): var f = File.new() var err = f.open(FILE_PATH, File.READ) - var content = parse_json(f.get_as_text ()) + var content = {} + if err == OK: + content = parse_json(f.get_as_text()) + f.close() if content == null: content = {} - f.close() return content diff --git a/scripts/game/route.gd b/scripts/game/route.gd index b3f2ba0..ca9d12a 100644 --- a/scripts/game/route.gd +++ b/scripts/game/route.gd @@ -17,10 +17,6 @@ func get_road(road_index): return get_child(road_index) -remotesync func set_network_master(id:int, recursive:bool = true): - .set_network_master(id) - - remotesync func add_road(type, creator): var transform = get_global_transform() var last_road = get_last_road() @@ -37,12 +33,12 @@ remotesync func add_road(type, creator): new_road.set_creator(creator) if creator > 0: - var player = get_parent().get_node("players/" + str(creator)) + 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) diff --git a/scripts/game/world.gd b/scripts/game/world.gd deleted file mode 100644 index 982f7c5..0000000 --- a/scripts/game/world.gd +++ /dev/null @@ -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 \ No newline at end of file diff --git a/scripts/menus/direct_host.gd b/scripts/menus/direct_host.gd index 970c275..316bba8 100644 --- a/scripts/menus/direct_host.gd +++ b/scripts/menus/direct_host.gd @@ -12,7 +12,7 @@ func _draw(): func _on_host_pressed(): - var port = find_node("port").text + var port = find_node("port").get_value() var bots = find_node("bots").is_pressed() var err = server.host_game(int(port), bots) @@ -20,7 +20,7 @@ func _on_host_pressed(): var lobby_menu = LobbyMenu.instance() get_tree().get_root().add_child(lobby_menu) - game.set_player(get_tree().get_network_unique_id()) + gamestate.set_player(get_tree().get_network_unique_id()) queue_free() else: diff --git a/scripts/menus/direct_join.gd b/scripts/menus/direct_join.gd index 9c29dd8..0845629 100644 --- a/scripts/menus/direct_join.gd +++ b/scripts/menus/direct_join.gd @@ -6,22 +6,11 @@ func _draw(): func _on_join_pressed(): - var ip = find_node("ip").text - - if not ip.is_valid_ip_address(): - show_error_dialog(tr("INVALIP_IP4")) - return - - var port = find_node("port").text + var ip = find_node("ip").text + var port = find_node("port").get_value() client.join_game(ip, int(port)) queue_free() func _on_back_pressed(): - queue_free() - - -func show_error_dialog(text:String): - var dialog = get_node("error_dialog") - dialog.set_text(text) - dialog.popup_centered() \ No newline at end of file + queue_free() \ No newline at end of file diff --git a/scripts/menus/ingame.gd b/scripts/menus/ingame.gd index 4117754..5d22064 100644 --- a/scripts/menus/ingame.gd +++ b/scripts/menus/ingame.gd @@ -22,4 +22,4 @@ func _on_settings_pressed(): func _on_end_pressed(): - game.quit_game() + gamestate.quit_game() diff --git a/scripts/menus/lobby.gd b/scripts/menus/lobby.gd index cc6d680..f701385 100644 --- a/scripts/menus/lobby.gd +++ b/scripts/menus/lobby.gd @@ -13,9 +13,9 @@ func _ready(): get_node("menu/back").connect("pressed",self,"_on_back_pressed") - game.connect("players_changed", self, "_players_changed") - game.connect("game_ready", self, "_game_ready") - game.connect("game_started", self, "_game_started") + gamestate.connect("players_changed", self, "_players_changed") + gamestate.connect("game_ready", self, "_game_ready") + gamestate.connect("game_started", self, "_game_started") client.connect("server_disconnected", self, "_server_disconnected") player_settings.get_name_node().connect("text_changed",self,"_on_name_text_changed") @@ -24,9 +24,9 @@ func _ready(): countdown_timer.set_wait_time(server.LOBBY_READY_WAIT_TIME) - if game.game_name: - find_node("server_name").set_text(game.game_name) - find_node("server_name").set_tooltip(game.game_name) + if gamestate.game_name: + find_node("server_name").set_text(gamestate.game_name) + find_node("server_name").set_tooltip(gamestate.game_name) func _draw(): @@ -51,7 +51,7 @@ func _players_changed(players): player_list.set_item_icon(player_list.get_item_count()-1, player_list.get_node("ready_icon").get_button_icon()) else: player_list.set_item_icon(player_list.get_item_count()-1, player_list.get_node("not_ready_icon").get_button_icon()) - find_node("server_bots").set_pressed(game.bots) + find_node("server_bots").set_pressed(gamestate.bots) func _game_ready(all_ready): @@ -84,11 +84,11 @@ func _on_player_changed(): var name = player_settings.get_name_node().text var color = player_settings.get_color_node().color var ready = find_node("ready").pressed - game.update_player(name,color,ready) + gamestate.update_player(name,color,ready) func _on_back_pressed(): - game.quit_game() + gamestate.quit_game() 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() diff --git a/scripts/menus/main.gd b/scripts/menus/main.gd index c6b5747..146fc88 100644 --- a/scripts/menus/main.gd +++ b/scripts/menus/main.gd @@ -6,7 +6,7 @@ var SettingsMenu = preload("res://scenes/menus/SettingsMenu.tscn") func _ready(): - game.connect("server_disconnected", self, "_server_disconnected") + gamestate.connect("server_disconnected", self, "_server_disconnected") func _draw(): find_node("multiplayer").grab_focus() diff --git a/scripts/menus/server.gd b/scripts/menus/server.gd index 0064981..5b00513 100644 --- a/scripts/menus/server.gd +++ b/scripts/menus/server.gd @@ -122,7 +122,7 @@ func _on_join_pressed(): func _connection_succeeded(): var lobby_menu = LobbyMenu.instance() if selected_game && selected_game.has('name'): - game.game_name = selected_game.name + gamestate.game_name = selected_game.name get_tree().get_root().add_child(lobby_menu) get_node("refresh_timer").stop() hide() diff --git a/scripts/menus/server_create.gd b/scripts/menus/server_create.gd index afc80a1..da359f1 100644 --- a/scripts/menus/server_create.gd +++ b/scripts/menus/server_create.gd @@ -27,7 +27,7 @@ func _on_create_pressed(): func _on_game_created(result, response_code, headers, body): if result == OK && response_code == HTTPClient.RESPONSE_OK: var json = JSON.parse(body.get_string_from_utf8()) - game.game_name = json.result['name'] + gamestate.game_name = json.result['name'] client.join_game(game_server.SERVER_ADDR, int(json.result['port'])) queue_free() diff --git a/scripts/networking/client.gd b/scripts/networking/client.gd index 4423726..0f14a99 100644 --- a/scripts/networking/client.gd +++ b/scripts/networking/client.gd @@ -9,14 +9,14 @@ func join_game(ip, port:int): get_tree().connect("connected_to_server", self, "_connected_ok") get_tree().connect("connection_failed", self, "_connected_fail") get_tree().connect("server_disconnected", self, "_server_disconnected") - game.connect("game_ended",self,"_game_ended") + gamestate.connect("game_ended",self,"_game_ended") var host = NetworkedMultiplayerENet.new() host.create_client(ip, port) get_tree().set_network_peer(host) func _connected_ok(): - game.rpc("set_player", get_tree().get_network_unique_id()) + gamestate.rpc("set_player", get_tree().get_network_unique_id()) emit_signal("connection_succeeded") @@ -29,7 +29,7 @@ func _connected_fail(): func _server_disconnected(): - game.quit_game() + gamestate.quit_game() emit_signal("server_disconnected") @@ -38,7 +38,7 @@ func _game_ended(): get_tree().disconnect("connection_failed", self, "_connected_fail") get_tree().disconnect("server_disconnected", self, "_server_disconnected") - game.disconnect("game_ended",self,"_game_ended") + gamestate.disconnect("game_ended",self,"_game_ended") get_tree().set_refuse_new_network_connections(false) get_tree().set_network_peer(null) \ No newline at end of file diff --git a/scripts/networking/game_server.gd b/scripts/networking/game_server.gd index 1e3c86d..aea4f09 100644 --- a/scripts/networking/game_server.gd +++ b/scripts/networking/game_server.gd @@ -2,8 +2,8 @@ extends Spatial class_name GameServer -const SERVER_ADDR = "127.0.0.1" -const API_ADDR = "http://" + SERVER_ADDR + ":5000/" +const SERVER_ADDR = "mur-server.lh8.de" +const API_ADDR = "https://" + SERVER_ADDR + "/" const HEADERS = ["Content-Type: application/json"] const SSL = false diff --git a/scripts/networking/server.gd b/scripts/networking/server.gd index 3557e2a..5d3a4d6 100644 --- a/scripts/networking/server.gd +++ b/scripts/networking/server.gd @@ -24,12 +24,12 @@ func _ready(): if argument.split("=")[0] == "--secret": server_secret=argument.split("=")[1] if argument.split("=")[0] == "--bots": - game.set_bots(bool(int(argument.split("=")[1]))) + gamestate.set_bots(bool(int(argument.split("=")[1]))) if dedicated_server: var err = host_game(port) if err == OK: - print(server_id + "New game hosted: port=" + str(port) + " secret=" + str(server_secret) + " bots=" + str(game.bots)) + print(server_id + "New game hosted: port=" + str(port) + " secret=" + str(server_secret) + " bots=" + str(gamestate.bots)) else: print(server_id + "Could not create Server! (port=" + str(port) + " secret=" + str(server_secret) + ")") quit_server() @@ -43,12 +43,12 @@ func host_game(port:int, set_bots:bool = false): get_tree().connect("network_peer_connected", self, "_client_connected") get_tree().connect("network_peer_disconnected", self,"_client_disconnected") - game.connect("players_changed",self,"_players_changed") - game.connect("game_ready",self,"_game_ready") - game.connect("game_ended",self,"_game_ended") + gamestate.connect("players_changed",self,"_players_changed") + gamestate.connect("game_ready",self,"_game_ready") + gamestate.connect("game_ended",self,"_game_ended") if set_bots: - game.bots = true + gamestate.bots = true if timer == null: timer = Timer.new() @@ -68,21 +68,25 @@ func local_game(name:String, color:Color, bots:bool): var localhost = NetworkedMultiplayerENet.new() localhost.create_server(0, 0) get_tree().set_network_peer(localhost) - game.bots = bots - game.set_player(get_tree().get_network_unique_id(), name, color) - game.prepare_game() - game.post_start_game() + gamestate.bots = bots + gamestate.set_player(get_tree().get_network_unique_id(), name, color) + gamestate.prepare_game() + gamestate.post_start_game() func update_server_data(): var req = game_server.http() - req.put_request("game",to_json({'secret' : server_secret, 'player_count' : game.players.size(), 'running' : game.game_running})) - + var player_count = 0 + if gamestate.players != null: + player_count = gamestate.players.size() + req.put_request("game",to_json({'secret' : server_secret, 'player_count' : player_count, 'running' : gamestate.game_running})) + + func _client_connected(id): if get_tree().is_network_server(): if dedicated_server: print(server_id + "peer connected: " + str(id)) - game.rpc_id(id, "set_bots" ,game.bots) + gamestate.rpc_id(id, "set_bots" ,gamestate.bots) if not timer.is_stopped(): timer.disconnect("timeout",self,"quit_server") timer.stop() @@ -92,11 +96,11 @@ func _client_disconnected(id): if get_tree().is_network_server(): if dedicated_server: print(server_id + "peer disconnected: " + str(id)) - if game.game_running: + if gamestate.game_running: emit_signal("server_error", "DISCONNECTED", [id]) - game.rpc("remove_player" ,id) + gamestate.rpc("remove_player" ,id) else: - game.rpc("remove_player" ,id) + gamestate.rpc("remove_player" ,id) func _players_changed(players): @@ -104,7 +108,7 @@ func _players_changed(players): if dedicated_server: update_server_data() if players.empty(): - if game.game_running: + if gamestate.game_running: print(server_id + "All players disconnected, close server.") quit_server() else: @@ -124,13 +128,14 @@ func quit_server(triggered:bool = false): func _on_delete_server(result, response_code, headers, body): if result != OK || response_code != HTTPClient.RESPONSE_OK: - print(server_id + "ERROR: _on_delete_server, server is in undefined state!") + print(server_id + "ERROR: _on_delete_server, server might be in undefined state!") + get_tree().quit() func _start_game(): if get_tree().is_network_server(): get_tree().set_refuse_new_network_connections(true) - game.rpc("prepare_game") + gamestate.rpc("prepare_game") func _game_ready(all_ready): @@ -148,9 +153,9 @@ func _game_ended(): get_tree().disconnect("network_peer_connected", self, "_client_connected") get_tree().disconnect("network_peer_disconnected", self,"_client_disconnected") - game.disconnect("players_changed",self,"_players_changed") - game.disconnect("game_ready",self,"_game_ready") - game.disconnect("game_ended",self,"_game_ended") + 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) \ No newline at end of file diff --git a/scripts/player/base_inventory.gd b/scripts/player/base_inventory.gd index 45e661c..c1193a7 100644 --- a/scripts/player/base_inventory.gd +++ b/scripts/player/base_inventory.gd @@ -3,10 +3,10 @@ extends Spatial class_name BaseInventory var road_straights = [ - roads_factory.STRAIGHT, - roads_factory.STRAIGHT_SMALL, roads_factory.BUMP, roads_factory.BUMP_SMALL, + roads_factory.STRAIGHT, + roads_factory.STRAIGHT_SMALL, ] var roads_left = [ @@ -49,11 +49,11 @@ var item:Road var type:int = 0 var index:int = 0 -signal item_changed(index) +signal item_changed(index, player) func _ready(): - route = get_node("/root/world/route") + route = gamestate.game.route func set_player(new_player:Player): @@ -71,4 +71,4 @@ func set_item(): item.rotate_y(PI/2) - emit_signal("item_changed", roads[type][index]) \ No newline at end of file + emit_signal("item_changed", roads[type][index], player) \ No newline at end of file diff --git a/scripts/player/base_player.gd b/scripts/player/base_player.gd deleted file mode 100644 index c6213d4..0000000 --- a/scripts/player/base_player.gd +++ /dev/null @@ -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") \ No newline at end of file diff --git a/scripts/player/bot_controls.gd b/scripts/player/bot_controls.gd index 3f82b46..c844af3 100644 --- a/scripts/player/bot_controls.gd +++ b/scripts/player/bot_controls.gd @@ -2,8 +2,9 @@ extends Spatial var player:Player -var overspeed_rate:float = 0.8 -var underspeed_rate:float = 0.3 +const MAX_ROAD_INDEX = 1 +var error_rate:float = 0.00 +var underspeed_rate:float = 0.00 func _ready(): @@ -19,26 +20,27 @@ func _physics_process(delta): if player.get_road() != null: var rate = randf() var road = player.get_road() - var distance = player.follow.get_offset() + var road_index = 0 + var speed_constrain = 0.0 + while road != null && road_index < MAX_ROAD_INDEX: + for index in range(road.speed_constrains.size()): + var constrain = road.speed_constrains[index] + if constrain.z > 0: + speed_constrain = max(speed_constrain, constrain.z) + elif constrain.z < 0: + speed_constrain = min(speed_constrain, constrain.z) + road = player.route.get_road(road.get_index() + 1) + road_index += 1 + var speed = player.current_speed - var has_constrain = false - for index in range(road.speed_constrains.size()): - var constrain = road.speed_constrains[index] - if constrain.x <= distance && constrain.y >= distance: - has_constrain = true - if constrain.z > 0 && speed < constrain.z && rate > underspeed_rate: - player.thrust = 1 - elif rate > overspeed_rate: - player.thrust = -1 - else: - player.thrust = 0 - if not has_constrain: - if rate > underspeed_rate: + if speed_constrain < 0: + player.thrust = 1 + elif speed_constrain > 0 && speed > speed_constrain: + player.thrust = -1 + elif rate > underspeed_rate: player.thrust = 1 - elif rate > overspeed_rate: - player.thrust = -1 - else: - player.thrust = 0 + else: + player.thrust = 0 func set_player(path:String): @@ -46,8 +48,8 @@ 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_error_rate(new_error_rate:float): + error_rate = new_error_rate func set_underspeed_rate(new_underspeed_rate:float): diff --git a/scripts/player/bot_inventory.gd b/scripts/player/bot_inventory.gd index 22958b9..915aa1c 100644 --- a/scripts/player/bot_inventory.gd +++ b/scripts/player/bot_inventory.gd @@ -19,4 +19,4 @@ func _on_raceCar_road_entered(road): func set_player(new_player:Player): player = new_player - player.get_race_car().connect("road_entered",self,"_on_raceCar_road_entered") \ No newline at end of file + player.race_car.connect("road_entered",self,"_on_raceCar_road_entered") \ No newline at end of file diff --git a/scripts/player/human_controls.gd b/scripts/player/human_controls.gd index 92b7686..b7feee4 100644 --- a/scripts/player/human_controls.gd +++ b/scripts/player/human_controls.gd @@ -45,5 +45,5 @@ func set_player(path:String): func set_debug_camera(idx): - if idx < player.get_parent().get_child_count(): - camera.set_target_path(player.get_parent().get_child(idx).find_node("CameraTarget").get_path()) + if idx < gamestate.game.players.get_child_count(): + camera.set_target_path(gamestate.game.players.get_child(idx).find_node("CameraTarget").get_path()) diff --git a/scripts/player/human_inventory.gd b/scripts/player/human_inventory.gd index e205f13..97cba8a 100644 --- a/scripts/player/human_inventory.gd +++ b/scripts/player/human_inventory.gd @@ -10,6 +10,7 @@ func _ready(): var hud_track = get_node("../hud/inventory/track") hud_track.get_texture().set_viewport_path_in_scene(str(get_path()) + "/viewport") connect("item_changed",self,"_on_item_changed") + connect("item_changed",preview,"_on_inventory_item_changed") func _physics_process(delta): @@ -51,7 +52,7 @@ func _physics_process(delta): preview.item.hide() -func _on_item_changed(road_identifier): +func _on_item_changed(road_identifier, player): if is_network_master(): if view.get_child_count() > 0: view.remove_child(view.get_child(0)) diff --git a/scripts/player/inventory_preview.gd b/scripts/player/inventory_preview.gd index 7e08307..81d08b8 100644 --- a/scripts/player/inventory_preview.gd +++ b/scripts/player/inventory_preview.gd @@ -3,14 +3,11 @@ extends Spatial class_name Preview var player:Player -var route:Route var item:Road func _ready(): - route = get_node("/root/world/route") - route.connect("road_added",self,"_on_route_road_added") - get_parent().connect("item_changed",self,"_on_inventory_item_changed") + gamestate.game.route.connect("road_added",self,"_on_route_road_added") func _on_route_road_added(road): @@ -23,14 +20,13 @@ func _on_route_road_added(road): item.set_global_transform(transform) -func _on_inventory_item_changed(road_identifier): +func _on_inventory_item_changed(road_identifier, player): if is_network_master(): if item: item.free() item = roads_factory.get_road_instance(road_identifier) item.set_preview(true) - var player = get_parent().player if player != null: item.set_color(player.get_player_color()) add_child(item) - _on_route_road_added(route.get_last_road()) + _on_route_road_added(gamestate.game.route.get_last_road()) diff --git a/scripts/player/player.gd b/scripts/player/player.gd index f23972b..c182240 100644 --- a/scripts/player/player.gd +++ b/scripts/player/player.gd @@ -1,11 +1,15 @@ -extends BasePlayer +extends Node class_name Player const MAX_SPEED:float = 0.2 +const START_OFFSET = [1.70223, 1.20223, 0.702227, 0.202227 ] const LANE_OFFSET = [-0.085, 0.085, -0.255, 0.255 ] +export var player_color:Color +var player_name:String + var thrust:int = 0 var current_speed:float = 0.0 @@ -13,12 +17,15 @@ export var speed_factor:float = 0.001 export var brake_factor:float = 2.0 export var friction_brake_factor:float = 0.8 -var timer:Timer -var path:Path -var follow:PathFollow +onready var race_car = get_node("Path/PathFollow/raceCar") +onready var timer:Timer = get_node("ResetTimer") +onready var path:Path = get_node("Path") +onready var follow:PathFollow = get_node("Path/PathFollow") +onready var route:Route var lane:int +var start_init:bool = true var has_next:bool = false var is_resetable:bool = false var buffered_curve:Curve3D @@ -27,15 +34,19 @@ var buffered_rotation:Vector3 = Vector3(0,0,0) var last_rotation:Vector3 = Vector3(0,0,0) var torque_penalty:Vector3 var force_penalty:Vector3 +var path_penalty:float + +var is_out:bool = false +var position:Vector2 +puppet var slave_position:Vector2 func _ready(): - timer = get_node("ResetTimer") - path = get_node("Path") + route = gamestate.game.route + race_car.road_ray.set_collision_mask_bit(get_index(),1) path.curve = path.curve.duplicate() path.curve.set_bake_interval(0.05) - follow = get_node("Path/PathFollow") func _physics_process(delta): @@ -86,9 +97,11 @@ func _physics_process(delta): _out = _out.rotated(buffered_rotation.normalized(), buffered_rotation.length()) path.curve.add_point(buffered_translate + _pos, _in, _out) path.curve.set_point_tilt(i, buffered_curve.get_point_tilt(i)) - follow.set_offset(0.001) - if get_road() != null: - road_index = get_road().get_index() + if not start_init: + follow.set_offset(0.001) + else: + follow.set_offset(START_OFFSET[lane]) + start_init = false if get_road() != null: var road = get_road() var penalty_index = road.penalty_index(follow.get_offset(), current_speed) @@ -96,34 +109,38 @@ func _physics_process(delta): if penalty_index >= 0: 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() check_position() else: - var race_car = get_race_car() race_car.get_node("ray").set_enabled(false) if force_penalty.length() != 0: - race_car.apply_central_impulse(force_penalty * current_speed) + race_car.move_and_slide(force_penalty * current_speed + Vector3(0,-0.5,0)) if torque_penalty.length() != 0: - race_car.axis_lock_angular_x = false - race_car.axis_lock_angular_y = false - race_car.axis_lock_angular_z = false - race_car.apply_torque_impulse(torque_penalty * current_speed) + race_car.rotate_object_local(torque_penalty.normalized(), torque_penalty.length() * current_speed) + if path_penalty > 0 && follow.get_offset() > 0.0: + follow.set_offset(follow.get_offset() - 0.01) + path_penalty -= 0.01 + current_speed -= 0.0002 + if current_speed < 0: + current_speed = 0 else: position = slave_position -func get_race_car(): - return get_node("Path/PathFollow/raceCar") - - func get_road(): - return get_race_car().road + return race_car.road func _on_raceCar_road_entered(road): + + var prev_road = route.get_road(road.get_index()-1) + if prev_road != null: + prev_road.body.set_collision_layer_bit(get_index(),0) + buffered_curve = road.get_lane_curve(lane) buffered_rotation = last_rotation @@ -137,8 +154,34 @@ func _on_raceCar_road_entered(road): has_next = true +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) + race_car.get_node("body").set_surface_material(1,material) + + +remotesync func set_first(is_first:bool): + if is_first: + add_to_group("first") + else: + remove_from_group("first") + + master func check_position(): - position = Vector2(road_index, follow.get_offset()) + position = Vector2(race_car.road_index, follow.get_offset()) rset("slave_position", position) @@ -146,15 +189,13 @@ master func reset(): if is_resetable: has_next = false current_speed = 0 - - var race_car = get_race_car() - # todo PATH - - var route = get_node("/root/world/route") + 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) + road.body.set_collision_layer_bit(get_index(),1) path.curve.clear_points() @@ -164,13 +205,9 @@ master func reset(): buffered_translate = road.get_translation() last_rotation = road.get_rotation() + race_car.road_index = road.get_index() race_car.road = null race_car.collider = null - race_car.linear_velocity = Vector3(0,0,0) - race_car.angular_velocity = Vector3(0,0,0) - race_car.axis_lock_angular_x = true - race_car.axis_lock_angular_y = true - race_car.axis_lock_angular_z = true race_car.transform = Transform() race_car.get_node("ray").set_enabled(true) diff --git a/scripts/player/race_car.gd b/scripts/player/race_car.gd index 5566f35..a1c1130 100644 --- a/scripts/player/race_car.gd +++ b/scripts/player/race_car.gd @@ -3,6 +3,7 @@ extends Spatial var road_ray:RayCast var collider var road:Road +var road_index:int = 0 puppet var slave_transform:Transform @@ -18,9 +19,10 @@ func _physics_process(delta): if road_ray.is_colliding(): if road_ray.get_collider() != collider: var parent = road_ray.get_collider().get_parent() - if parent is Road && (road == null || road.get_index() < parent.get_index()) && !parent.is_preview(): + if parent is Road && (road == null && road_index == parent.get_index() || road.get_index() == parent.get_index() - 1) && !parent.is_preview(): collider = road_ray.get_collider() road = parent + road_index = road.get_index() emit_signal("road_entered",road) rset_unreliable("slave_transform", get_global_transform()) else: diff --git a/scripts/road/road.gd b/scripts/road/road.gd index e761e13..df33cbd 100644 --- a/scripts/road/road.gd +++ b/scripts/road/road.gd @@ -4,8 +4,8 @@ class_name Road export var end_rotation:Vector3 = Vector3(0,0,0) -export var first_speed_factor:float = 0.8 -export var creator_speed_factor:float = 0.8 +export var first_speed_factor:float = 1.0 +export var creator_speed_factor:float = 1.0 export var chasers_speed_factor:float = 1.0 export var reset_index:int = 0 @@ -13,20 +13,29 @@ export var reset_index:int = 0 export (PoolVector3Array) var speed_constrains = PoolVector3Array() export (PoolVector3Array) var force_penalties = PoolVector3Array() export (PoolVector3Array) var torque_penalties = PoolVector3Array() +export (Array,float) var path_penalties = [] + +var body:StaticBody var creator:int = -1 var preview:bool = false -func _ready(): +func _init(): if not has_node("StaticBody"): - var body = StaticBody.new() + body = StaticBody.new() body.set_name("StaticBody") var shape = CollisionShape.new() shape.set_name("CollisionShape") shape.shape = mesh.create_trimesh_shape() body.add_child(shape) + body.set_collision_layer_bit(0,1) + body.set_collision_layer_bit(1,1) + body.set_collision_layer_bit(2,1) + body.set_collision_layer_bit(3,1) add_child(body) + else: + body = get_node("StaticBody") func get_creator(): @@ -108,6 +117,16 @@ func get_force_penalty(index:int): return Vector3(0,0,0) +func get_path_penalty(index:int): + if index >= 0: + if path_penalties.size() < (index + 1): + return get_path_penalty(index - 1) + + return path_penalties[index] + + return 0.0 + + func get_first_speed_factor(): return first_speed_factor diff --git a/scripts/road/roads_factory.gd b/scripts/road/roads_factory.gd index 31e75f2..ce8b537 100644 --- a/scripts/road/roads_factory.gd +++ b/scripts/road/roads_factory.gd @@ -2,6 +2,7 @@ extends Node class_name TracksFactory +const START = "Start" const STRAIGHT = "StraightLong" const STRAIGHT_SMALL = "Straight" const CURVE_RIGHT = "CornerLarge"