feat: new music, fall through tut, simple enemy fix
This commit is contained in:
parent
c614d27d80
commit
005e08d8cb
BIN
assets/music/A Hearty Fellow (LOOP).wav
Normal file
BIN
assets/music/A Hearty Fellow (LOOP).wav
Normal file
Binary file not shown.
23
assets/music/A Hearty Fellow (LOOP).wav.import
Normal file
23
assets/music/A Hearty Fellow (LOOP).wav.import
Normal file
@ -0,0 +1,23 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamSample"
|
||||
path="res://.import/A Hearty Fellow (LOOP).wav-b10165296f3511361f079abd27ec7839.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/music/A Hearty Fellow (LOOP).wav"
|
||||
dest_files=[ "res://.import/A Hearty Fellow (LOOP).wav-b10165296f3511361f079abd27ec7839.sample" ]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=true
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=true
|
||||
edit/loop_mode=2
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=2257418
|
||||
compress/mode=0
|
||||
BIN
assets/music/The Laboratory (LOOP).wav
Normal file
BIN
assets/music/The Laboratory (LOOP).wav
Normal file
Binary file not shown.
23
assets/music/The Laboratory (LOOP).wav.import
Normal file
23
assets/music/The Laboratory (LOOP).wav.import
Normal file
@ -0,0 +1,23 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamSample"
|
||||
path="res://.import/The Laboratory (LOOP).wav-5748dc6d7773ecac01dc5ad34e4f1207.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/music/The Laboratory (LOOP).wav"
|
||||
dest_files=[ "res://.import/The Laboratory (LOOP).wav-5748dc6d7773ecac01dc5ad34e4f1207.sample" ]
|
||||
|
||||
[params]
|
||||
|
||||
force/8_bit=false
|
||||
force/mono=true
|
||||
force/max_rate=false
|
||||
force/max_rate_hz=44100
|
||||
edit/trim=false
|
||||
edit/normalize=true
|
||||
edit/loop_mode=2
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=3664710
|
||||
compress/mode=0
|
||||
@ -4385,7 +4385,7 @@ texture = SubResource( 62 )
|
||||
offset = Vector2( 1, 0 )
|
||||
hframes = 6
|
||||
vframes = 6
|
||||
frame = 8
|
||||
frame = 6
|
||||
__meta__ = {
|
||||
"_editor_description_": "YXNlcHJpdGVfd2l6YXJkX2NvbmZpZwpwbGF5ZXJ8PUJsb2JieVNwcml0ZS9CbG9iYnltYXRpb25QbGF5ZXIKc291cmNlfD1yZXM6Ly9hc3NldHMvYmxvYmJ5L2Jsb2JieS1zcHJpdGVzaGVldHQuYXNlcHJpdGUKbGF5ZXJ8PUJsb2JieQpvcF9leHB8PUZhbHNlCm9fZm9sZGVyfD0Kb19uYW1lfD0Kb25seV92aXNpYmxlfD1GYWxzZQpvX2V4X3B8PQo="
|
||||
}
|
||||
|
||||
@ -6,29 +6,29 @@ export var speed := 80
|
||||
export var acceleration := 80
|
||||
|
||||
func _ready() -> void:
|
||||
$StompDetector.monitoring = !invincible
|
||||
$StompDetector.monitoring = !invincible
|
||||
|
||||
|
||||
# TODO Only moves when on screen
|
||||
func _physics_process(delta: float) -> void:
|
||||
velocity.y += _gravity * delta
|
||||
var player_direction := player_on_floor_direction()
|
||||
if(player_direction != 0):
|
||||
velocity.x = PhysicsFunc.two_step_euler(velocity.x, acceleration * player_direction,
|
||||
mass, delta)
|
||||
velocity.x = clamp(velocity.x, -speed, speed)
|
||||
else:
|
||||
velocity.x = PhysicsFunc.two_step_euler(velocity.x, acceleration * -sign(velocity.x),
|
||||
mass, delta)
|
||||
velocity.y += _gravity * delta
|
||||
var player_direction := player_on_floor_direction()
|
||||
if(player_direction != 0):
|
||||
velocity.x = PhysicsFunc.two_step_euler(velocity.x, acceleration * player_direction,
|
||||
mass, delta)
|
||||
velocity.x = clamp(velocity.x, -speed, speed)
|
||||
else:
|
||||
velocity.x = PhysicsFunc.two_step_euler(velocity.x, acceleration * -sign(velocity.x),
|
||||
mass, delta)
|
||||
|
||||
|
||||
velocity.y = move_and_slide(velocity, FLOOR_NORMAL).y
|
||||
velocity.y = move_and_slide(velocity, FLOOR_NORMAL).y
|
||||
|
||||
# TODO Detects player over gaps
|
||||
func player_on_floor_direction() -> float:
|
||||
for raycast in $LedgeDetectorRays.get_children():
|
||||
if raycast.is_colliding():
|
||||
var collider = raycast.get_collider()
|
||||
if collider.is_in_group("player"):
|
||||
return sign(collider.position.x - self.position.x)
|
||||
return 0.0
|
||||
for raycast in $LedgeDetectorRays.get_children():
|
||||
if raycast.is_colliding():
|
||||
var collider = raycast.get_collider()
|
||||
if collider.is_in_group("player"):
|
||||
return sign(collider.position.x - self.position.x)
|
||||
return 0.0
|
||||
|
||||
@ -38,125 +38,125 @@ var detect_timer := 0.0
|
||||
|
||||
|
||||
func _ready():
|
||||
spawn_avoidance_raycasts(16, 20)
|
||||
target_lost_timer = Timer.new()
|
||||
target_lost_timer.set_one_shot(true)
|
||||
target_lost_timer.connect("timeout", self, "lose_target")
|
||||
add_child(target_lost_timer)
|
||||
update_navigation_timer = Timer.new()
|
||||
update_navigation_timer.connect("timeout", self, "update_navigation")
|
||||
add_child(update_navigation_timer)
|
||||
update_navigation_timer.start(0.3)
|
||||
# TODO Hat immer den Spawn im Patrolpath
|
||||
patrol_waypoints.append(global_position)
|
||||
for waypoint in $PatrolPath.get_children():
|
||||
patrol_waypoints.append(waypoint.global_position)
|
||||
pass
|
||||
spawn_avoidance_raycasts(16, 20)
|
||||
target_lost_timer = Timer.new()
|
||||
target_lost_timer.set_one_shot(true)
|
||||
target_lost_timer.connect("timeout", self, "lose_target")
|
||||
add_child(target_lost_timer)
|
||||
update_navigation_timer = Timer.new()
|
||||
update_navigation_timer.connect("timeout", self, "update_navigation")
|
||||
add_child(update_navigation_timer)
|
||||
update_navigation_timer.start(0.3)
|
||||
# TODO Hat immer den Spawn im Patrolpath
|
||||
patrol_waypoints.append(global_position)
|
||||
for waypoint in $PatrolPath.get_children():
|
||||
patrol_waypoints.append(waypoint.global_position)
|
||||
pass
|
||||
|
||||
func searching() -> Vector2:
|
||||
slow_down_factor = patrolling_slowdown
|
||||
if(aggressive && detect_timer > 0.33):
|
||||
detect_player()
|
||||
detect_timer = 0.0
|
||||
if(patrolling && nav_agent.is_target_reached()):
|
||||
next_waypoint = get_next_patrol_target()
|
||||
update_navigation()
|
||||
elif(patrolling):
|
||||
next_waypoint = patrol_waypoints[patrol_waypoint_index]
|
||||
else:
|
||||
# Spawn location
|
||||
return patrol_waypoints[0]
|
||||
return nav_agent.get_next_location()
|
||||
slow_down_factor = patrolling_slowdown
|
||||
if(aggressive && detect_timer > 0.33):
|
||||
detect_player()
|
||||
detect_timer = 0.0
|
||||
if(patrolling && nav_agent.is_target_reached()):
|
||||
next_waypoint = get_next_patrol_target()
|
||||
update_navigation()
|
||||
elif(patrolling):
|
||||
next_waypoint = patrol_waypoints[patrol_waypoint_index]
|
||||
else:
|
||||
# Spawn location
|
||||
return patrol_waypoints[0]
|
||||
return nav_agent.get_next_location()
|
||||
|
||||
func get_next_patrol_target() -> Vector2:
|
||||
var waypoint_count = patrol_waypoints.size()
|
||||
for wp in patrol_waypoints:
|
||||
if next_waypoint == wp:
|
||||
patrol_waypoint_index = patrol_waypoint_index + 1 if patrol_waypoint_index < waypoint_count - 1 else 0
|
||||
return patrol_waypoints[patrol_waypoint_index]
|
||||
patrol_waypoint_index = 0
|
||||
return patrol_waypoints[0]
|
||||
var waypoint_count = patrol_waypoints.size()
|
||||
for wp in patrol_waypoints:
|
||||
if next_waypoint == wp:
|
||||
patrol_waypoint_index = patrol_waypoint_index + 1 if patrol_waypoint_index < waypoint_count - 1 else 0
|
||||
return patrol_waypoints[patrol_waypoint_index]
|
||||
patrol_waypoint_index = 0
|
||||
return patrol_waypoints[0]
|
||||
|
||||
func hunting() -> Vector2:
|
||||
slow_down_factor = 1.0
|
||||
if(detect_timer > 0.33):
|
||||
detect_player()
|
||||
detect_timer = 0.0
|
||||
next_waypoint = players[0].global_position - Vector2(0,9)
|
||||
return nav_agent.get_next_location()
|
||||
|
||||
slow_down_factor = 1.0
|
||||
if(detect_timer > 0.33):
|
||||
detect_player()
|
||||
detect_timer = 0.0
|
||||
next_waypoint = players[0].global_position - Vector2(0,9)
|
||||
return nav_agent.get_next_location()
|
||||
|
||||
func detect_player() -> void:
|
||||
var player
|
||||
if(players.empty()):
|
||||
# print("no player found")
|
||||
return
|
||||
player = players[0]
|
||||
#TODO Depends on height of blobby sprite since blobbys bottom and not his middle is on y=0
|
||||
vision_raycast.cast_to = (player.global_position - global_position - Vector2(0,9)).normalized() * 16 * vision_distance
|
||||
var ray_angle_to_facing = vision_raycast.cast_to.angle_to(orientation.cast_to)
|
||||
vision_raycast.force_raycast_update()
|
||||
var collider = vision_raycast.get_collider()
|
||||
if(abs(ray_angle_to_facing) < PI/2-deg2rad(blindspot_angle) && collider != null && collider.is_in_group("player")):
|
||||
target_lost_timer.stop()
|
||||
target = collider
|
||||
# print("target found")
|
||||
elif(target != null && target_lost_timer.is_stopped()):
|
||||
target_lost_timer.start(loose_target_seconds)
|
||||
var player
|
||||
if(players.empty()):
|
||||
# print("no player found")
|
||||
return
|
||||
player = players[0]
|
||||
#TODO Depends on height of blobby sprite since blobbys bottom and not his middle is on y=0
|
||||
vision_raycast.cast_to = (player.global_position - global_position - Vector2(0,9)).normalized() * 16 * vision_distance
|
||||
var ray_angle_to_facing = vision_raycast.cast_to.angle_to(orientation.cast_to)
|
||||
vision_raycast.force_raycast_update()
|
||||
var collider = vision_raycast.get_collider()
|
||||
if(abs(ray_angle_to_facing) < PI/2-deg2rad(blindspot_angle) && collider != null && collider.is_in_group("player")):
|
||||
target_lost_timer.stop()
|
||||
target = collider
|
||||
# print("target found")
|
||||
elif(target != null && target_lost_timer.is_stopped()):
|
||||
target_lost_timer.start(loose_target_seconds)
|
||||
|
||||
func execute_movement(delta: float) -> void:
|
||||
detect_timer += delta
|
||||
var next_direction = lerp(previous_direction, path_direction - global_position, 0.5)
|
||||
previous_direction = next_direction
|
||||
orientation.cast_to = Vector2(sign(next_direction.x),0)*50
|
||||
var avoidance_obstacle_distance = average_collision_vector(avoidance_raycasts)
|
||||
next_direction = next_direction.normalized() + avoidance_obstacle_distance.rotated(PI).normalized()
|
||||
# TODO Make parameters more tunable
|
||||
velocity = move_and_slide(PhysicsFunc.two_step_euler_vec(velocity, next_direction.normalized() * acceleration * slow_down_factor, weight, delta)
|
||||
,FLOOR_NORMAL, false, 4, 0.785398,false)
|
||||
velocity = velocity/max((velocity.length()/(max_speed*slow_down_factor)),1)
|
||||
detect_timer += delta
|
||||
var next_direction = lerp(previous_direction, path_direction - global_position, 0.5)
|
||||
previous_direction = next_direction
|
||||
orientation.cast_to = Vector2(sign(next_direction.x),0)*50
|
||||
var avoidance_obstacle_distance = average_collision_vector(avoidance_raycasts)
|
||||
next_direction = next_direction.normalized() + avoidance_obstacle_distance.rotated(PI).normalized()
|
||||
# TODO Make parameters more tunable
|
||||
velocity = move_and_slide(PhysicsFunc.two_step_euler_vec(velocity, next_direction.normalized() * acceleration * slow_down_factor, weight, delta)
|
||||
,FLOOR_NORMAL, false, 4, 0.785398,false)
|
||||
velocity = velocity/max((velocity.length()/(max_speed*slow_down_factor)),1)
|
||||
|
||||
func average_collision_vector(var raycasts: Array) -> Vector2:
|
||||
var total_distances = Vector2()
|
||||
for raycast in raycasts:
|
||||
if !raycast.is_colliding():
|
||||
continue
|
||||
var collision_point = self.to_local(raycast.get_collision_point())
|
||||
total_distances += collision_point
|
||||
return total_distances/raycasts.size()
|
||||
var total_distances = Vector2()
|
||||
for raycast in raycasts:
|
||||
if !raycast.is_colliding():
|
||||
continue
|
||||
var collision_point = self.to_local(raycast.get_collision_point())
|
||||
total_distances += collision_point
|
||||
return total_distances/raycasts.size()
|
||||
|
||||
func spawn_avoidance_raycasts(var raycount: int, var length: float = 24) -> void:
|
||||
var direction: float = 0
|
||||
while direction <= 2*PI:
|
||||
var raycast: RayCast2D = RayCast2D.new()
|
||||
raycast.enabled = true
|
||||
raycast.exclude_parent = true
|
||||
raycast.collide_with_areas = true
|
||||
raycast.collide_with_bodies = true
|
||||
# Layers 4, 5 & 6
|
||||
raycast.collision_mask = 56
|
||||
raycast.cast_to = Vector2(length, 0).rotated(direction)
|
||||
add_child(raycast)
|
||||
avoidance_raycasts.append(raycast)
|
||||
direction += (2*PI)/raycount
|
||||
var direction: float = 0
|
||||
while direction <= 2*PI:
|
||||
var raycast: RayCast2D = RayCast2D.new()
|
||||
raycast.enabled = true
|
||||
raycast.exclude_parent = true
|
||||
raycast.collide_with_areas = true
|
||||
raycast.collide_with_bodies = true
|
||||
# Layers 4, 5 & 6
|
||||
raycast.collision_mask = 56
|
||||
raycast.cast_to = Vector2(length, 0).rotated(direction)
|
||||
add_child(raycast)
|
||||
avoidance_raycasts.append(raycast)
|
||||
direction += (2*PI)/raycount
|
||||
|
||||
# Checks the feeler ray for collisions and returns collision or null
|
||||
func check_feeler(v: Vector2, _offset = Vector2(0,0)) -> Object:
|
||||
var prev_position = feeler_raycast.position
|
||||
feeler_raycast.position += _offset
|
||||
feeler_raycast.cast_to = v
|
||||
feeler_raycast.force_raycast_update()
|
||||
feeler_raycast.position = prev_position
|
||||
return feeler_raycast.get_collider()
|
||||
var prev_position = feeler_raycast.position
|
||||
feeler_raycast.position += _offset
|
||||
feeler_raycast.cast_to = v
|
||||
feeler_raycast.force_raycast_update()
|
||||
feeler_raycast.position = prev_position
|
||||
return feeler_raycast.get_collider()
|
||||
|
||||
func lose_target() -> void:
|
||||
# print("flyer target lost")
|
||||
target = null
|
||||
# print("flyer target lost")
|
||||
target = null
|
||||
|
||||
func update_navigation() -> void:
|
||||
nav_agent.set_target_location(next_waypoint)
|
||||
nav_agent.set_target_location(next_waypoint)
|
||||
|
||||
func die() -> void:
|
||||
queue_free()
|
||||
queue_free()
|
||||
|
||||
func get_facing_direction() -> float:
|
||||
return orientation.cast_to.x
|
||||
return orientation.cast_to.x
|
||||
|
||||
@ -2,17 +2,17 @@ extends Enemy
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
set_physics_process(false)
|
||||
velocity.x = -40
|
||||
set_physics_process(false)
|
||||
velocity.x = -40
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
velocity.y += _gravity * delta
|
||||
if is_on_wall() or is_at_ledge():
|
||||
velocity.x *= -1.0
|
||||
velocity.y = move_and_slide(velocity, FLOOR_NORMAL).y
|
||||
velocity.y += _gravity * delta
|
||||
if is_on_wall() or is_at_ledge():
|
||||
velocity.x *= -1.0
|
||||
velocity.y = move_and_slide(velocity, FLOOR_NORMAL).y
|
||||
|
||||
func is_at_ledge():
|
||||
for raycast in $LedgeDetectorRays.get_children():
|
||||
if !raycast.is_colliding():
|
||||
return true
|
||||
return false
|
||||
for raycast in $LedgeDetectorRays.get_children():
|
||||
if !raycast.is_colliding():
|
||||
return true
|
||||
return false
|
||||
|
||||
@ -7,10 +7,10 @@
|
||||
extents = Vector2( 15, 7.5 )
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=2]
|
||||
extents = Vector2( 15.4794, 6.68174 )
|
||||
extents = Vector2( 15.4794, 1.5 )
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=3]
|
||||
extents = Vector2( 15.534, 10.0962 )
|
||||
extents = Vector2( 16.5049, 10.0962 )
|
||||
|
||||
[node name="SimpleEnemy" type="KinematicBody2D" groups=["harmful"]]
|
||||
collision_layer = 2
|
||||
@ -29,7 +29,7 @@ rect = Rect2( -89, -10, 2, 20 )
|
||||
process_parent = true
|
||||
physics_process_parent = true
|
||||
|
||||
[node name="EnemyBody" type="CollisionShape2D" parent="." groups=["harmful"]]
|
||||
[node name="EnemyBody" type="CollisionShape2D" parent="."]
|
||||
position = Vector2( -4.76837e-07, 4.5 )
|
||||
shape = SubResource( 1 )
|
||||
|
||||
@ -40,6 +40,7 @@ collision_layer = 2
|
||||
input_pickable = false
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="StompDetector"]
|
||||
position = Vector2( 0, -2.55905 )
|
||||
shape = SubResource( 2 )
|
||||
|
||||
[node name="LedgeDetectorRays" type="Node2D" parent="."]
|
||||
@ -59,12 +60,14 @@ collision_mask = 120
|
||||
|
||||
[node name="EnemySkin" type="Area2D" parent="." groups=["player"]]
|
||||
process_priority = -1
|
||||
collision_mask = 126
|
||||
collision_layer = 2
|
||||
collision_mask = 9
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionShape2D" parent="EnemySkin"]
|
||||
position = Vector2( 5.96046e-07, 2.5 )
|
||||
position = Vector2( -1.42109e-14, 3 )
|
||||
scale = Vector2( 1.03, 1.04 )
|
||||
shape = SubResource( 3 )
|
||||
|
||||
[connection signal="body_entered" from="StompDetector" to="." method="_on_StompDetector_body_entered"]
|
||||
[connection signal="area_entered" from="EnemySkin" to="." method="_on_EnemySkin_area_entered"]
|
||||
[connection signal="body_entered" from="EnemySkin" to="." method="_on_EnemySkin_body_entered"]
|
||||
|
||||
@ -10,23 +10,23 @@ export(String, FILE, "*.tscn") var next_scene
|
||||
|
||||
|
||||
func _get_configuration_warning() -> String:
|
||||
return "The next scene property can't be empty" if not next_scene else ""
|
||||
return "The next scene property can't be empty" if not next_scene else ""
|
||||
|
||||
func level_completion() -> void:
|
||||
GlobalState.remove_savepoint(levelName)
|
||||
signal_manager.emit_signal("level_completed")
|
||||
|
||||
GlobalState.remove_savepoint(levelName)
|
||||
signal_manager.emit_signal("level_completed")
|
||||
|
||||
|
||||
func teleport() -> void:
|
||||
GlobalAudio.play_scene_independent("res://assets/sounds/MAGIC_SPELL_Morphing_Synth_Harp_Scales_stereo.wav", "Music", -8)
|
||||
get_tree().paused = true
|
||||
anim_player.play("fade_in")
|
||||
# TODO This doesn't pause the game but should
|
||||
yield(anim_player, "animation_finished")
|
||||
if ResourceLoader.exists(next_scene):
|
||||
get_tree().change_scene(next_scene)
|
||||
GlobalAudio.play_scene_independent("res://assets/sounds/MAGIC_SPELL_Morphing_Synth_Harp_Scales_stereo.wav", "Music", -15)
|
||||
get_tree().paused = true
|
||||
anim_player.play("fade_in")
|
||||
# TODO This doesn't pause the game but should
|
||||
yield(anim_player, "animation_finished")
|
||||
if ResourceLoader.exists(next_scene):
|
||||
get_tree().change_scene(next_scene)
|
||||
|
||||
|
||||
func _on_body_entered(_body: Node) -> void:
|
||||
level_completion()
|
||||
teleport()
|
||||
level_completion()
|
||||
teleport()
|
||||
|
||||
@ -12,41 +12,41 @@ export var elevator_time := 30
|
||||
var activatable = false
|
||||
|
||||
func _ready() -> void:
|
||||
get_back_timer.wait_time = elevator_time
|
||||
elevator.get_node("./portal").frame = 1
|
||||
elevator.monitoring = false
|
||||
get_back_timer.wait_time = elevator_time
|
||||
elevator.get_node("./portal").frame = 1
|
||||
elevator.monitoring = false
|
||||
|
||||
func _process(delta):
|
||||
if activatable && Input.is_action_just_released("interact"):
|
||||
selfActivate()
|
||||
signal_manager.emit_signal("terminal_activated", elevator_time)
|
||||
get_back_timer.start()
|
||||
if activatable && Input.is_action_just_released("interact"):
|
||||
selfActivate()
|
||||
signal_manager.emit_signal("terminal_activated", elevator_time)
|
||||
get_back_timer.start()
|
||||
|
||||
|
||||
func selfActivate():
|
||||
indicatorPlayer.play("onning")
|
||||
buttonPlayer.play("pushing")
|
||||
elevator.get_node("./portal").frame = 0
|
||||
elevator.monitoring = true
|
||||
#TODO dis importante
|
||||
activatorArea.set_deferred("monitoring", false)
|
||||
$GetBackMusic.play()
|
||||
indicatorPlayer.play("onning")
|
||||
buttonPlayer.play("pushing")
|
||||
elevator.get_node("./portal").frame = 0
|
||||
elevator.monitoring = true
|
||||
#TODO dis importante
|
||||
activatorArea.set_deferred("monitoring", false)
|
||||
$GetBackMusic.play()
|
||||
|
||||
|
||||
func _on_ActivatorArea_area_entered(area:Area2D) -> void:
|
||||
$Label.visible = true
|
||||
$Label.text = " Time: " + String(elevator_time) + " sec"
|
||||
$Highlight.visible = true
|
||||
activatable = true
|
||||
$Label.visible = true
|
||||
$Label.text = " Time: " + String(elevator_time) + " sec"
|
||||
$Highlight.visible = true
|
||||
activatable = true
|
||||
|
||||
func _on_ActivatorArea_area_exited(area:Area2D) -> void:
|
||||
unactivatable_timer.start()
|
||||
unactivatable_timer.start()
|
||||
|
||||
func _on_Timer_timeout():
|
||||
$Label.visible = false
|
||||
$Highlight.visible = false
|
||||
activatable = false
|
||||
$Label.visible = false
|
||||
$Highlight.visible = false
|
||||
activatable = false
|
||||
|
||||
|
||||
func _on_GetBackTimer_timeout() -> void:
|
||||
signal_manager.emit_signal("getback_timer_up")
|
||||
signal_manager.emit_signal("getback_timer_up")
|
||||
|
||||
@ -152,7 +152,7 @@ one_shot = true
|
||||
[node name="GetBackMusic" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 5 )
|
||||
volume_db = -10.655
|
||||
volume_db = -15.0
|
||||
bus = "Music"
|
||||
|
||||
[connection signal="area_entered" from="ActivatorArea" to="." method="_on_ActivatorArea_area_entered"]
|
||||
|
||||
@ -24,83 +24,87 @@ var time_since_last_exec := 0.0
|
||||
var saved_coeff:= 0.0
|
||||
|
||||
func _ready():
|
||||
# TODO This could probably fuck something up later? For other randomness based events
|
||||
randomize()
|
||||
# thread = Thread.new()
|
||||
# TODO This could probably fuck something up later? For other randomness based events
|
||||
randomize()
|
||||
# thread = Thread.new()
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
# TODO This should be in the settings and applied to all shaders
|
||||
time_since_last_exec += delta
|
||||
# if thread.is_alive():
|
||||
# print("was_running")
|
||||
# return
|
||||
# if thread.is_active():
|
||||
# thread.wait_to_finish()
|
||||
if time_since_last_exec <= 1.0/fps_limit:
|
||||
return
|
||||
# thread.start(self, "grass_wave_update", delta)
|
||||
grass_wave_update(delta)
|
||||
# TODO This should be in the settings and applied to all shaders
|
||||
time_since_last_exec += delta
|
||||
# if thread.is_alive():
|
||||
# print("was_running")
|
||||
# return
|
||||
# if thread.is_active():
|
||||
# thread.wait_to_finish()
|
||||
if time_since_last_exec <= 1.0/fps_limit:
|
||||
return
|
||||
# thread.start(self, "grass_wave_update", delta)
|
||||
grass_wave_update(delta)
|
||||
|
||||
|
||||
func grass_wave_update(delta: float) -> void:
|
||||
time_since_last_exec = 0.0
|
||||
var distance: float = abs(global_position.x - blobby.global_position.x + 6)
|
||||
var v_distance: float = abs(global_position.y - blobby.global_position.y + 11)
|
||||
#if (distance > draft_radius * 2 || v_distance > v_radius * 2):
|
||||
# return
|
||||
#Velocity relative to the grass, increasing distance is - velocity
|
||||
var blobby_vel = (last_distance.x - distance)/delta
|
||||
var blobby_vert_vel = (last_distance.y - v_distance)/delta
|
||||
var direction: Vector2 = Vector2(sign(global_position.x - blobby.global_position.x + 6),0)
|
||||
# TODO This only gets more and more unreadable *facepalm*
|
||||
var power = smoothstep(radius, 0, distance)
|
||||
var v_power = smoothstep(v_radius, 0, v_distance)
|
||||
var draft_power = smoothstep(draft_radius, radius, distance)
|
||||
time_since_last_exec = 0.0
|
||||
var distance: float = abs(global_position.x - blobby.global_position.x + 6)
|
||||
var v_distance: float = abs(global_position.y - blobby.global_position.y + 11)
|
||||
#if (distance > draft_radius * 2 || v_distance > v_radius * 2):
|
||||
# return
|
||||
#Velocity relative to the grass, increasing distance is - velocity
|
||||
var blobby_vel = (last_distance.x - distance)/delta
|
||||
var blobby_vert_vel = (last_distance.y - v_distance)/delta
|
||||
var direction: Vector2 = Vector2(sign(global_position.x - blobby.global_position.x + 6),0)
|
||||
# TODO This only gets more and more unreadable *facepalm*
|
||||
var power = smoothstep(radius, 0, distance)
|
||||
var v_power = smoothstep(v_radius, 0, v_distance)
|
||||
var draft_power = smoothstep(draft_radius, radius, distance)
|
||||
|
||||
if (distance >= radius && distance <= draft_radius && blobby_vel < -0.1 && v_distance < 14):
|
||||
displacement_coeff += direction * (draft_power/radius) * blobby_vel * interact_power
|
||||
saved_displacement = displacement_coeff.x
|
||||
is_idle_swinging = false
|
||||
$Timer.stop()
|
||||
|
||||
# TODO v_distance could be a problem for upside down stuff
|
||||
elif (distance < radius && distance > 1 && abs(blobby_vel) > 0.1 && v_distance < 14 && abs(blobby_vert_vel) < 0.1):
|
||||
displacement_coeff += direction * power/radius * 0.3 * blobby_vel * interact_power
|
||||
displacement_coeff += direction * power * 2 * interact_power
|
||||
saved_displacement = displacement_coeff.x
|
||||
is_idle_swinging = false
|
||||
$Timer.stop()
|
||||
if (distance >= radius && distance <= draft_radius && blobby_vel < -0.1 && v_distance < 14):
|
||||
displacement_coeff += direction * (draft_power/radius) * blobby_vel * interact_power
|
||||
saved_displacement = displacement_coeff.x
|
||||
is_idle_swinging = false
|
||||
$Timer.stop()
|
||||
|
||||
# TODO v_distance could be a problem for upside down stuff
|
||||
elif (distance < radius && distance > 1 && abs(blobby_vel) > 0.1 && v_distance < 14 && abs(blobby_vert_vel) < 0.1):
|
||||
displacement_coeff += direction * power/radius * 0.3 * blobby_vel * interact_power
|
||||
displacement_coeff += direction * power * 2 * interact_power
|
||||
saved_displacement = displacement_coeff.x
|
||||
is_idle_swinging = false
|
||||
$Timer.stop()
|
||||
|
||||
elif (v_distance < v_radius && distance < radius && abs(blobby_vert_vel) > 0.1):
|
||||
displacement_coeff += direction * v_power/v_radius * blobby_vert_vel * interact_power
|
||||
saved_displacement = displacement_coeff.x
|
||||
is_idle_swinging = false
|
||||
$Timer.stop()
|
||||
elif (v_distance < v_radius && distance < radius && abs(blobby_vert_vel) > 0.1):
|
||||
displacement_coeff += direction * v_power/v_radius * blobby_vert_vel * interact_power
|
||||
saved_displacement = displacement_coeff.x
|
||||
is_idle_swinging = false
|
||||
$Timer.stop()
|
||||
|
||||
else:
|
||||
if(abs(displacement_coeff.x) > 0.1 && !is_idle_swinging || !$Timer.is_stopped()):
|
||||
if($Timer.is_stopped()):
|
||||
saved_displacement = displacement_coeff.x
|
||||
$Timer.start()
|
||||
var t = $Timer.get_wait_time() - $Timer.get_time_left()
|
||||
displacement_coeff.x = saved_displacement * exp(-0.66 * t) * cos(t * 3.0 * rand)
|
||||
start_swing_time = time
|
||||
begin_idle = true
|
||||
else:
|
||||
$Timer.stop()
|
||||
is_idle_swinging = true
|
||||
var start = displacement_coeff.x if begin_idle else 0.0
|
||||
displacement_coeff.x = start * exp(-0.2 * (time-start_swing_time)) + 0.3 * -sin(2.0*(time - start_swing_time))
|
||||
begin_idle = false
|
||||
else:
|
||||
if(abs(displacement_coeff.x) > 0.1 && !is_idle_swinging || !$Timer.is_stopped()):
|
||||
if($Timer.is_stopped()):
|
||||
saved_displacement = displacement_coeff.x
|
||||
$Timer.start()
|
||||
var t = $Timer.get_wait_time() - $Timer.get_time_left()
|
||||
displacement_coeff.x = saved_displacement * exp(-0.66 * t) * cos(t * 3.0 * rand)
|
||||
start_swing_time = time
|
||||
begin_idle = true
|
||||
else:
|
||||
$Timer.stop()
|
||||
is_idle_swinging = true
|
||||
var start = displacement_coeff.x if begin_idle else 0.0
|
||||
displacement_coeff.x = start * exp(-0.2 * (time-start_swing_time)) + 0.3 * -sin(2.0*(time - start_swing_time))
|
||||
begin_idle = false
|
||||
# if(displacement_coeff.x > saved_coeff):
|
||||
# print(displacement_coeff.x)
|
||||
# saved_coeff = displacement_coeff.x
|
||||
for polygon in get_children():
|
||||
if polygon is Polygon2D:
|
||||
polygon.material.set_shader_param("displacement_coefficient_x",
|
||||
clamp(displacement_coeff.x, -max_displacement, max_displacement))
|
||||
break
|
||||
for polygon in get_children():
|
||||
if polygon is Polygon2D:
|
||||
polygon.material.set_shader_param("displacement_coefficient_x",
|
||||
clamp(displacement_coeff.x, -max_displacement, max_displacement))
|
||||
break
|
||||
|
||||
last_distance = Vector2(distance, v_distance)
|
||||
time += delta
|
||||
last_distance = Vector2(distance, v_distance)
|
||||
time += delta
|
||||
|
||||
|
||||
func _on_Area2D_body_entered(body: Node) -> void:
|
||||
$AudioStreamPlayer2D.play()
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=9 format=2]
|
||||
[gd_scene load_steps=12 format=2]
|
||||
|
||||
[ext_resource path="res://assets/environment/decor/straight_straw.png" type="Texture" id=1]
|
||||
[ext_resource path="res://src/Environment/Grass/ShaderGrass.gd" type="Script" id=2]
|
||||
@ -8,6 +8,14 @@
|
||||
[ext_resource path="res://assets/environment/decor/bent_straw_2.png" type="Texture" id=6]
|
||||
[ext_resource path="res://assets/environment/decor/bent_straw_leftt.png" type="Texture" id=7]
|
||||
[ext_resource path="res://assets/environment/decor/bent_straw_left_2.png" type="Texture" id=8]
|
||||
[ext_resource path="res://assets/sounds/grass swish 4.ogg" type="AudioStream" id=9]
|
||||
|
||||
[sub_resource type="AudioStreamRandomPitch" id=2]
|
||||
audio_stream = ExtResource( 9 )
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id=1]
|
||||
radius = 5.0
|
||||
height = 4.18096
|
||||
|
||||
[node name="ShaderGrass" type="Node2D"]
|
||||
script = ExtResource( 2 )
|
||||
@ -71,3 +79,20 @@ polygons = [ PoolIntArray( 0, 6, 7 ), PoolIntArray( 0, 1, 6 ), PoolIntArray( 1,
|
||||
[node name="Timer" type="Timer" parent="."]
|
||||
wait_time = 4.0
|
||||
one_shot = true
|
||||
|
||||
[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."]
|
||||
stream = SubResource( 2 )
|
||||
volume_db = -22.0
|
||||
bus = "Effects"
|
||||
|
||||
[node name="Area2D" type="Area2D" parent="."]
|
||||
collision_layer = 0
|
||||
collision_mask = 3
|
||||
monitorable = false
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
|
||||
position = Vector2( 4.67196, 7.11315 )
|
||||
rotation = 1.56773
|
||||
shape = SubResource( 1 )
|
||||
|
||||
[connection signal="body_entered" from="Area2D" to="." method="_on_Area2D_body_entered"]
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
[ext_resource path="res://src/Utilities/SignalManager.tscn" type="PackedScene" id=10]
|
||||
[ext_resource path="res://src/Actors/Friendlies/WhatAreFrog.tscn" type="PackedScene" id=11]
|
||||
[ext_resource path="res://src/Environment/Grass/ShaderGrass.tscn" type="PackedScene" id=12]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=13]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=14]
|
||||
[ext_resource path="res://src/UserInterface/TutorialThingy.tscn" type="PackedScene" id=15]
|
||||
[ext_resource path="res://assets/effects/pixelDissolve.gdshader" type="Shader" id=16]
|
||||
[ext_resource path="res://assets/effects/noise.png" type="Texture" id=17]
|
||||
@ -147,6 +147,9 @@ __meta__ = {
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 14 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 10 )]
|
||||
|
||||
[node name="LevelState" parent="." instance=ExtResource( 6 )]
|
||||
@ -162,12 +165,15 @@ wait_time = 20.0
|
||||
position = Vector2( 0, -2.27374e-13 )
|
||||
|
||||
[node name="JumpTut" parent="Tutorials" instance=ExtResource( 15 )]
|
||||
position = Vector2( 576, -15 )
|
||||
position = Vector2( 1, 0 )
|
||||
tutorial_text = "Press to jump:"
|
||||
|
||||
[node name="Button" parent="Tutorials/JumpTut" index="0"]
|
||||
material = SubResource( 11 )
|
||||
|
||||
[node name="StartTutorialArea" parent="Tutorials/JumpTut" index="5"]
|
||||
position = Vector2( 562, -19 )
|
||||
|
||||
[node name="CollisionShape2D" parent="Tutorials/JumpTut/StartTutorialArea" index="0"]
|
||||
position = Vector2( -24.5, 0 )
|
||||
|
||||
@ -213,7 +219,7 @@ position = Vector2( -70, 1 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 6
|
||||
frame = 7
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 14 )
|
||||
@ -559,13 +565,6 @@ position = Vector2( 742, 36 )
|
||||
[node name="ShaderGrass29" parent="Decor" instance=ExtResource( 12 )]
|
||||
position = Vector2( 785, 36 )
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 13 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[node name="Mine" parent="." instance=ExtResource( 18 )]
|
||||
visible = false
|
||||
position = Vector2( 24, -69 )
|
||||
|
||||
@ -18,9 +18,9 @@
|
||||
[ext_resource path="res://src/UserInterface/TutorialThingy.tscn" type="PackedScene" id=16]
|
||||
[ext_resource path="res://assets/effects/noise.png" type="Texture" id=17]
|
||||
[ext_resource path="res://src/BenefitialObjects/SavePoint.tscn" type="PackedScene" id=18]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=19]
|
||||
[ext_resource path="res://src/ObstacleObjects/Mine.tscn" type="PackedScene" id=20]
|
||||
[ext_resource path="res://assets/obstacle object/SpikyMinePlant.png" type="Texture" id=21]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=22]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=6]
|
||||
|
||||
@ -1018,6 +1018,9 @@ __meta__ = {
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 22 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 10 )]
|
||||
|
||||
[node name="LevelState" parent="." instance=ExtResource( 9 )]
|
||||
@ -1141,13 +1144,6 @@ material = SubResource( 14 )
|
||||
[node name="SavePoint" parent="." instance=ExtResource( 18 )]
|
||||
position = Vector2( 1168, -88 )
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 19 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[node name="Mine" parent="." instance=ExtResource( 20 )]
|
||||
position = Vector2( 456, 24 )
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
[ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://src/Environment/Grass/ShaderGrass.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=5]
|
||||
[ext_resource path="res://src/Utilities/SignalManager.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://src/UserInterface/UserInterface.tscn" type="PackedScene" id=7]
|
||||
[ext_resource path="res://src/Utilities/LevelState.tscn" type="PackedScene" id=8]
|
||||
@ -18,7 +19,6 @@
|
||||
[ext_resource path="res://src/Platforms/FlyingPlatformSmol.tscn" type="PackedScene" id=17]
|
||||
[ext_resource path="res://src/UserInterface/TutorialComboThingy.tscn" type="PackedScene" id=18]
|
||||
[ext_resource path="res://assets/effects/noise.png" type="Texture" id=19]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=20]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=6]
|
||||
|
||||
@ -108,6 +108,9 @@ __meta__ = {
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 5 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 6 )]
|
||||
|
||||
[node name="LevelState" parent="." instance=ExtResource( 8 )]
|
||||
@ -128,6 +131,9 @@ unique_name_in_owner = true
|
||||
position = Vector2( -180, 113 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 7
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 6 )
|
||||
|
||||
@ -198,10 +204,10 @@ goal_state = "runToJump"
|
||||
tutorial_text = "Move and press to runjump:"
|
||||
press_limit = 1
|
||||
|
||||
[node name="Button1" parent="TutorialComboThingy" index="0"]
|
||||
[node name="Button1" parent="TutorialComboThingy" index="1"]
|
||||
material = SubResource( 14 )
|
||||
|
||||
[node name="Button2" parent="TutorialComboThingy" index="1"]
|
||||
[node name="Button2" parent="TutorialComboThingy" index="2"]
|
||||
material = SubResource( 14 )
|
||||
|
||||
[node name="CollisionShape2D" parent="TutorialComboThingy/StartTutorialArea" index="0"]
|
||||
@ -216,13 +222,6 @@ goal_state = "runToJump"
|
||||
tutorial_text = "Move and press to runjump:"
|
||||
press_limit = 1
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 20 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[node name="Decor" type="Node2D" parent="."]
|
||||
|
||||
[node name="ShaderGrass" parent="Decor" instance=ExtResource( 3 )]
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
[ext_resource path="res://src/Actors/Enemies/DartingEnemy.tscn" type="PackedScene" id=17]
|
||||
[ext_resource path="res://src/Contraptions/Triggers/GateButton.tscn" type="PackedScene" id=18]
|
||||
[ext_resource path="res://src/Platforms/FlyingLaserCutter.tscn" type="PackedScene" id=19]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=20]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=21]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=6]
|
||||
|
||||
@ -53,6 +53,9 @@ __meta__ = {
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 21 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 5 )]
|
||||
|
||||
[node name="LevelState" parent="." instance=ExtResource( 6 )]
|
||||
@ -73,6 +76,9 @@ unique_name_in_owner = true
|
||||
position = Vector2( -70, 1 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 7
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 6 )
|
||||
|
||||
@ -178,13 +184,6 @@ position = Vector2( 609, 67 )
|
||||
speed = 300
|
||||
acceleration = 800
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 20 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"]
|
||||
|
||||
[editable path="SignalManager"]
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
[ext_resource path="res://src/Platforms/FlyingPlatformSmol.tscn" type="PackedScene" id=12]
|
||||
[ext_resource path="res://src/Actors/Enemies/Flyer.tscn" type="PackedScene" id=13]
|
||||
[ext_resource path="res://src/BenefitialObjects/Coin.tscn" type="PackedScene" id=14]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=15]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=16]
|
||||
[ext_resource path="res://src/Contraptions/VendingMachine.tscn" type="PackedScene" id=19]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=7]
|
||||
@ -51,6 +51,9 @@ __meta__ = {
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 16 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 5 )]
|
||||
|
||||
[node name="LevelState" parent="." instance=ExtResource( 7 )]
|
||||
@ -133,13 +136,6 @@ position = Vector2( 0, 23 )
|
||||
[node name="Position2D3" parent="Flyer/PatrolPath" index="1"]
|
||||
position = Vector2( 0, -25 )
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 15 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"]
|
||||
|
||||
[editable path="SignalManager"]
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=44 format=2]
|
||||
[gd_scene load_steps=24 format=2]
|
||||
|
||||
[ext_resource path="res://src/Environment/GreenHouseTiles.tres" type="TileSet" id=1]
|
||||
[ext_resource path="res://src/Environment/DropThroughPlatforms.tres" type="TileSet" id=2]
|
||||
@ -12,17 +12,14 @@
|
||||
[ext_resource path="res://src/Actors/BlobbyCam.tscn" type="PackedScene" id=10]
|
||||
[ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=11]
|
||||
[ext_resource path="res://src/Contraptions/GateBlock.tscn" type="PackedScene" id=12]
|
||||
[ext_resource path="res://src/Actors/Enemies/Flyer.gd" type="Script" id=13]
|
||||
[ext_resource path="res://src/StateMachines/FlyerStateMachine.gd" type="Script" id=14]
|
||||
[ext_resource path="res://assets/meta/new_dynamicfont.tres" type="DynamicFont" id=15]
|
||||
[ext_resource path="res://assets/enemy/flyer-sheet.png" type="Texture" id=16]
|
||||
[ext_resource path="res://src/Actors/Enemies/Flyer.tscn" type="PackedScene" id=13]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=14]
|
||||
[ext_resource path="res://src/Actors/Friendlies/BoundFrog.gd" type="Script" id=17]
|
||||
[ext_resource path="res://src/Actors/Friendlies/WhatAreFrog.tscn" type="PackedScene" id=18]
|
||||
[ext_resource path="res://src/Contraptions/Rope/RopeAnchor.tscn" type="PackedScene" id=19]
|
||||
[ext_resource path="res://src/Contraptions/Triggers/GateButton.tscn" type="PackedScene" id=20]
|
||||
[ext_resource path="res://src/Contraptions/Triggers/FrogFreeButton.tscn" type="PackedScene" id=21]
|
||||
[ext_resource path="res://src/BenefitialObjects/Coin.tscn" type="PackedScene" id=22]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=23]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=53]
|
||||
|
||||
@ -49,192 +46,7 @@
|
||||
0/shapes = [ ]
|
||||
0/z_index = 0
|
||||
|
||||
[sub_resource type="Animation" id=33]
|
||||
length = 0.001
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:frame")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 0,
|
||||
"values": [ 0 ]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id=34]
|
||||
resource_name = "hunting"
|
||||
length = 1.62
|
||||
loop = true
|
||||
step = 0.01
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:frame")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 1,
|
||||
"values": [ 0 ]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/path = NodePath(".:scale")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/keys = {
|
||||
"times": PoolRealArray( 0 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 1,
|
||||
"values": [ Vector2( -1, 1 ) ]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id=35]
|
||||
resource_name = "huntingLeft"
|
||||
length = 0.042
|
||||
loop = true
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:frame")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 1,
|
||||
"values": [ 0 ]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/path = NodePath(".:scale")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/keys = {
|
||||
"times": PoolRealArray( 0 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 1,
|
||||
"values": [ Vector2( 1, 1 ) ]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id=36]
|
||||
resource_name = "searching"
|
||||
length = 1.62
|
||||
loop = true
|
||||
step = 0.01
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:frame")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0.02 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 1,
|
||||
"values": [ 1 ]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/path = NodePath(".:scale")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/keys = {
|
||||
"times": PoolRealArray( 0 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 1,
|
||||
"values": [ Vector2( -1, 1 ) ]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id=37]
|
||||
resource_name = "searchingLeft"
|
||||
length = 1.62
|
||||
loop = true
|
||||
step = 0.01
|
||||
tracks/0/type = "value"
|
||||
tracks/0/path = NodePath(".:frame")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"times": PoolRealArray( 0 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 1,
|
||||
"values": [ 1 ]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/path = NodePath(".:scale")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/keys = {
|
||||
"times": PoolRealArray( 0 ),
|
||||
"transitions": PoolRealArray( 1 ),
|
||||
"update": 1,
|
||||
"values": [ Vector2( 1, 1 ) ]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=52]
|
||||
animation = "huntingLeft"
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=39]
|
||||
animation = "hunting"
|
||||
|
||||
[sub_resource type="AnimationNodeBlendSpace1D" id=23]
|
||||
blend_point_0/node = SubResource( 52 )
|
||||
blend_point_0/pos = -1.0
|
||||
blend_point_1/node = SubResource( 39 )
|
||||
blend_point_1/pos = 1.0
|
||||
min_space = -1.18
|
||||
max_space = 1.15
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=40]
|
||||
animation = "searchingLeft"
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=41]
|
||||
animation = "searching"
|
||||
|
||||
[sub_resource type="AnimationNodeBlendSpace1D" id=9]
|
||||
blend_point_0/node = SubResource( 40 )
|
||||
blend_point_0/pos = -1.0
|
||||
blend_point_1/node = SubResource( 41 )
|
||||
blend_point_1/pos = 1.0
|
||||
min_space = -2.0
|
||||
max_space = 2.0
|
||||
snap = 1.0
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id=27]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id=32]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachine" id=42]
|
||||
states/hunting/node = SubResource( 23 )
|
||||
states/hunting/position = Vector2( 184.952, -12 )
|
||||
states/searching/node = SubResource( 9 )
|
||||
states/searching/position = Vector2( -52.0952, 102.762 )
|
||||
transitions = [ "searching", "hunting", SubResource( 27 ), "hunting", "searching", SubResource( 32 ) ]
|
||||
start_node = "searching"
|
||||
graph_offset = Vector2( -333, -104 )
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=43]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=44]
|
||||
extents = Vector2( 10, 7.5 )
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=45]
|
||||
extents = Vector2( 15, 5.12039 )
|
||||
|
||||
[sub_resource type="RectangleShape2D" id=46]
|
||||
extents = Vector2( 18.2143, 14.3338 )
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=54]
|
||||
|
||||
[node name="LevelTemplate" type="Node2D"]
|
||||
script = ExtResource( 4 )
|
||||
@ -243,6 +55,9 @@ __meta__ = {
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 14 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 5 )]
|
||||
|
||||
[node name="LevelState" parent="." instance=ExtResource( 7 )]
|
||||
@ -264,6 +79,9 @@ unique_name_in_owner = true
|
||||
position = Vector2( -142, 17 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 7
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 53 )
|
||||
|
||||
@ -298,6 +116,18 @@ position = Vector2( -40, 40 )
|
||||
scale = Vector2( 0.5, 0.5 )
|
||||
next_scene = "res://src/Levels/Actual Level 1.tscn"
|
||||
|
||||
[node name="Flyer" parent="." instance=ExtResource( 13 )]
|
||||
position = Vector2( -64, 81 )
|
||||
|
||||
[node name="AnimationTree" parent="Flyer/FlyerSprite" index="1"]
|
||||
parameters/playback = SubResource( 54 )
|
||||
|
||||
[node name="Position2D2" parent="Flyer/PatrolPath" index="0"]
|
||||
position = Vector2( 58, -1 )
|
||||
|
||||
[node name="Position2D3" parent="Flyer/PatrolPath" index="1"]
|
||||
position = Vector2( -32, -1 )
|
||||
|
||||
[node name="GateBlock" parent="." instance=ExtResource( 12 )]
|
||||
position = Vector2( -28, 28 )
|
||||
|
||||
@ -315,130 +145,6 @@ position = Vector2( 0, 1 )
|
||||
[node name="RopeAnchor" parent="BoundFrog" instance=ExtResource( 19 )]
|
||||
position = Vector2( 68, 7 )
|
||||
|
||||
[node name="Flyer" type="KinematicBody2D" parent="." groups=["frogfood", "harmful"]]
|
||||
position = Vector2( -40, 86 )
|
||||
collision_layer = 258
|
||||
collision_mask = 25
|
||||
script = ExtResource( 13 )
|
||||
vision_distance = 10.0
|
||||
loose_target_seconds = 5.0
|
||||
patrolling = true
|
||||
acceleration = 70
|
||||
max_speed = 80
|
||||
weight = 0.3
|
||||
|
||||
[node name="Statemachine" type="Node2D" parent="Flyer"]
|
||||
script = ExtResource( 14 )
|
||||
|
||||
[node name="StateLabel" type="Label" parent="Flyer"]
|
||||
visible = false
|
||||
show_behind_parent = true
|
||||
margin_left = -36.0
|
||||
margin_top = -30.0
|
||||
margin_right = 37.0
|
||||
margin_bottom = -16.0
|
||||
custom_colors/font_color = Color( 1, 1, 1, 1 )
|
||||
custom_colors/font_outline_modulate = Color( 0, 0, 0, 1 )
|
||||
custom_fonts/font = ExtResource( 15 )
|
||||
text = "Ihre Werbung"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="FlyerSprite" type="Sprite" parent="Flyer"]
|
||||
scale = Vector2( -1, 1 )
|
||||
texture = ExtResource( 16 )
|
||||
hframes = 2
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="Flyer/FlyerSprite"]
|
||||
anims/RESET = SubResource( 33 )
|
||||
anims/hunting = SubResource( 34 )
|
||||
anims/huntingLeft = SubResource( 35 )
|
||||
anims/searching = SubResource( 36 )
|
||||
anims/searchingLeft = SubResource( 37 )
|
||||
|
||||
[node name="AnimationTree" type="AnimationTree" parent="Flyer/FlyerSprite"]
|
||||
tree_root = SubResource( 42 )
|
||||
anim_player = NodePath("../AnimationPlayer")
|
||||
active = true
|
||||
root_motion_track = NodePath(".")
|
||||
parameters/playback = SubResource( 43 )
|
||||
parameters/hunting/blend_position = -1.04288
|
||||
parameters/searching/blend_position = 1.2903
|
||||
|
||||
[node name="VisibilityEnabler2D" type="VisibilityEnabler2D" parent="Flyer"]
|
||||
visible = false
|
||||
position = Vector2( 954, 0 )
|
||||
scale = Vector2( 10.84, 0.899 )
|
||||
rect = Rect2( -89, -10, 2, 20 )
|
||||
process_parent = true
|
||||
physics_process_parent = true
|
||||
|
||||
[node name="FeelerRayCast" type="RayCast2D" parent="Flyer"]
|
||||
visible = false
|
||||
enabled = true
|
||||
cast_to = Vector2( 0, -1 )
|
||||
collision_mask = 56
|
||||
collide_with_areas = true
|
||||
|
||||
[node name="EnemyBody" type="CollisionShape2D" parent="Flyer" groups=["harmful"]]
|
||||
position = Vector2( 0, -0.5 )
|
||||
shape = SubResource( 44 )
|
||||
|
||||
[node name="NavigationAgent2D" type="NavigationAgent2D" parent="Flyer"]
|
||||
path_desired_distance = 8.0
|
||||
target_desired_distance = 8.0
|
||||
|
||||
[node name="cshape" type="Node2D" parent="Flyer"]
|
||||
visible = false
|
||||
position = Vector2( 0, -3.8147e-06 )
|
||||
scale = Vector2( 0.1, 0.1 )
|
||||
|
||||
[node name="pjoint" type="PinJoint2D" parent="Flyer/cshape"]
|
||||
scale = Vector2( 0.3, 0.3 )
|
||||
bias = 0.108
|
||||
softness = 0.1
|
||||
|
||||
[node name="StompDetector" type="Area2D" parent="Flyer" groups=["weakpoint"]]
|
||||
visible = false
|
||||
modulate = Color( 0, 0.0392157, 1, 1 )
|
||||
position = Vector2( 0, -1.90735e-06 )
|
||||
scale = Vector2( 0.7, 0.7 )
|
||||
collision_layer = 2
|
||||
input_pickable = false
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Flyer/StompDetector"]
|
||||
position = Vector2( -4.76837e-07, 1.56134 )
|
||||
shape = SubResource( 45 )
|
||||
|
||||
[node name="EnemySkin" type="Area2D" parent="Flyer"]
|
||||
process_priority = -1
|
||||
visible = false
|
||||
scale = Vector2( 0.7, 0.7 )
|
||||
collision_layer = 2
|
||||
collision_mask = 126
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionShape2D" parent="Flyer/EnemySkin"]
|
||||
shape = SubResource( 46 )
|
||||
|
||||
[node name="PatrolPath" type="Node2D" parent="Flyer"]
|
||||
|
||||
[node name="Position2D2" type="Position2D" parent="Flyer/PatrolPath"]
|
||||
position = Vector2( -24, -6 )
|
||||
|
||||
[node name="Position2D3" type="Position2D" parent="Flyer/PatrolPath"]
|
||||
position = Vector2( 24, -6 )
|
||||
|
||||
[node name="Orientation" type="RayCast2D" parent="Flyer"]
|
||||
cast_to = Vector2( -1, 0 )
|
||||
collision_mask = 0
|
||||
collide_with_bodies = false
|
||||
|
||||
[node name="VisionRayCast" type="RayCast2D" parent="Flyer"]
|
||||
enabled = true
|
||||
cast_to = Vector2( 0, -1 )
|
||||
collision_mask = 9
|
||||
collide_with_areas = true
|
||||
|
||||
[node name="FrogFreeButton" parent="." instance=ExtResource( 21 )]
|
||||
position = Vector2( 6, 0 )
|
||||
|
||||
@ -449,16 +155,8 @@ position = Vector2( 48, 91 )
|
||||
position = Vector2( 207, -4 )
|
||||
z_index = -1
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 23 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"]
|
||||
[connection signal="child_exiting_tree" from="BoundFrog/WhatAreFrog" to="BoundFrog" method="_on_WhatAreFrog_child_exiting_tree"]
|
||||
[connection signal="body_entered" from="Flyer/StompDetector" to="Flyer" method="_on_StompDetector_body_entered"]
|
||||
[connection signal="button_pushed" from="FrogFreeButton" to="BoundFrog" method="_on_FrogFreeButton_pushed"]
|
||||
|
||||
[editable path="SignalManager"]
|
||||
@ -467,4 +165,5 @@ bus = "Music"
|
||||
[editable path="UserInterface/HUD"]
|
||||
[editable path="BlobbyCam"]
|
||||
[editable path="Blobby"]
|
||||
[editable path="Flyer"]
|
||||
[editable path="BoundFrog/RopeAnchor"]
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=22 format=2]
|
||||
[gd_scene load_steps=23 format=2]
|
||||
|
||||
[ext_resource path="res://src/Actors/Enemies/DartingEnemy.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://src/Utilities/SignalManager.tscn" type="PackedScene" id=2]
|
||||
@ -15,8 +15,9 @@
|
||||
[ext_resource path="res://src/UserInterface/UserInterface.tscn" type="PackedScene" id=13]
|
||||
[ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=14]
|
||||
[ext_resource path="res://src/Actors/Blobby/Blobby.tscn" type="PackedScene" id=15]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=16]
|
||||
[ext_resource path="res://src/UserInterface/TutorialComboThingy.tscn" type="PackedScene" id=16]
|
||||
[ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=17]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=18]
|
||||
[ext_resource path="res://src/Levels/Templates/LevelTemplate.gd" type="Script" id=19]
|
||||
[ext_resource path="res://src/Environment/Grass/ShaderGrass.tscn" type="PackedScene" id=20]
|
||||
[ext_resource path="res://src/Environment/Legacy/Greenhouse.tscn" type="PackedScene" id=21]
|
||||
@ -29,6 +30,10 @@ __meta__ = {
|
||||
"_edit_horizontal_guides_": [ 464.0 ],
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
level_music = "res://assets/music/The Laboratory (LOOP).wav"
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 18 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 2 )]
|
||||
|
||||
@ -49,6 +54,9 @@ unique_name_in_owner = true
|
||||
position = Vector2( 251, -24 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 5
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 1 )
|
||||
|
||||
@ -75,6 +83,14 @@ position = Vector2( 441, -71 )
|
||||
loose_target_seconds = 2.0
|
||||
max_speed = 110
|
||||
|
||||
[node name="TutorialComboThingy" parent="." instance=ExtResource( 16 )]
|
||||
visible = false
|
||||
position = Vector2( 432, 135 )
|
||||
action1 = "duck"
|
||||
action2 = "jump"
|
||||
goal_state = "ducking"
|
||||
tutorial_text = "duck and jump to fall through"
|
||||
|
||||
[node name="DropThroughPlatform" parent="." instance=ExtResource( 7 )]
|
||||
tile_data = PoolIntArray( 786466, 1, 0, 786467, 0, 0, 786469, 2, 0 )
|
||||
|
||||
@ -449,13 +465,6 @@ scale = Vector2( 1, 1.5 )
|
||||
position = Vector2( 48, -7 )
|
||||
scale = Vector2( 1, 1.5 )
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 16 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"]
|
||||
[connection signal="button_pushed" from="FrogFreeButton" to="BoundFrog" method="_on_FrogFreeButton_pushed"]
|
||||
|
||||
|
||||
@ -16,10 +16,10 @@
|
||||
[ext_resource path="res://src/ObstacleObjects/Spikes.tscn" type="PackedScene" id=14]
|
||||
[ext_resource path="res://src/Contraptions/Triggers/ElevatorButton.tscn" type="PackedScene" id=15]
|
||||
[ext_resource path="res://src/Platforms/FlyingLaserCutter.tscn" type="PackedScene" id=16]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=17]
|
||||
[ext_resource path="res://src/BenefitialObjects/Coin.tscn" type="PackedScene" id=18]
|
||||
[ext_resource path="res://src/Environment/Grass/ShaderGrass.tscn" type="PackedScene" id=19]
|
||||
[ext_resource path="res://src/Environment/Legacy/Greenhouse.tscn" type="PackedScene" id=20]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=21]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=6]
|
||||
|
||||
@ -31,6 +31,10 @@ __meta__ = {
|
||||
"_edit_horizontal_guides_": [ 464.0 ],
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
level_music = "res://assets/music/The Laboratory (LOOP).wav"
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 21 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 1 )]
|
||||
|
||||
@ -47,12 +51,6 @@ wait_time = 20.0
|
||||
unique_name_in_owner = true
|
||||
drag_margin_bottom = 0.3
|
||||
|
||||
[node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"]
|
||||
frame = 3
|
||||
|
||||
[node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"]
|
||||
frame = 5
|
||||
|
||||
[node name="Blobby" parent="." instance=ExtResource( 5 )]
|
||||
unique_name_in_owner = true
|
||||
position = Vector2( 3.8147e-06, 144 )
|
||||
@ -358,13 +356,6 @@ scale = Vector2( 1, 1.5 )
|
||||
position = Vector2( 1044, 225 )
|
||||
x_target = 48
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 17 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"]
|
||||
[connection signal="button_pushed" from="FrogFreeButton" to="BoundFrog" method="_on_FrogFreeButton_pushed"]
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
[ext_resource path="res://src/UserInterface/UserInterface.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://src/Levels/Templates/LevelTemplate.gd" type="Script" id=7]
|
||||
[ext_resource path="res://src/Contraptions/Portal/Portal.tscn" type="PackedScene" id=8]
|
||||
[ext_resource path="res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav" type="AudioStream" id=9]
|
||||
[ext_resource path="res://src/Utilities/SceneAudio.tscn" type="PackedScene" id=10]
|
||||
[ext_resource path="res://src/ObstacleObjects/Mine.tscn" type="PackedScene" id=11]
|
||||
[ext_resource path="res://src/Platforms/FlyingLaserCutter.tscn" type="PackedScene" id=12]
|
||||
[ext_resource path="res://src/Platforms/legacy/DropThroughPlatform.tscn" type="PackedScene" id=13]
|
||||
@ -29,6 +29,10 @@ __meta__ = {
|
||||
"_edit_horizontal_guides_": [ 464.0 ],
|
||||
"_edit_vertical_guides_": [ 2880.0 ]
|
||||
}
|
||||
level_music = "res://assets/music/The Laboratory (LOOP).wav"
|
||||
|
||||
[node name="SceneAudio" parent="." instance=ExtResource( 10 )]
|
||||
visible = false
|
||||
|
||||
[node name="SignalManager" parent="." instance=ExtResource( 3 )]
|
||||
|
||||
@ -52,7 +56,7 @@ position = Vector2( -168, 95 )
|
||||
scale = Vector2( 0.878906, 0.936025 )
|
||||
|
||||
[node name="BlobbySprite" parent="Blobby" index="5"]
|
||||
frame = 6
|
||||
frame = 7
|
||||
|
||||
[node name="BlobbymationTree" parent="Blobby/BlobbySprite" index="0"]
|
||||
parameters/playback = SubResource( 9 )
|
||||
@ -255,13 +259,6 @@ position = Vector2( 648, -204 )
|
||||
[node name="Coin4" parent="." instance=ExtResource( 1 )]
|
||||
position = Vector2( 1116, -120 )
|
||||
|
||||
[node name="LevelAmbiance" type="AudioStreamPlayer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource( 9 )
|
||||
volume_db = -14.994
|
||||
autoplay = true
|
||||
bus = "Music"
|
||||
|
||||
[connection signal="body_exited" from="Blobby/BlobbySkin" to="Blobby" method="_on_BlobbySkin_body_exited"]
|
||||
|
||||
[editable path="SignalManager"]
|
||||
|
||||
@ -1,12 +1,23 @@
|
||||
extends Node2D
|
||||
class_name LevelTemplate
|
||||
|
||||
export(String, FILE) var level_music = "res://assets/music/A Hearty Fellow (LOOP).wav"
|
||||
export(float) var level_music_attenuation = -20
|
||||
export(String, FILE) var level_ambiance = "res://assets/sounds/AMBIENCE_SciFi_Large_Space_Hangar_Deep_Smooth_loop_stereo.wav"
|
||||
export(float) var level_ambiance_attenuation = -20
|
||||
|
||||
onready var signal_manager := $"%SignalManager"
|
||||
onready var level_state := $"%LevelState"
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
# should spawn the tutorial thingies which are still remembered in the progress dictionary
|
||||
signal_manager.connect("terminal_activated", self, "stop_level_music")
|
||||
signal_manager.emit_signal("level_loaded")
|
||||
get_tree().paused = false
|
||||
|
||||
|
||||
$SceneAudio.play_parallel_sound(level_music, level_music_attenuation)
|
||||
$SceneAudio.play_parallel_sound(level_ambiance, level_ambiance_attenuation)
|
||||
|
||||
|
||||
func stop_level_music(_unused: float) -> void:
|
||||
$SceneAudio.stop_parallel_sound(level_music)
|
||||
|
||||
@ -63,12 +63,6 @@ wait_time = 20.0
|
||||
unique_name_in_owner = true
|
||||
drag_margin_bottom = 0.3
|
||||
|
||||
[node name="AnimatedSprite" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="4"]
|
||||
frame = 8
|
||||
|
||||
[node name="AnimatedSprite2" parent="BlobbyCam/ParallaxBackground/ParallaxLayer5" index="5"]
|
||||
frame = 7
|
||||
|
||||
[node name="Blobby" parent="." instance=ExtResource( 7 )]
|
||||
unique_name_in_owner = true
|
||||
position = Vector2( -70, -1.90735e-06 )
|
||||
|
||||
@ -41,12 +41,12 @@ resource_name = "LowPassFilter"
|
||||
cutoff_hz = 3000.0
|
||||
|
||||
[resource]
|
||||
bus/0/volume_db = -10.4576
|
||||
bus/0/volume_db = -13.9794
|
||||
bus/1/name = "Music"
|
||||
bus/1/solo = false
|
||||
bus/1/mute = false
|
||||
bus/1/bypass_fx = false
|
||||
bus/1/volume_db = -6.0206
|
||||
bus/1/volume_db = -16.4782
|
||||
bus/1/send = "Master"
|
||||
bus/1/effect/0/effect = SubResource( 1 )
|
||||
bus/1/effect/0/enabled = false
|
||||
|
||||
@ -3,4 +3,4 @@ extends Control
|
||||
|
||||
func _ready() -> void:
|
||||
$"%PlayButton".grab_focus()
|
||||
GlobalAudio.play_scene_independent("res://assets/music/Shopping For The Future (LOOP).wav","Music", -14, true)
|
||||
GlobalAudio.play_scene_independent("res://assets/music/Shopping For The Future (LOOP).wav","Music", -17, true)
|
||||
|
||||
@ -115,9 +115,9 @@ func _lesson_learned(animation_name: String) -> void:
|
||||
func start_tutorial() -> void:
|
||||
var rng = RandomNumberGenerator.new()
|
||||
rng.randomize()
|
||||
position = cam.get_global_transform() * position
|
||||
position.x += rng.randf_range(-50, 50)
|
||||
position.y += rng.randf_range(-50, 50)
|
||||
position = cam.get_global_transform() * position
|
||||
print(position)
|
||||
velocity.x = velocity.x * sign(rng.randf_range(-1, 1))
|
||||
velocity.y = velocity.y * sign(rng.randf_range(-1, 1))
|
||||
|
||||
@ -11,105 +11,105 @@ var freed_frogs := []
|
||||
var is_dead: = false setget set_dead
|
||||
|
||||
func _ready() -> void:
|
||||
GlobalState.gsr.last_played_level = levelName
|
||||
SaveManager.save_default()
|
||||
signal_manager.connect("level_completed", self, "_on_level_completed")
|
||||
signal_manager.connect("player_died", self, "player_dying")
|
||||
GlobalState.gsr.last_played_level = levelName
|
||||
SaveManager.save_default()
|
||||
signal_manager.connect("level_completed", self, "_on_level_completed")
|
||||
signal_manager.connect("player_died", self, "player_dying")
|
||||
|
||||
func reset() -> void:
|
||||
deaths = 0
|
||||
currency = 0
|
||||
freed_frogs = []
|
||||
# TODO Maybe not the place for this?
|
||||
if GlobalState.gsr.progress_dict.has(levelName):
|
||||
GlobalState.gsr.progress_dict[levelName].erase("savepoint")
|
||||
deaths = 0
|
||||
currency = 0
|
||||
freed_frogs = []
|
||||
# TODO Maybe not the place for this?
|
||||
if GlobalState.gsr.progress_dict.has(levelName):
|
||||
GlobalState.gsr.progress_dict[levelName].erase("savepoint")
|
||||
|
||||
func set_currency(value: int) -> void:
|
||||
currency = value
|
||||
signal_manager.emit_signal("currency_updated")
|
||||
currency = value
|
||||
signal_manager.emit_signal("currency_updated")
|
||||
|
||||
func set_deaths(value: int) -> void:
|
||||
deaths = value
|
||||
deaths = value
|
||||
|
||||
func set_dead(value: bool) -> void:
|
||||
is_dead = value
|
||||
is_dead = value
|
||||
|
||||
func register_frog(number: int, freed: bool = false) -> void:
|
||||
update_global_state()
|
||||
if(!GlobalState.gsr.progress_dict[levelName]["froggies"].has(number)):
|
||||
GlobalState.gsr.progress_dict[levelName]["froggies"][number] = freed
|
||||
GlobalState.save()
|
||||
update_global_state()
|
||||
if(!GlobalState.gsr.progress_dict[levelName]["froggies"].has(number)):
|
||||
GlobalState.gsr.progress_dict[levelName]["froggies"][number] = freed
|
||||
GlobalState.save()
|
||||
|
||||
func free_a_frog(number: int) -> void:
|
||||
freed_frogs.append(number)
|
||||
freed_frogs.append(number)
|
||||
|
||||
func needs_tutorial(lesson: String) -> bool:
|
||||
if(!GlobalState.gsr.tutorial_prompts.has(lesson)):
|
||||
return false
|
||||
return GlobalState.gsr.tutorial_prompts[lesson]
|
||||
if(!GlobalState.gsr.tutorial_prompts.has(lesson)):
|
||||
return false
|
||||
return GlobalState.gsr.tutorial_prompts[lesson]
|
||||
|
||||
func register_tutorial(lesson: String) -> void:
|
||||
if(GlobalState.gsr.tutorial_prompts.has(lesson)):
|
||||
return
|
||||
GlobalState.gsr.tutorial_prompts[lesson] = true
|
||||
GlobalState.save()
|
||||
if(GlobalState.gsr.tutorial_prompts.has(lesson)):
|
||||
return
|
||||
GlobalState.gsr.tutorial_prompts[lesson] = true
|
||||
GlobalState.save()
|
||||
|
||||
func absolved_tutorial(lesson: String) -> void:
|
||||
if(!GlobalState.gsr.tutorial_prompts.has(lesson)):
|
||||
return
|
||||
GlobalState.gsr.tutorial_prompts[lesson] = false
|
||||
GlobalState.save()
|
||||
if(!GlobalState.gsr.tutorial_prompts.has(lesson)):
|
||||
return
|
||||
GlobalState.gsr.tutorial_prompts[lesson] = false
|
||||
GlobalState.save()
|
||||
|
||||
# Spends the currency when enough is available
|
||||
# and returns true if so. Else it does not spend and return false.
|
||||
func spend_currency(cost: int) -> bool:
|
||||
# TODO member that
|
||||
if(OS.is_debug_build()):
|
||||
return true
|
||||
if GlobalState.gsr.wallet + currency < cost:
|
||||
return false
|
||||
var remainder = currency - cost
|
||||
if remainder >= 0:
|
||||
currency = remainder
|
||||
else:
|
||||
currency = 0
|
||||
GlobalState.set_wallet(GlobalState.gsr.wallet + remainder)
|
||||
return true
|
||||
# TODO member that
|
||||
if(OS.is_debug_build()):
|
||||
return true
|
||||
if GlobalState.gsr.wallet + currency < cost:
|
||||
return false
|
||||
var remainder = currency - cost
|
||||
if remainder >= 0:
|
||||
currency = remainder
|
||||
else:
|
||||
currency = 0
|
||||
GlobalState.set_wallet(GlobalState.gsr.wallet + remainder)
|
||||
return true
|
||||
|
||||
func _on_level_completed():
|
||||
#if(OS.is_debug_build()):
|
||||
# return
|
||||
update_global_state()
|
||||
reset()
|
||||
#if(OS.is_debug_build()):
|
||||
# return
|
||||
update_global_state()
|
||||
reset()
|
||||
|
||||
func update_global_state() -> void:
|
||||
var progress_dict : Dictionary = GlobalState.get_progress()
|
||||
var levelProgress : Dictionary = {}
|
||||
var progress_dict : Dictionary = GlobalState.get_progress()
|
||||
var levelProgress : Dictionary = {}
|
||||
|
||||
levelProgress["currency"] = currency
|
||||
levelProgress["deaths"] = deaths
|
||||
|
||||
# TODO Doesnt account for multiple plays of same level
|
||||
if !progress_dict.has(levelName):
|
||||
progress_dict[levelName] = levelProgress
|
||||
else:
|
||||
progress_dict[levelName]["currency"] = GlobalState.get_property_value(levelName,"currency") + currency
|
||||
progress_dict[levelName]["deaths"] = GlobalState.get_property_value(levelName,"deaths") + deaths
|
||||
if !progress_dict[levelName].has("froggies"):
|
||||
progress_dict[levelName]["froggies"] = {}
|
||||
else:
|
||||
for frog_number in freed_frogs:
|
||||
if progress_dict[levelName]["froggies"].has(frog_number):
|
||||
progress_dict[levelName]["froggies"][frog_number] = true
|
||||
levelProgress["currency"] = currency
|
||||
levelProgress["deaths"] = deaths
|
||||
|
||||
# TODO Doesnt account for multiple plays of same level
|
||||
if !progress_dict.has(levelName):
|
||||
progress_dict[levelName] = levelProgress
|
||||
else:
|
||||
progress_dict[levelName]["currency"] = GlobalState.get_property_value(levelName,"currency") + currency
|
||||
progress_dict[levelName]["deaths"] = GlobalState.get_property_value(levelName,"deaths") + deaths
|
||||
if !progress_dict[levelName].has("froggies"):
|
||||
progress_dict[levelName]["froggies"] = {}
|
||||
else:
|
||||
for frog_number in freed_frogs:
|
||||
if progress_dict[levelName]["froggies"].has(frog_number):
|
||||
progress_dict[levelName]["froggies"][frog_number] = true
|
||||
|
||||
# TODO Wallet is independant from progress_dict because???
|
||||
GlobalState.set_wallet(GlobalState.gsr.wallet + currency)
|
||||
GlobalState.set_progress(progress_dict)
|
||||
# TODO Wallet is independant from progress_dict because???
|
||||
GlobalState.set_wallet(GlobalState.gsr.wallet + currency)
|
||||
GlobalState.set_progress(progress_dict)
|
||||
|
||||
func player_dying(animation_number: int = 0) -> void:
|
||||
currency = 0
|
||||
is_dead = true
|
||||
freed_frogs = []
|
||||
deaths += 1
|
||||
update_global_state()
|
||||
deaths = 0
|
||||
currency = 0
|
||||
is_dead = true
|
||||
freed_frogs = []
|
||||
deaths += 1
|
||||
update_global_state()
|
||||
deaths = 0
|
||||
|
||||
@ -16,4 +16,4 @@ signal savemanager_saved()
|
||||
signal game_paused(value)
|
||||
|
||||
func _on_Timer_timeout() -> void:
|
||||
emit_signal("getback_timer_up")
|
||||
emit_signal("getback_timer_up")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user