summaryrefslogtreecommitdiffstats
path: root/ps_zooping.gd
blob: 2c743a3edce8366449bbd5136a8359e79f6a4447 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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()