-
Notifications
You must be signed in to change notification settings - Fork 0
/
player.gd
188 lines (145 loc) · 3.99 KB
/
player.gd
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
extends CharacterBody2D
signal score_updated(score)
signal lost_health(hp)
signal died
signal left_screen
signal double_jumped
@export var jump_force := 500
@export var accel := 800
@export var speed := 400
@onready var collision := $CollisionShape2D
@onready var body := $Body
@onready var shake := $Shake
@onready var anim := $AnimationPlayer
@onready var land_particles := $LandParticles
@onready var jump_sound := $Jump
@onready var jump_land_sound := $JumpLand
@onready var hit_sound: AudioStreamPlayer = $Hit
@onready var rect := $Body/Rect
@onready var sprite := $Body/Sprite2D
const SCORE_HEALTH_UP_MODULO := 10
const MAX_HEALTH := 3
var gravity = Vector2.DOWN * 3 # First time should be slower
var gravity_enabled := true
var input_enabled := false
var flip_enabled := false
var accel_enabled := false
var jump_enabled := false
var floor_jump_enabled := false
var sound_enabled := false
var freeze_enabled := false
var shake_enabled := false
var effects_enabled := false
var health_enabled := false
var knockback = Vector2.ZERO
var was_in_air = false
var health = 3
var score = 0
func _ready():
rect.visible = not GameManager.unlocked_better_graphics()
sprite.visible = GameManager.unlocked_better_graphics()
func _physics_process(delta):
if input_enabled:
var motion = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
if accel_enabled:
velocity.x = move_toward(velocity.x, motion * speed, accel * delta)
else:
velocity.x = motion * speed
if flip_enabled:
if abs(motion) > 0:
body.scale.x = sign(motion)
if knockback:
velocity += knockback
knockback = knockback.move_toward(Vector2.ZERO, 800 * delta)
else:
modulate = Color.WHITE
if sprite.visible:
if is_on_floor():
if velocity.length() > 0:
anim.play("move")
else:
anim.play("idle")
else:
if velocity.y < 0:
anim.play("jump")
else:
anim.play("fall")
if sound_enabled:
if was_in_air and is_on_floor():
jump_land_sound.playing = true
if effects_enabled:
if not sprite.visible:
anim.play("land")
land_particles.emitting = true
else:
land_particles.emitting = false
if jump_enabled:
if Input.is_action_just_pressed("jump") and (not floor_jump_enabled or is_on_floor()):
if not is_on_floor():
double_jumped.emit()
velocity += Vector2.UP * jump_force
if sound_enabled:
jump_sound.playing = true
if gravity_enabled:
velocity += gravity
was_in_air = not is_on_floor()
move_and_slide()
func damage(dir: Vector2):
knockback = dir * 60
if sound_enabled:
hit_sound.playing = true
if effects_enabled:
modulate = Color(1.0, 0.0, 0.0, 0.8)
if shake_enabled:
shake.shake()
if health_enabled:
health -= 1
lost_health.emit(health)
if health <= 0:
collision.set_deferred("disabled", true)
died.emit()
if freeze_enabled:
if health <= 0:
freeze(0.01, 2.0)
else:
freeze(0.01, 0.8)
func freeze(time_scale: float, duration: float):
Engine.time_scale = time_scale
await get_tree().create_timer(duration * time_scale).timeout
Engine.time_scale = 1
func increase_score():
score += 1
if score % SCORE_HEALTH_UP_MODULO == 0:
health += 1
health = min(health, MAX_HEALTH)
lost_health.emit(health) # signal name is wrong but doesn't matter
score_updated.emit(score)
func enable_collision():
collision.disabled = false
func enable_input():
input_enabled = true
func enable_flip():
flip_enabled = true
func enable_gravity():
gravity_enabled = true
gravity = Vector2.DOWN * 30
func enable_accel():
accel_enabled = true
func enable_jump():
jump_enabled = true
func enable_floor_jump():
floor_jump_enabled = true
func enable_sound():
sound_enabled = true
func enable_freeze():
freeze_enabled = true
func enable_shake():
shake_enabled = true
func enable_effects():
effects_enabled = true
func enable_health():
health_enabled = true
func _on_visible_on_screen_notifier_2d_screen_exited():
left_screen.emit()
gravity_enabled = false
velocity /= 2 # make slower so cursor can catch it