summaryrefslogtreecommitdiffstats
path: root/ps_zooping.gd
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2025-12-05 12:47:56 +0200
committerJan Tuomi <jan@jantuomi.fi>2025-12-05 13:01:03 +0200
commit04ecbdb00a8e2df5778945ff8d34bea53b8ad09f (patch)
tree4b6d3a8de0d48d214738f8c1f6826d8002c276a0 /ps_zooping.gd
parent9e9f6984a500ec6eab02fa651eaaf3472c281c2a (diff)
Add zooping
Diffstat (limited to 'ps_zooping.gd')
-rw-r--r--ps_zooping.gd81
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()