79 lines
2.2 KiB
GDScript
79 lines
2.2 KiB
GDScript
extends SceneTree
|
|
|
|
# Drives the players apart at a set speed and measures actual droop: how much
|
|
# longer the rope's real path is than the straight line between the anchors.
|
|
# droop ~0 means visually taut. That is the thing the fix has to deliver.
|
|
|
|
var rope
|
|
var p1
|
|
var p2
|
|
var t := 0.0
|
|
var speed := 0.0
|
|
var trial := 0
|
|
var speeds := [1.0, 3.0, 6.0]
|
|
var worst_droop_while_taut := 0.0
|
|
var saw_taut := false
|
|
|
|
|
|
func _initialize() -> void:
|
|
var level = load("res://scenes/game_scene/levels/3dlevel.tscn").instantiate()
|
|
root.add_child(level)
|
|
rope = level.get_node("Path3DRope")
|
|
p1 = level.get_node("Player1")
|
|
p2 = level.get_node("Player2")
|
|
rope.can_snap = false
|
|
speed = speeds[0]
|
|
print("max_length=%.1f reel_speed=%.1f taut_margin=%.2f" % [
|
|
rope.max_length, rope.reel_speed, rope.taut_margin])
|
|
|
|
|
|
# Length of the rope's actual polyline through every segment.
|
|
func path_len() -> float:
|
|
var total := 0.0
|
|
var pts := []
|
|
for s in rope.segments:
|
|
var h: float = s.get_child(0).shape.height * 0.5
|
|
pts.append(s.position + s.transform.basis.y * h)
|
|
var last = rope.segments[-1]
|
|
var lh: float = last.get_child(0).shape.height * 0.5
|
|
pts.append(last.position - last.transform.basis.y * lh)
|
|
for i in range(pts.size() - 1):
|
|
total += pts[i].distance_to(pts[i + 1])
|
|
return total
|
|
|
|
|
|
func _physics_process(d: float) -> bool:
|
|
t += d
|
|
if t < 0.4:
|
|
return false
|
|
# Walk them apart at a controlled rate.
|
|
p1.global_position.x -= speed * d * 0.5
|
|
p2.global_position.x += speed * d * 0.5
|
|
p1.velocity.x = 0.0
|
|
p2.velocity.x = 0.0
|
|
|
|
var gap: float = p1.global_position.distance_to(p2.global_position)
|
|
var droop: float = path_len() - gap
|
|
if rope.taut:
|
|
saw_taut = true
|
|
worst_droop_while_taut = max(worst_droop_while_taut, droop)
|
|
|
|
if fmod(t, 0.6) < d:
|
|
print(" sep=%.0fm/s gap=%5.2f rope=%5.2f path=%5.2f droop=%5.2f taut=%s" % [
|
|
speed, gap, rope._rope_length, path_len(), droop, str(rope.taut)])
|
|
|
|
if gap > rope.max_length * 1.3:
|
|
print("trial sep=%.0fm/s -> saw_taut=%s worst droop while taut=%.3f\n" % [
|
|
speed, str(saw_taut), worst_droop_while_taut])
|
|
trial += 1
|
|
if trial >= speeds.size():
|
|
quit(0)
|
|
return true
|
|
speed = speeds[trial]
|
|
saw_taut = false
|
|
worst_droop_while_taut = 0.0
|
|
p1.global_position.x = -1.0
|
|
p2.global_position.x = 1.0
|
|
t = 0.0
|
|
return false
|