diff --git a/Zennysoft.Game.Godot.Implementation/Audio/DimmableAudioStreamPlayer3D.cs b/Zennysoft.Game.Godot.Implementation/Audio/DimmableAudioStreamPlayer3D.cs new file mode 100644 index 000000000..04da6b6e1 --- /dev/null +++ b/Zennysoft.Game.Godot.Implementation/Audio/DimmableAudioStreamPlayer3D.cs @@ -0,0 +1,50 @@ +namespace Zennysoft.Game.Implementation; + +using Chickensoft.GodotNodeInterfaces; +using Godot; +using Zennysoft.Game.Abstractions; + +public partial class DimmableAudioStreamPlayer3D : AudioStreamPlayer3D, IDimmableAudioStreamPlayer +{ + #region Constants + // -60 to -80 is considered inaudible for decibels. + public const float VOLUME_DB_INAUDIBLE = -80f; + public const double FADE_DURATION = 3d; // seconds + #endregion Constants + + public ITween? FadeTween { get; set; } + + public float InitialVolumeDb; + + public override void _Ready() + { + InitialVolumeDb = VolumeDb; + VolumeDb = VOLUME_DB_INAUDIBLE; + } + + public void FadeIn() + { + SetupFade(InitialVolumeDb, Tween.EaseType.Out); + Play(); + } + + public void FadeOut() + { + SetupFade(VOLUME_DB_INAUDIBLE, Tween.EaseType.In); + FadeTween!.TweenCallback(Callable.From(Stop)); + } + + public void SetupFade(float volumeDb, Tween.EaseType ease) + { + FadeTween?.Kill(); + + FadeTween = GodotInterfaces.Adapt(CreateTween()); + + FadeTween.TweenProperty( + this, + "volume_db", + volumeDb, + FADE_DURATION + ).SetTrans(Tween.TransitionType.Circ).SetEase(ease); + } +} diff --git a/Zennysoft.Game.Ma/src/audio/AmbientSFXPlayer3D.cs b/Zennysoft.Game.Ma/src/audio/AmbientSFXPlayer3D.cs new file mode 100644 index 000000000..0a92942bb --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/AmbientSFXPlayer3D.cs @@ -0,0 +1,5 @@ +using Zennysoft.Game.Implementation; + +public partial class AmbientSFXPlayer3D : DimmableAudioStreamPlayer3D +{ +} diff --git a/Zennysoft.Game.Ma/src/audio/AmbientSFXPlayer3D.cs.uid b/Zennysoft.Game.Ma/src/audio/AmbientSFXPlayer3D.cs.uid new file mode 100644 index 000000000..d2b6ca7de --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/AmbientSFXPlayer3D.cs.uid @@ -0,0 +1 @@ +uid://b83kye8yinfxs diff --git a/Zennysoft.Game.Ma/src/map/dungeon/code/Overworld.cs b/Zennysoft.Game.Ma/src/map/dungeon/code/Overworld.cs index 5a134d267..89509df20 100644 --- a/Zennysoft.Game.Ma/src/map/dungeon/code/Overworld.cs +++ b/Zennysoft.Game.Ma/src/map/dungeon/code/Overworld.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System.Linq; +using Zennysoft.Game.Abstractions; using Zennysoft.Ma.Adapter; namespace Zennysoft.Game.Ma; @@ -19,6 +21,8 @@ public partial class Overworld : SpecialFloor, IDungeonFloor [Node] private Area3D RestoreArea { get; set; } = default!; + [Node] private Node DimmableAudio { get; set; } = default!; + private Timer RestoreTimer { get; set; } public override void InitializeDungeon() @@ -32,6 +36,17 @@ public partial class Overworld : SpecialFloor, IDungeonFloor RestoreTimer.Timeout += RestoreTimer_Timeout; AddChild(RestoreTimer); FloorIsLoaded = true; + + var dimmableAudio = DimmableAudio.GetChildren().OfType(); + foreach (var dimmable in dimmableAudio) + dimmable.FadeIn(); + } + + public override void FadeOutAudio() + { + var dimmableAudio = DimmableAudio.GetChildren().OfType(); + foreach (var dimmable in dimmableAudio) + dimmable.FadeOut(); } private void RestoreTimer_Timeout() diff --git a/Zennysoft.Game.Ma/src/map/dungeon/floors/Special Floors/Overworld.tscn b/Zennysoft.Game.Ma/src/map/dungeon/floors/Special Floors/Overworld.tscn index 7f7750a7a..8eac08e52 100644 --- a/Zennysoft.Game.Ma/src/map/dungeon/floors/Special Floors/Overworld.tscn +++ b/Zennysoft.Game.Ma/src/map/dungeon/floors/Special Floors/Overworld.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=557 format=4 uid="uid://dvnc26rebk6o0"] +[gd_scene load_steps=558 format=4 uid="uid://dvnc26rebk6o0"] [ext_resource type="Script" uid="uid://cuhfkyh3d7noa" path="res://src/map/dungeon/code/Overworld.cs" id="1_5hmt3"] [ext_resource type="Texture2D" uid="uid://co6h8vyi11sl2" path="res://src/map/overworld/Models/Overworld_CLOUD_RINGS_INNER_63.png" id="2_g6b7b"] @@ -86,6 +86,7 @@ [ext_resource type="Texture2D" uid="uid://cpuhjnogiqlm3" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_leafs3.png" id="64_28ka5"] [ext_resource type="Texture2D" uid="uid://dq63vmmpqlww7" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_VINE.png" id="65_nhnhu"] [ext_resource type="Texture2D" uid="uid://wqbflec631rm" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES.png" id="66_plu1v"] +[ext_resource type="Script" uid="uid://b83kye8yinfxs" path="res://src/audio/AmbientSFXPlayer3D.cs" id="66_q7hpd"] [ext_resource type="Texture2D" uid="uid://ck2milaawr3ef" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES2.png" id="67_shdaj"] [ext_resource type="Texture2D" uid="uid://c38grr8d22ukg" path="res://src/map/assets/Overworld Assetts/cloudscape.png" id="67_uyygh"] [ext_resource type="Texture2D" uid="uid://c5jloiaiy7iug" path="res://src/map/overworld/Models/Overworld_optimized_Pass 1_BANYAN_LEAVES_3.png" id="68_8o0x4"] @@ -10823,81 +10824,79 @@ material = SubResource("FogMaterial_b6pah") [node name="Audio" type="Node3D" parent="Node3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -350.758, -3.90238, 113.556) -[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="Node3D/Audio"] -autoplay = true +[node name="DimmableAudio" type="Node3D" parent="Node3D/Audio"] +unique_name_in_owner = true +transform = Transform3D(1.51515, 0, 0, 0, 1.51515, 0, 0, 0, 1.51515, 137.047, -0.658938, -5.82563) -[node name="AUDIO" type="Node3D" parent="Node3D/Audio/AudioStreamPlayer"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -203.193, -3.01047, 66.0116) - -[node name="Interior" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] +[node name="Interior" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"] process_mode = 3 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.4453, 0, 5.97604) stream = ExtResource("2_wbbo3") volume_db = 5.275 unit_size = 10.55 max_db = -3.264 -autoplay = true max_distance = 100.0 bus = &"AMBIENT" +script = ExtResource("66_q7hpd") -[node name="Interior2" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] +[node name="Interior2" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"] process_mode = 3 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -231.692, 6.43338, -92.712) stream = ExtResource("2_wbbo3") volume_db = 5.275 unit_size = 10.55 max_db = -3.264 -autoplay = true max_distance = 54.99 bus = &"AMBIENT" +script = ExtResource("66_q7hpd") -[node name="Ocean" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] +[node name="Ocean" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"] process_mode = 3 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -210.527, -9.55156, -81.5173) stream = ExtResource("3_pvi8n") volume_db = 8.791 unit_size = 4.51 max_db = -13.154 -autoplay = true max_distance = 247.56 bus = &"AMBIENT" attenuation_filter_cutoff_hz = 20500.0 +script = ExtResource("66_q7hpd") -[node name="Ocean2" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] +[node name="Ocean2" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"] process_mode = 3 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 109.176, -130.646, -48.6352) stream = ExtResource("3_pvi8n") volume_db = 30.769 unit_size = 1.77 max_db = -10.353 -autoplay = true max_distance = 157.54 max_polyphony = 2 bus = &"AMBIENT" attenuation_filter_db = -34.0 +script = ExtResource("66_q7hpd") -[node name="Ocean3" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] +[node name="Ocean3" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"] process_mode = 3 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -329.209, -9.13597, -39.3283) stream = ExtResource("3_pvi8n") volume_db = 30.769 unit_size = 11.1 max_db = -5.078 -autoplay = true max_distance = 90.02 max_polyphony = 2 bus = &"AMBIENT" attenuation_filter_cutoff_hz = 691.0 attenuation_filter_db = -34.0 +script = ExtResource("66_q7hpd") -[node name="Waterfall" type="AudioStreamPlayer3D" parent="Node3D/Audio/AudioStreamPlayer/AUDIO"] +[node name="Waterfall" type="AudioStreamPlayer3D" parent="Node3D/Audio/DimmableAudio"] process_mode = 3 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -107.057, 0, -48.0532) stream = ExtResource("3_c2gp5") volume_db = 2.774 -autoplay = true max_distance = 116.36 bus = &"AMBIENT" +script = ExtResource("66_q7hpd") [node name="VFX" type="Node3D" parent="Node3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -350.758, -3.90238, 113.556)