Files
gamejamgame/rope_diag.gd
T
2026-07-25 21:51:39 +12:00

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