test(training): cover wall rebound geometry

This commit is contained in:
Josh Creek
2026-09-01 17:39:53 +01:00
parent e376675fa6
commit e934bbfe44
3 changed files with 39 additions and 4 deletions
+17 -3
View File
@@ -595,12 +595,26 @@ func _place_wall_state(rebound: bool) -> void:
randf_range(1.0, minf(FIELD_MAX_Y, 7.0)),
randf_range(-FIELD_HALF_Z, FIELD_HALF_Z)
)
var toward_field := Vector3(-side, randf_range(-0.15, 0.15), randf_range(-0.15, 0.15)).normalized()
var direction := -toward_field if rebound else toward_field
var velocity := direction * randf_range(WALL_PLAY_SPEED.x, WALL_PLAY_SPEED.y)
var velocity := wall_state_velocity(
rebound, side, randf_range(WALL_PLAY_SPEED.x, WALL_PLAY_SPEED.y),
randf_range(-0.15, 0.15), randf_range(-0.15, 0.15)
)
_place_body(ball, Transform3D(Basis.IDENTITY, ball_position), velocity, Vector3.ZERO)
# Pure geometry seam for adversarial tests. `side` identifies the selected
# wall (+1 or -1); a wall-play vector points into the field and a rebound
# vector points into that wall. Normalize the perturbed normal before applying
# speed so random tangential components cannot accidentally change the speed
# distribution between the two state types.
static func wall_state_velocity(rebound: bool, side: float, speed: float, vertical: float, lateral: float) -> Vector3:
if speed < 0.0:
return Vector3.ZERO
var wall_side := -1.0 if side < 0.0 else 1.0
var toward_field := Vector3(-wall_side, vertical, lateral).normalized()
return (-toward_field if rebound else toward_field) * speed
# Air-intercept drill geometry. These six ranges are not free tuning knobs —
# together they decide whether the drill is solvable at all, and the original
# values made it arithmetically impossible (see the Round 9 note in