feat: new music, fall through tut, simple enemy fix

This commit is contained in:
Jakob Feldmann 2023-09-06 17:04:47 +02:00
parent c614d27d80
commit 005e08d8cb
30 changed files with 489 additions and 721 deletions

Binary file not shown.

View 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

Binary file not shown.

View 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

View File

@ -4385,7 +4385,7 @@ texture = SubResource( 62 )
offset = Vector2( 1, 0 )
hframes = 6
vframes = 6
frame = 8
frame = 6
__meta__ = {
"_editor_description_": "YXNlcHJpdGVfd2l6YXJkX2NvbmZpZwpwbGF5ZXJ8PUJsb2JieVNwcml0ZS9CbG9iYnltYXRpb25QbGF5ZXIKc291cmNlfD1yZXM6Ly9hc3NldHMvYmxvYmJ5L2Jsb2JieS1zcHJpdGVzaGVldHQuYXNlcHJpdGUKbGF5ZXJ8PUJsb2JieQpvcF9leHB8PUZhbHNlCm9fZm9sZGVyfD0Kb19uYW1lfD0Kb25seV92aXNpYmxlfD1GYWxzZQpvX2V4X3B8PQo="
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"]

View File

@ -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()

View File

@ -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")

View File

@ -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"]

View File

@ -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()

View File

@ -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"]

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )]

View File

@ -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"]

View File

@ -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"]

View File

@ -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"]

View File

@ -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"]

View File

@ -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"]

View File

@ -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"]

View File

@ -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)

View File

@ -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 )

View File

@ -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

View File

@ -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)

View File

@ -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))

View File

@ -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

View File

@ -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")