late Sunday update: netcode changes, bot improvements, bot development
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user