8func resolve_devices(objects:Array, ball_position:Vector2, ball_velocity:Vector2, tile_size:float, elapsed:float) -> Dictionary:
9 var next_velocity:Vector2 = ball_velocity
10 var message:String =
""
11 var hit_id:String =
""
12 for object_row
in objects:
13 if not object_row
is Dictionary:
15 var center:Vector2 = object_row.get(
"_world_center", Vector2.ZERO)
16 if center == Vector2.ZERO:
18 match str(object_row.get(
"kind",
"")):
20 var radius:float =
float(object_row.get(
"radius", 0.45)) * tile_size
21 if ball_position.distance_to(center) <= radius:
22 var normal:Vector2 = (ball_position - center).normalized()
23 if normal == Vector2.ZERO:
25 next_velocity = ball_velocity.bounce(normal) *
float(object_row.get(
"bounce", 1.15))
26 message =
"Bumper bounce."
27 hit_id = str(object_row.get(
"id",
"bumper"))
30 var device:String = str(object_row.get(
"device",
""))
33 var pad_radius:float = max(8.0, tile_size * 0.42)
34 if ball_position.distance_to(center) <= pad_radius:
35 next_velocity = ball_velocity *
float(object_row.get(
"impulse", 1.4))
36 message =
"Bounce pad launched the ball."
37 hit_id = str(object_row.get(
"id",
"bounce_pad"))
40 var blade_open:bool = fmod(elapsed,
float(object_row.get(
"cycle_time", 2.0))) <
float(object_row.get(
"cycle_time", 2.0)) * 0.5
41 var windmill_radius:float = max(10.0, tile_size * 0.48)
42 if not blade_open
and ball_position.distance_to(center) <= windmill_radius:
43 var wind_normal:Vector2 = (ball_position - center).normalized()
44 if wind_normal == Vector2.ZERO:
45 wind_normal = Vector2.LEFT
46 next_velocity = ball_velocity.bounce(wind_normal) * 0.75
47 message =
"Windmill says not today."
48 hit_id = str(object_row.get(
"id",
"windmill"))
51 var fan_radius:float = max(10.0, tile_size * 0.55)
52 if ball_position.distance_to(center) <= fan_radius:
53 next_velocity = ball_velocity + _direction_vector(str(object_row.get(
"direction",
"up"))) *
float(object_row.get(
"force", 90.0))
54 message =
"Fan nudged the ball."
55 hit_id = str(object_row.get(
"id",
"fan"))
58 var wheel_radius:float = max(10.0, tile_size * 0.52)
59 if ball_position.distance_to(center) <= wheel_radius:
60 var redirect:Vector2 =
Vector2(-ball_velocity.y, ball_velocity.x)
61 if bool(object_row.get(
"reverse", false)):
62 redirect =
Vector2(ball_velocity.y, -ball_velocity.x)
63 next_velocity = redirect.normalized() * max(ball_velocity.length(),
float(object_row.get(
"minimum_speed", 120.0)))
64 message =
"Water wheel redirected the ball."
65 hit_id = str(object_row.get(
"id",
"water_wheel"))
68 "velocity": next_velocity,
75func _direction_vector(direction:String) -> Vector2: