Lots of polish things and wrapping up all three levels

This commit is contained in:
Nathan Anderson
2022-08-08 15:32:57 -06:00
parent c7d42e09ce
commit 09eada305d
176 changed files with 3068 additions and 403 deletions
+2 -3
View File
@@ -42,7 +42,6 @@ func _start_position():
var x = rng.randi_range(leftBorder.global_position.x, rightBorder.global_position.x)
cloud.global_position = Vector2(x, y)
func _set_paused(paused: bool) -> void:
set_process(!paused)
+6 -3
View File
@@ -3,11 +3,12 @@ extends Node2D
class_name GUI
signal toggle_music(music_off)
signal toggle_pause(paused)
onready var time_label := $MarginContainer/HBoxContainer/TimeLabel
onready var neighbor_label := $MarginContainer/HBoxContainer/NeighborLabel
onready var game_timer := $GameTimer
onready var music_button := $MarginContainer/HBoxContainer/VBoxContainer/MusicButton
onready var music_button := $MarginContainer/HBoxContainer/GridContainer/MusicButton
onready var pause_button := $MarginContainer/HBoxContainer/GridContainer/PauseButton
var arrow = preload("res://assets/ui/pointer.png")
@@ -36,10 +37,12 @@ func _process(delta: float) -> void:
time_label.text = "Time: %s" % time
func _on_PauseButton_toggled(button_pressed: bool) -> void:
print('TODO nothing happens...')
game_timer.set_paused(button_pressed)
emit_signal("toggle_pause", button_pressed)
func _on_MusicButton_toggled(button_pressed: bool) -> void:
emit_signal("toggle_music", !button_pressed)
get_tree().call_group("plays_audio", "_set_audio", button_pressed)
emit_signal("toggle_music", button_pressed)
func _on_mouse_entered() -> void:
Input.set_custom_mouse_cursor(hand)
+25 -10
View File
@@ -22,13 +22,15 @@ onready var end_game_panel = $Panel
onready var end_game_label_title = $Panel/VBoxContainer/EndGameTitle
onready var end_game_label_body = $Panel/VBoxContainer/EndGameBody
onready var display_timer = $DisplayTimer
onready var level_navigation := $LevelNavigation
func display_start(this_level_num: int, is_last_level: bool = false) -> void:
func display_start(this_level_num: int, is_last_level: bool) -> void:
last_level = is_last_level
level_num = this_level_num
end_game_label_title.text = 'Land of make believe'
end_game_label_body.text = '1 %s' % level_num
end_game_label_body.text = '1 - %s' % level_num
end_game_panel.visible = true
display_timer.start(2.0)
func _process(delta: float) -> void:
if end_game_panel.visible:
@@ -42,13 +44,20 @@ func _on_neighbor_found_home(id: int) -> void:
gui.set_game_label("Get to the Trolley!")
player.follower = trolley
func _on_toggle_music(music_off: bool) -> void:
if music_off:
func _set_audio(enabled: bool) -> void:
if not enabled:
playback_position = audio_player.get_playback_position()
audio_player.stop()
else:
audio_player.play(playback_position)
func _on_toggle_music(playing: bool) -> void:
print('Calling _set_audio %s' % playing)
get_tree().call_group("plays_audio", "_set_audio", playing)
func _on_toggle_pause(paused: bool) -> void:
print('Calling _set_paused %s' % paused)
get_tree().call_group("pausable", "_set_paused", paused)
func _on_Trolley_rogers_entered_trolley() -> void:
player.follower = null
@@ -65,18 +74,17 @@ func _on_GameTimer_timeout() -> void:
func _on_Trolley_left_wih_rogers(has_rogers) -> void:
if has_rogers:
if last_level:
end_game_label_title.text = 'You are very neighborly'
end_game_label_body.text = 'You saved all the neighbors in the land of make believe'
end_game_label_title.text = 'You are so neighborly'
end_game_label_body.text = 'You saved all the neighbors in the land of make believe!'
emit_signal("game_complete", true)
else:
end_game_label_title.text = 'You win'
end_game_label_body.text = 'Proceeding to level %s' % (level_num + 1)
emit_signal("game_complete", true)
end_game_panel.visible = true
else:
end_game_label_title.text = 'Oh no'
end_game_label_body.text = 'You were left in the land of make-believe'
emit_signal("game_complete", false)
end_game_panel.visible = true
# Sets up the level start
func _on_DisplayTimer_timeout() -> void:
@@ -87,11 +95,18 @@ func _on_DisplayTimer_timeout() -> void:
player.global_position = trolley.get_node("TrolleySeatArea/SeatAreaShape").global_position
for node in get_node("YSort").get_children():
if 'Neighbor' in node.name:
var err = node.connect("found_home", self, "_on_neighbor_found_home")
var neighbor = node as Neighbor
neighbor.set_level_navigation(level_navigation)
var err = neighbor.connect("found_home", self, "_on_neighbor_found_home")
total_neighbors += 1
print('Level loaded with %s neighbors' % total_neighbors)
gui.set_neighbor_count(total_neighbors)
player.set_camera_bounds(bounds.get_node("Top").global_position.y, bounds.get_node("Bottom").global_position.y, bounds.get_node("Left").global_position.x, bounds.get_node("Right").global_position.x)
var err = gui.connect("toggle_music", self, "_on_toggle_music")
print('toggle music error %s' % err) if err != 0 else print('')
err = gui.connect("toggle_pause", self, "_on_toggle_pause")
print('toggle music error %s' % err) if err != 0 else print('')
err = gui.get_node("GameTimer").connect("timeout", self, "_on_GameTimer_timeout")
print('toggle music error %s' % err) if err != 0 else print('')
# trolley.set_roger_body(player)
trolley.move_to_start(get_node("TrolleyLocations/TrolleyStart").global_position)
+68
View File
@@ -0,0 +1,68 @@
extends KinematicBody2D
class_name Car
enum CarState {
READY,
MOVING,
DONE
}
onready var car_sprite := $CarSprite
var state : int
var car_speed: int
var start_point: Vector2
var destination: Vector2
var velocity := Vector2.ZERO
var is_moving_to_left : bool
var rng := RandomNumberGenerator.new()
var collision_speed : Vector2
func start_engine(start: Vector2, end: Vector2, speed: int) -> void:
rng.randomize()
var rnd_num = rng.randi_range(1, 3)
start_point = start
destination = end
car_speed = speed
is_moving_to_left = destination.x < start_point.x
global_position = start_point
state = CarState.MOVING
car_sprite.texture = load("res://assets/car%s.png" % rnd_num)
collision_speed = Vector2(car_speed * 3, -10)
if not is_moving_to_left:
car_sprite.flip_h = true
func _ready() -> void:
state = CarState.READY
func _physics_process(delta: float) -> void:
match state:
CarState.READY:
_wait(delta)
CarState.MOVING:
_move(delta)
CarState.DONE:
_clean_up(delta)
func _wait(delta: float) -> void:
pass
func _move(delta: float) -> void:
velocity.x = car_speed if not is_moving_to_left else -car_speed
var collision := move_and_collide(velocity)
if collision:
var collider = collision.get_collider()
if collider.get_class() == "KinematicBody2D":
collider.move_and_collide(collision_speed)
if is_moving_to_left and global_position.x < destination.x or not is_moving_to_left and global_position.x > destination.x:
state = CarState.DONE
func _clean_up(delta: float) -> void:
print('Deleting my car self')
queue_free()
func _set_paused(paused: bool) -> void:
set_physics_process(!paused)
set_process(!paused)
+34
View File
@@ -0,0 +1,34 @@
extends Node2D
onready var spawn_timer := $SpawnTimer
onready var car_end_point := $CarEndPoint
export var SPAWN_FREQUENCY := 10
export var SPAWN_VARIANCE := 5
export var CAR_SPEED := 12
export var CAR_SPEED_VARIANCE := 6
var car_scene = preload("res://scenes/car.tscn")
var rng := RandomNumberGenerator.new()
func _ready() -> void:
rng.randomize()
var spawn_time := rng.randf_range((SPAWN_FREQUENCY - SPAWN_VARIANCE / 2), (SPAWN_FREQUENCY + SPAWN_VARIANCE / 2))
print('Waiting %s for car' % stepify(spawn_time, 0.1))
spawn_timer.start(spawn_time)
func _on_SpawnTimer_timeout() -> void:
var new_car_instance = car_scene.instance() as Car
get_parent().add_child(new_car_instance)
var rng_speed := rng.randf_range((CAR_SPEED - CAR_SPEED_VARIANCE / 2), (CAR_SPEED + CAR_SPEED_VARIANCE / 2))
print('Starting engine at %s' % stepify(rng_speed, 0.1))
new_car_instance.start_engine(global_position, car_end_point.global_position, rng_speed)
var spawn_time := rng.randf_range((SPAWN_FREQUENCY - SPAWN_VARIANCE / 2), (SPAWN_FREQUENCY + SPAWN_VARIANCE / 2))
print('Waiting %s for car' % stepify(spawn_time, 0.1))
spawn_timer.start(spawn_time)
func _set_paused(paused: bool) -> void:
set_physics_process(!paused)
set_process(!paused)
spawn_timer.paused = paused
+2 -2
View File
@@ -3,8 +3,8 @@ extends Node2D
onready var sprite := $Sprite
const SpriteAsset = {bush1 = "bush1", bush2 = "bush2", tree = "tree", lamppost = "lamppost"}
export var SPRITE_ASSET := SpriteAsset.bush1
const SpriteAsset = {bush1 = "bush1", bush2 = "bush2", tree = "tree", lamppost = "lamppost", stopsign = "stopsign"}
export var SPRITE_ASSET := SpriteAsset.tree
func _ready() -> void:
if SPRITE_ASSET in SpriteAsset:
+45
View File
@@ -0,0 +1,45 @@
extends Control
export var HEADER_TIME := 3.0
export var BODY_TIME := 8.0
signal done_reading()
onready var header_text := $ColorRect/VBoxContainer/HeaderText
onready var body_text := $ColorRect/VBoxContainer/BodyText
onready var text_timer := $TextTimer
var text_to_readout := 0
func _ready() -> void:
# This throws an error in the base level idk why
# if OS.is_debug_build():
# emit_signal("done_reading")
# else:
header_text.percent_visible = 0.0
body_text.percent_visible = 0.0
text_timer.start(1)
func _process(delta: float) -> void:
match text_to_readout:
1:
header_text.percent_visible = (HEADER_TIME - text_timer.time_left) / HEADER_TIME + 0.05
3:
body_text.percent_visible = (BODY_TIME - text_timer.time_left) / BODY_TIME + 0.05
func _on_TextTimer_timeout() -> void:
match text_to_readout:
0:
text_timer.start(HEADER_TIME)
1:
text_timer.start(1)
2:
text_timer.start(BODY_TIME)
3:
text_timer.start(1)
4:
emit_signal("done_reading")
text_to_readout += 1
+25
View File
@@ -0,0 +1,25 @@
extends Node2D
onready var text_timer := $TextTimer
onready var label := $MarginContainer/TipLabel
export var TIME_TO_READ := 3.0
export var LABEL_TEXT := ""
func _ready() -> void:
label.percent_visible = 0.0
label.bbcode_text = "[center][wave amp=10 freq=4]%s[/wave][/center]" % LABEL_TEXT
set_process(false)
func _process(delta: float) -> void:
if not text_timer.is_stopped():
var percent = TIME_TO_READ - text_timer.get_time_left()
label.percent_visible = percent
func _on_Area2D_body_entered(body: Node) -> void:
if body is Player:
text_timer.start(TIME_TO_READ)
set_process(true)
func _on_TextTimer_timeout() -> void:
set_process(false)
+11 -1
View File
@@ -6,10 +6,20 @@ onready var door_area = $DoorArea2D
signal come_home
var id : int
var NeighborSprite = {
0:"aberlin",
1:"chad",
2:"gary",
3:"maggie",
4:"sarah",
5:"steve",
6:"tim",
7:"tyler"
}
func _ready() -> void:
id = int(self.name[-1])
sprite.texture = load("res://assets/%sHouse.png" % NeighborSprite[id % 8])
func _on_DoorArea2D_body_entered(body: Node) -> void:
+40 -20
View File
@@ -1,6 +1,5 @@
extends Node2D
var level_path := "res://scenes/level{num}.tscn"
var level1 = preload("res://scenes/level1.tscn")
var current_level_num = 1
@@ -8,32 +7,53 @@ var current_level : Node
var max_levels := 3
var level_win := false
onready var end_timer := $EndTimer
onready var game_timer := $GameTimer
onready var game_screen_text := $GameScreenText
func _ready() -> void:
current_level = level1.instance()
add_child(current_level)
var err = current_level.get_child(0).connect("game_complete", self, "_on_level_complete")
func setup_next_level():
if current_level_num == 1:
current_level = level1.instance()
add_child(current_level)
else:
var new_level_path = level_path.format({"num": current_level_num})
var next_level = load(new_level_path).instance()
add_child(next_level)
if current_level != null:
current_level.queue_free()
current_level = next_level
var current_base_level = current_level.get_node("BaseLevel") as BaseLevel
current_base_level.display_start(current_level_num, current_level_num == max_levels)
var err = current_base_level.connect("game_complete", self, "_on_level_complete")
print(err)
func _on_level_complete(is_win: bool) -> void:
print('Level complete')
level_win = is_win
if current_level_num == max_levels:
end_timer.start(3.5)
game_timer.start(3.5)
else:
end_timer.start(2)
game_timer.start(2)
current_level_num += 1
func _on_EndTimer_timeout() -> void:
if level_win and current_level_num < max_levels:
current_level_num += 1
var new_level_path = level_path.format({"num": current_level_num})
var next_level = load(new_level_path).instance()
add_child(next_level)
current_level.queue_free()
current_level = next_level
var current_base_level = current_level.get_node("BaseLevel") as BaseLevel
current_base_level.display_start(current_level_num)
var err = current_base_level.connect("game_complete", self, "_on_level_complete")
func _on_GameTimer_timeout() -> void:
print('Timer done')
if level_win and current_level_num <= max_levels:
setup_next_level()
elif not level_win:
var header := game_screen_text.get_node("ColorRect/VBoxContainer/HeaderText")
var body := game_screen_text.get_node("ColorRect/VBoxContainer/BodyText")
header.text = "Seems you got lost in the world of make believe"
body.text = "I don't blame you, its a beautiful place"
if current_level != null:
current_level.queue_free()
else:
var header := game_screen_text.get_node("ColorRect/VBoxContainer/HeaderText")
var body := game_screen_text.get_node("ColorRect/VBoxContainer/BodyText")
header.text = "Now go out and meet some real neighbors"
body.text = "'In a way, youve already won in this world because youre the only one who can be you.'\n-Mister Rogers"
if current_level != null:
current_level.queue_free()
func _on_GameScreenText_done_reading() -> void:
setup_next_level()
+109 -7
View File
@@ -4,15 +4,33 @@ class_name Neighbor
signal found_home(id)
var NeighborSprite = {
0:"aberlin",
1:"chad",
2:"gary",
3:"maggie",
4:"sarah",
5:"steve",
6:"tim",
7:"tyler"
}
onready var roger_area := $RogerArea2D
onready var sprite := $AnimatedSprite
onready var wander_timer := $WanderTimer
onready var chevron_sprite := $ChevronSprite
onready var line_path := $LinePath
onready var path_dist_label := $PathDistanceLabel
onready var circle_sprite := $CircleSprite
export var MAX_SPEED := 225
export var ACCELERATION := 1000
export var FRICTION := 2000
export var MAX_FOLLOW_DISTANCE := 250
export var MIN_FOLLOW_DISTANCE := 80
export var DIST_PERCENT_AWAY_SHOW_CUTOFF := 0.65
var neighbor_sprite : int
var state = State.IDLE
var neighbor_velocity := Vector2.ZERO
var leader: KinematicBody2D
@@ -23,6 +41,10 @@ var matching_house_node : Node2D
var house_position := Vector2.ZERO
var house_direction := Vector2.ZERO
var id : int
var path: Array = []
var path_length: float
var calc_path := true
var level_navigation: Navigation2D setget set_level_navigation
var pop_effect_scene = preload("res://scenes/pop.tscn")
@@ -39,14 +61,24 @@ func reset_leads() -> void:
follower.reset_leads()
leader = null
follower = null
func set_level_navigation(node: Navigation2D) -> void:
level_navigation = node
func _ready() -> void:
path_dist_label.text = ''
id = int(self.name[-1])
rng.set_seed(id)
matching_house_node = get_parent().get_node("House%s" % id)
matching_house_node.connect("come_home", self, "_on_house_come_home")
circle_sprite.scale = Vector2((MAX_FOLLOW_DISTANCE / 16), (MAX_FOLLOW_DISTANCE / 16))
circle_sprite.set_modulate(Color(0,0,0,0))
_setup_animated_sprite()
func _physics_process(delta: float) -> void:
# if OS.is_debug_build():
# line_path.global_position = Vector2.ZERO
# chevron_sprite.visible = leader != null
house_position = matching_house_node.global_position
house_direction = (house_position - global_position).normalized()
match state:
@@ -63,12 +95,30 @@ func _move_state(delta: float) -> void:
if leader == null:
state = State.IDLE
return
var result_vector := leader.global_position - global_position
if result_vector.length() > 100:
else:
if (leader.global_position - global_position).length() <= 40.0:
# if OS.is_debug_build():
# chevron_sprite.rotation_degrees = rad2deg((global_position - leader.global_position).angle()) - 90
_move_neighbor(global_position - leader.global_position)
return
if calc_path:
path = level_navigation.get_simple_path(global_position, leader.global_position)
calc_path = false
path_length = _calc_points_length(path)
# if OS.is_debug_build():
# line_path.points = path
# path_dist_label.text = "%s" % path_length
else:
calc_path = true
var result_vector = path[1] - path[0] if len(path) >= 2 else leader.global_position - global_position
# if OS.is_debug_build():
# chevron_sprite.rotation_degrees = rad2deg((result_vector).angle()) - 90
if path_length > MIN_FOLLOW_DISTANCE:
_move_neighbor(result_vector)
else:
state = State.IDLE
if result_vector.length() > 250:
_set_circle_indicator(result_vector.length())
if result_vector.length() > MAX_FOLLOW_DISTANCE or path_length > MAX_FOLLOW_DISTANCE * 1.75:
leader.follower = null
leader = null
if follower != null:
@@ -83,13 +133,18 @@ func _wander_state(delta: float) -> void:
_move_neighbor(wander_direction, true)
func _idle_state(delta: float) -> void:
if wander_timer.is_stopped():
if leader == null and len(line_path.points) != 0:
line_path.points = []
circle_sprite.set_modulate(Color(0,0,0,0))
if wander_timer.is_stopped() and leader == null:
wander_timer.start(rng.randf_range(1.8, 6.5))
sprite.play("idle")
# Connect to roger or neighbor following roger
for body in roger_area.get_overlapping_bodies():
if body.is_class("KinematicBody2D") and not body is Trolley and leader == null and body.follower == null and body.leader != null:
if body.is_class("KinematicBody2D") and not body is Trolley and not body is Car and leader == null and body.follower == null and body.leader != null:
leader = body
leader.follower = self
if leader != null:
state = State.MOVE
@@ -112,14 +167,18 @@ func _move_neighbor(direction_vector: Vector2, is_walk: bool = false) -> void:
else:
neighbor_velocity = neighbor_velocity.move_toward(Vector2.ZERO, FRICTION * get_physics_process_delta_time())
neighbor_velocity = move_and_slide(neighbor_velocity)
neighbor_velocity = move_and_slide(neighbor_velocity, Vector2( 0, 0 ), false, 4, 0.785398, false)
for i in get_slide_count():
var collision := get_slide_collision(i)
if "Trolley" in collision.collider.name or "Car" in collision.collider.name:
state = State.IDLE
func _on_RogerArea2D_body_entered(body: Node) -> void:
if body != self and leader == null:
if body is Player and body.follower == null:
body.follower = self
leader = body
elif body.is_class("KinematicBody2D") and not body is Trolley and body.follower == null:
elif body.is_class("KinematicBody2D") and not body is Trolley and not body is Car and body.follower == null:
if body.leader != null:
leader = body
leader.follower = self
@@ -152,3 +211,46 @@ func _on_house_come_home() -> void:
leader.follower = follower
follower.leader = leader
state = State.FOUND_HOME
func _set_circle_indicator(length: float) -> void:
# begin to show circle when neighbor is approaching max
if length / MAX_FOLLOW_DISTANCE >= DIST_PERCENT_AWAY_SHOW_CUTOFF:
# returns a value between 0 and 1 based on the cutoff value
var percent_visible = ((length / MAX_FOLLOW_DISTANCE) - DIST_PERCENT_AWAY_SHOW_CUTOFF) / (1 - DIST_PERCENT_AWAY_SHOW_CUTOFF)
circle_sprite.set_modulate(Color(percent_visible, percent_visible / 2, percent_visible / 2, percent_visible))
else:
circle_sprite.set_modulate(Color(0,0,0,0))
func _setup_animated_sprite() -> void:
var name = NeighborSprite[id % 8]
var sprite_frames := SpriteFrames.new()
# add animations
sprite_frames.add_animation("idle")
sprite_frames.add_animation("run")
sprite_frames.add_animation("walk")
# idle
sprite_frames.add_frame("idle", load("res://assets/%s.png" % name))
# walk
sprite_frames.add_frame("walk", load("res://assets/runningSprites/%s/%s1.png" % [name, name.capitalize()]))
sprite_frames.add_frame("walk", load("res://assets/runningSprites/%s/%s2.png" % [name, name.capitalize()]))
sprite_frames.add_frame("walk", load("res://assets/%s.png" % name))
# run
for i in range(8):
sprite_frames.add_frame("run", load("res://assets/runningSprites/%s/%s%s.png" % [name, name.capitalize(), i]))
sprite_frames.set_animation_speed("run", 8.0)
sprite.frames = sprite_frames
func _calc_points_length(points: PoolVector2Array) -> float:
var sum_vector := Vector2.ZERO
if len(points) == 0:
return (MAX_FOLLOW_DISTANCE + 1) as float
var current_point = points[0]
points.remove(0)
for point in points:
sum_vector += point - current_point
return sum_vector.length()
func _set_paused(paused: bool) -> void:
set_physics_process(!paused)
set_process(!paused)
wander_timer.paused = paused
+10 -3
View File
@@ -18,7 +18,7 @@ onready var gui := $GUI
enum State {
MOVE,
IDLE
IDLE,
}
func set_camera_bounds(up: int, down: int, left: int, right: int):
@@ -59,8 +59,11 @@ func _move_state(delta: float) -> void:
else:
player_velocity = player_velocity.move_toward(Vector2.ZERO, FRICTION * delta)
player_velocity = move_and_slide(player_velocity)
player_velocity = move_and_slide(player_velocity, Vector2( 0, 0 ), false, 4, 0.785398, false)
for i in get_slide_count():
var collision := get_slide_collision(i)
if "Trolley" in collision.collider.name or "Car" in collision.collider.name:
state = State.IDLE
if player_velocity == Vector2.ZERO:
state = State.IDLE
@@ -70,3 +73,7 @@ func _idle_state(delta: float) -> void:
state = State.MOVE
else:
sprite.set_animation("idle")
func _set_paused(paused: bool) -> void:
set_physics_process(!paused)
set_process(!paused)
+35 -6
View File
@@ -7,7 +7,12 @@ signal rogers_entered_trolley()
signal left_wih_rogers(has_rogers)
onready var trolley_closed_shape = $TrolleyClosedShape
onready var timer := $Timer
onready var player := $AudioStreamPlayer2D
onready var smoke := $SmokeParticles
export var MAX_VELOCITY = 8
export var MAX_PITCH_SOUND := 1.25
var velocity := Vector2.ZERO
var state = State.STOPPED
@@ -16,6 +21,8 @@ var destination := Vector2.ZERO
var house_position : Vector2
var arrival_time: int
var en_route_length: float
var roger: Player
var audio_enabled := false
enum State {
MOVE_TO_START,
@@ -28,12 +35,14 @@ func set_trolley_open(trolley_open: bool) -> void:
trolley_closed_shape.set_deferred("disabled", trolley_open)
func move_to_start(start_pos: Vector2) -> void:
# smoke.set_param(CPUParticles2D.PARAM_INITIAL_LINEAR_VELOCITY, 160.0)
state = State.MOVE_TO_START
destination = start_pos
velocity = Vector2(MAX_VELOCITY, 0)
set_trolley_open(false)
func move_to_end(end_pos: Vector2, seconds_to_exit) -> void:
smoke.set_param(CPUParticles2D.PARAM_INITIAL_LINEAR_VELOCITY, 100.0)
state = State.EN_ROUTE
destination = end_pos
velocity = Vector2.ZERO
@@ -43,11 +52,17 @@ func move_to_end(end_pos: Vector2, seconds_to_exit) -> void:
func move_to_leave() -> void:
if state != State.LEAVING:
smoke.set_param(CPUParticles2D.PARAM_INITIAL_LINEAR_VELOCITY, 160.0)
set_trolley_open(false)
emit_signal("left_wih_rogers", has_roger)
state = State.LEAVING
timer.start(2)
#func set_roger_body(body: Player) -> void:
# roger = body
func _physics_process(delta: float) -> void:
if not player.playing and audio_enabled:
player.play()
match state:
State.MOVE_TO_START:
_decelerate_to_start(delta)
@@ -74,7 +89,8 @@ func _decelerate_to_start(delta: float) -> void:
func _stop(delta: float) -> void:
pass
if smoke.get_param(CPUParticles2D.PARAM_INITIAL_LINEAR_VELOCITY) > 25:
smoke.set_param(CPUParticles2D.PARAM_INITIAL_LINEAR_VELOCITY, 25.0)
func _en_route(delta: float) -> void:
velocity.x = en_route_length / arrival_time * delta
@@ -86,11 +102,13 @@ func _en_route(delta: float) -> void:
return
collider.move_and_collide(velocity * 3)
if global_position.x >= destination.x:
set_trolley_open(false)
state = State.LEAVING
set_trolley_open(true)
state = State.STOPPED
func _leaving(delta: float) -> void:
var new_speed = move_toward(player.get_pitch_scale(), MAX_PITCH_SOUND, delta / 2)
player.set_pitch_scale(new_speed)
velocity.x = min(move_toward(velocity.x, (destination.x + 200), delta * 10), MAX_VELOCITY)
var collision := move_and_collide(velocity)
if collision:
@@ -108,9 +126,20 @@ func _on_TrolleySeatArea_body_entered(body: Node) -> void:
trolley_closed_shape.set_deferred("disabled", false)
emit_signal("rogers_entered_trolley")
func _on_TrolleySurroundingArea_body_exited(body_rid: RID, body: Node, body_shape_index: int, local_shape_index: int) -> void:
if body is Player:
has_roger = false
emit_signal("rogers_left_trolley")
func _on_Timer_timeout() -> void:
timer.stop()
emit_signal("left_wih_rogers", has_roger)
func _set_audio(enabled: bool) -> void:
audio_enabled = enabled
func _set_paused(paused: bool) -> void:
set_physics_process(!paused)
set_process(!paused)
smoke.set_speed_scale(0 if paused else 1)
timer.paused = paused