diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2025-12-05 12:47:56 +0200 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2025-12-05 13:01:03 +0200 |
| commit | 04ecbdb00a8e2df5778945ff8d34bea53b8ad09f (patch) | |
| tree | 4b6d3a8de0d48d214738f8c1f6826d8002c276a0 /ps_zooping.gd | |
| parent | 9e9f6984a500ec6eab02fa651eaaf3472c281c2a (diff) | |
Add zooping
Diffstat (limited to 'ps_zooping.gd')
| -rw-r--r-- | ps_zooping.gd | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/ps_zooping.gd b/ps_zooping.gd new file mode 100644 index 0000000..2c743a3 --- /dev/null +++ b/ps_zooping.gd @@ -0,0 +1,81 @@ +class_name PlayerStateZooping +extends PlayerState + +var target: ZoopPoint +var t: float +var tongue: Line2D + +var travel_from: Vector2 +var travel_to: Vector2 + +var T_mlem: float = 0.2 +var T_travel: float = 0.2 + +enum S { MLEMING, TRAVELING } +var state: S = S.MLEMING + +func _init(pl: Player, h_target: ZoopPoint) -> void: + super(pl) + + t = 0 + target = h_target + + var dx = target.global_position.x - pl.global_position.x + pl.anim_sp.flip_h = dx < 0 + + state = S.MLEMING + +func _to_string() -> String: + return "PlayerStateZooping %s" % S.keys()[state] + +static func can_zoop_to(pl: Player, z_target: ZoopPoint) -> bool: + var dy = z_target.global_position.y - pl.global_position.y + var dx = z_target.global_position.x - pl.global_position.x + return abs(dy) < 20 and abs(dx) < 100 + +func _handle(_delta: float): + pass + +func _handle_physics(delta: float): + match state: + S.MLEMING: _mlem(delta) + S.TRAVELING: _travel(delta) + _: assert(false, "unknown state %s" % str(state)) + +func _mlem(delta: float): + t += delta + var d = target.global_position - p.global_position + + # Add tongue line + if not tongue: + tongue = Line2D.new() + tongue.width = 2 + tongue.add_point(-d) + tongue.add_point(-d) + target.add_child(tongue) + + # Update one end to be at player + tongue.points[0] = -d + tongue.points[1] = (t / T_mlem - 1) * d + + if t >= T_mlem: + tongue.points[1] = Vector2.ZERO + state = S.TRAVELING + travel_from = p.global_position + travel_to = target.global_position + t = 0 + +func _travel(delta: float): + t += delta + p.global_position = travel_from + (t / T_travel) * (travel_to - travel_from) + + var d = target.global_position - p.global_position + tongue.points[0] = -d + + # If we're traveling in the right direction, then travel + if t >= T_travel: + p.global_position = travel_to + tongue.queue_free() + + p.velocity = Vector2(0, -100) + p.request_state_normal() |
