Lots of polish things and wrapping up all three levels
This commit is contained in:
+2
-3
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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
@@ -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, you’ve already won in this world because you’re 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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user