diff --git a/assets/music/A Hearty Fellow (LOOP).wav b/assets/music/A Hearty Fellow (LOOP).wav new file mode 100644 index 0000000..8ba9a23 Binary files /dev/null and b/assets/music/A Hearty Fellow (LOOP).wav differ diff --git a/assets/music/A Hearty Fellow (LOOP).wav.import b/assets/music/A Hearty Fellow (LOOP).wav.import new file mode 100644 index 0000000..a61581e --- /dev/null +++ b/assets/music/A Hearty Fellow (LOOP).wav.import @@ -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 diff --git a/assets/music/The Laboratory (LOOP).wav b/assets/music/The Laboratory (LOOP).wav new file mode 100644 index 0000000..295c000 Binary files /dev/null and b/assets/music/The Laboratory (LOOP).wav differ diff --git a/assets/music/The Laboratory (LOOP).wav.import b/assets/music/The Laboratory (LOOP).wav.import new file mode 100644 index 0000000..1ba0b4e --- /dev/null +++ b/assets/music/The Laboratory (LOOP).wav.import @@ -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 diff --git a/src/Actors/Blobby/Blobby.tscn b/src/Actors/Blobby/Blobby.tscn index cc98542..07575a8 100644 --- a/src/Actors/Blobby/Blobby.tscn +++ b/src/Actors/Blobby/Blobby.tscn @@ -4385,7 +4385,7 @@ texture = SubResource( 62 ) offset = Vector2( 1, 0 ) hframes = 6 vframes = 6 -frame = 8 +frame = 6 __meta__ = { "_editor_description_": "YXNlcHJpdGVfd2l6YXJkX2NvbmZpZwpwbGF5ZXJ8PUJsb2JieVNwcml0ZS9CbG9iYnltYXRpb25QbGF5ZXIKc291cmNlfD1yZXM6Ly9hc3NldHMvYmxvYmJ5L2Jsb2JieS1zcHJpdGVzaGVldHQuYXNlcHJpdGUKbGF5ZXJ8PUJsb2JieQpvcF9leHB8PUZhbHNlCm9fZm9sZGVyfD0Kb19uYW1lfD0Kb25seV92aXNpYmxlfD1GYWxzZQpvX2V4X3B8PQo=" } diff --git a/src/Actors/Enemies/DartingEnemy.gd b/src/Actors/Enemies/DartingEnemy.gd index 59bce87..f15d892 100644 --- a/src/Actors/Enemies/DartingEnemy.gd +++ b/src/Actors/Enemies/DartingEnemy.gd @@ -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 diff --git a/src/Actors/Enemies/Flyer.gd b/src/Actors/Enemies/Flyer.gd index a2cdb76..f94a975 100644 --- a/src/Actors/Enemies/Flyer.gd +++ b/src/Actors/Enemies/Flyer.gd @@ -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 diff --git a/src/Actors/Enemies/SimpleEnemy.gd b/src/Actors/Enemies/SimpleEnemy.gd index b868fd3..8bbdc72 100644 --- a/src/Actors/Enemies/SimpleEnemy.gd +++ b/src/Actors/Enemies/SimpleEnemy.gd @@ -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 diff --git a/src/Actors/Enemies/SimpleEnemy.tscn b/src/Actors/Enemies/SimpleEnemy.tscn index 936adae..aff724e 100644 --- a/src/Actors/Enemies/SimpleEnemy.tscn +++ b/src/Actors/Enemies/SimpleEnemy.tscn @@ -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"] diff --git a/src/Contraptions/Portal/Portal.gd b/src/Contraptions/Portal/Portal.gd index 2202408..51b18c7 100644 --- a/src/Contraptions/Portal/Portal.gd +++ b/src/Contraptions/Portal/Portal.gd @@ -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() diff --git a/src/Contraptions/Triggers/ElevatorButton.gd b/src/Contraptions/Triggers/ElevatorButton.gd index e2a3439..ed49cd4 100644 --- a/src/Contraptions/Triggers/ElevatorButton.gd +++ b/src/Contraptions/Triggers/ElevatorButton.gd @@ -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") diff --git a/src/Contraptions/Triggers/ElevatorButton.tscn b/src/Contraptions/Triggers/ElevatorButton.tscn index 3c2407a..e3ca0a7 100644 --- a/src/Contraptions/Triggers/ElevatorButton.tscn +++ b/src/Contraptions/Triggers/ElevatorButton.tscn @@ -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"] diff --git a/src/Environment/Grass/ShaderGrass.gd b/src/Environment/Grass/ShaderGrass.gd index 5249fe6..8bc49f7 100644 --- a/src/Environment/Grass/ShaderGrass.gd +++ b/src/Environment/Grass/ShaderGrass.gd @@ -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() diff --git a/src/Environment/Grass/ShaderGrass.tscn b/src/Environment/Grass/ShaderGrass.tscn index 9aac513..6a5c4a7 100644 --- a/src/Environment/Grass/ShaderGrass.tscn +++ b/src/Environment/Grass/ShaderGrass.tscn @@ -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"] diff --git a/src/Levels/1 Tutorial Level.tscn b/src/Levels/1 Tutorial Level.tscn index 3c60d07..4760f82 100644 --- a/src/Levels/1 Tutorial Level.tscn +++ b/src/Levels/1 Tutorial Level.tscn @@ -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 ) diff --git a/src/Levels/2 Tutorial Level.tscn b/src/Levels/2 Tutorial Level.tscn index 79f169e..8184cf5 100644 --- a/src/Levels/2 Tutorial Level.tscn +++ b/src/Levels/2 Tutorial Level.tscn @@ -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 ) diff --git a/src/Levels/3 Tutorial Level.tscn b/src/Levels/3 Tutorial Level.tscn index 05afda9..aff0927 100644 --- a/src/Levels/3 Tutorial Level.tscn +++ b/src/Levels/3 Tutorial Level.tscn @@ -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 )] diff --git a/src/Levels/4 Tutorial Level.tscn b/src/Levels/4 Tutorial Level.tscn index 5d686fd..e60d913 100644 --- a/src/Levels/4 Tutorial Level.tscn +++ b/src/Levels/4 Tutorial Level.tscn @@ -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"] diff --git a/src/Levels/5 Tutorial Level.tscn b/src/Levels/5 Tutorial Level.tscn index 62ec5d3..139f1b4 100644 --- a/src/Levels/5 Tutorial Level.tscn +++ b/src/Levels/5 Tutorial Level.tscn @@ -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"] diff --git a/src/Levels/6 Tutorial Level.tscn b/src/Levels/6 Tutorial Level.tscn index 057b28a..4818d5a 100644 --- a/src/Levels/6 Tutorial Level.tscn +++ b/src/Levels/6 Tutorial Level.tscn @@ -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"] diff --git a/src/Levels/Actual Level 1.tscn b/src/Levels/Actual Level 1.tscn index 0effd1f..e30004c 100644 --- a/src/Levels/Actual Level 1.tscn +++ b/src/Levels/Actual Level 1.tscn @@ -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"] diff --git a/src/Levels/Actual Level 2.tscn b/src/Levels/Actual Level 2.tscn index 6602c7a..8565d22 100644 --- a/src/Levels/Actual Level 2.tscn +++ b/src/Levels/Actual Level 2.tscn @@ -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"] diff --git a/src/Levels/Actual Level 3.tscn b/src/Levels/Actual Level 3.tscn index f2501bc..45aa689 100644 --- a/src/Levels/Actual Level 3.tscn +++ b/src/Levels/Actual Level 3.tscn @@ -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"] diff --git a/src/Levels/Templates/LevelTemplate.gd b/src/Levels/Templates/LevelTemplate.gd index e88746f..82224d1 100644 --- a/src/Levels/Templates/LevelTemplate.gd +++ b/src/Levels/Templates/LevelTemplate.gd @@ -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) diff --git a/src/Levels/Templates/Template.tscn b/src/Levels/Templates/Template.tscn index 5081974..38b3832 100644 --- a/src/Levels/Templates/Template.tscn +++ b/src/Levels/Templates/Template.tscn @@ -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 ) diff --git a/src/Sounds/default_bus_layout.tres b/src/Sounds/default_bus_layout.tres index 1028d26..073c153 100644 --- a/src/Sounds/default_bus_layout.tres +++ b/src/Sounds/default_bus_layout.tres @@ -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 diff --git a/src/UserInterface/Screens/MainMenu/MainScreen.gd b/src/UserInterface/Screens/MainMenu/MainScreen.gd index 90cec36..8c2105d 100644 --- a/src/UserInterface/Screens/MainMenu/MainScreen.gd +++ b/src/UserInterface/Screens/MainMenu/MainScreen.gd @@ -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) diff --git a/src/UserInterface/TutorialThingy.gd b/src/UserInterface/TutorialThingy.gd index 699dd90..c6d57bb 100644 --- a/src/UserInterface/TutorialThingy.gd +++ b/src/UserInterface/TutorialThingy.gd @@ -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)) diff --git a/src/Utilities/LevelState.gd b/src/Utilities/LevelState.gd index 06e4251..8d16dbf 100644 --- a/src/Utilities/LevelState.gd +++ b/src/Utilities/LevelState.gd @@ -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 diff --git a/src/Utilities/SignalManager.gd b/src/Utilities/SignalManager.gd index 0af894b..7ebbe7f 100644 --- a/src/Utilities/SignalManager.gd +++ b/src/Utilities/SignalManager.gd @@ -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")