From 6e9aabc00a78b3bec785945bb8cb6e68542ce871 Mon Sep 17 00:00:00 2001 From: Will Thompson Date: Sat, 30 May 2026 22:43:07 +0100 Subject: [PATCH] Improve music puzzle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add background music to this scene: initially just a bass line and very small percussion part, which progresses as you complete each step of the puzzle. The full melody plays when you have completed the puzzle. Change the melody on the rocks to match. Include the strudel.cc source code to the music; the five files are simply slices of a 16-cycle export. The guitar arpeggios + kalimba + folk harp stack was me trying to imagine what the musician's weird three-necked instrument might sound like. The clips for each step of the puzzle are configured to loop from halfway through the clip, so that the gentle cymbal hit at the start only plays once per step. This currently doesn't work in the Godot web target but it sounds OK anyway. Increase the attenuation and reduce the volume on the ambient sounds so they're not so overwhelming when you're far away from the forest/river. Add an AudioListener to the player so that the distance is measured from the player, rather than the middle of the screen, which makes a big difference at the start of the level. The new melody is in A♭ major. I picked this key (and cheated by having the double bass play a low E♭, which can't be played without downtuning or having a C extension) because the combat music is in F minor, which is the relative minor of A♭ major. The melody incorporates the opening four notes of the theme, specifically as the third step of the puzzle. The rock scale starts on G (the 7th note of the scale) rather than A♭. It's a bit weird but it lets you play the full Threadbare theme melody (in B♭ dorian) with rocks 5 4 5 3 2 1, 5 4 5 3 5 6. I would like to add these as 2 further optional steps to the puzzle to unlock a new area of the level in future. Make the rock strike duration significantly shorter. This duration happens to be almost exactly a quaver (8th note) at 80bpm, the speed of the music. I thought about trying to sync the demo to the start of a bar, but it's not worth it. Adjust the musician's hints. I removed my pet peeve – that he would previously give you partial hints that were wrong: > Musician: Try tapping the first, and second stones, then check the > first altar above. If you see flames, we're on to the right melody. This is a bad hint because if you do what he says, nothing happens! Instead his clues are now more like: 1. Listen to the altar./Look at the symbol. 2. Explain the symbol. 3. Give you the answer. For the final step, he tells you exactly what to do, but not the rocks. I think if someone's got that far they can work it out. --- .../music/SongSanctuary.strudel.js | 67 +++++++++++++++++++ .../first_party/music/SongSanctuary_Full.ogg | 3 + .../music/SongSanctuary_Full.ogg.import | 19 ++++++ .../first_party/music/SongSanctuary_Step1.ogg | 3 + .../music/SongSanctuary_Step1.ogg.import | 19 ++++++ .../first_party/music/SongSanctuary_Step2.ogg | 3 + .../music/SongSanctuary_Step2.ogg.import | 19 ++++++ .../first_party/music/SongSanctuary_Step3.ogg | 3 + .../music/SongSanctuary_Step3.ogg.import | 19 ++++++ .../first_party/music/SongSanctuary_Step4.ogg | 3 + .../music/SongSanctuary_Step4.ogg.import | 19 ++++++ .../components/dialogues/musician.dialogue | 15 ++--- .../1_music_puzzle/components/music_puzzle.gd | 12 ++++ .../components/music_puzzle.gd.uid | 1 + .../components/musical_rock.tscn | 1 + .../components/song_sanctuary_music.tres | 33 +++++++++ .../1_music_puzzle/music_puzzle.tscn | 67 ++++++++++++------- 17 files changed, 272 insertions(+), 34 deletions(-) create mode 100644 assets/first_party/music/SongSanctuary.strudel.js create mode 100644 assets/first_party/music/SongSanctuary_Full.ogg create mode 100644 assets/first_party/music/SongSanctuary_Full.ogg.import create mode 100644 assets/first_party/music/SongSanctuary_Step1.ogg create mode 100644 assets/first_party/music/SongSanctuary_Step1.ogg.import create mode 100644 assets/first_party/music/SongSanctuary_Step2.ogg create mode 100644 assets/first_party/music/SongSanctuary_Step2.ogg.import create mode 100644 assets/first_party/music/SongSanctuary_Step3.ogg create mode 100644 assets/first_party/music/SongSanctuary_Step3.ogg.import create mode 100644 assets/first_party/music/SongSanctuary_Step4.ogg create mode 100644 assets/first_party/music/SongSanctuary_Step4.ogg.import create mode 100644 scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd create mode 100644 scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd.uid create mode 100644 scenes/quests/lore_quests/quest_001/1_music_puzzle/components/song_sanctuary_music.tres diff --git a/assets/first_party/music/SongSanctuary.strudel.js b/assets/first_party/music/SongSanctuary.strudel.js new file mode 100644 index 0000000000..a3a9736b55 --- /dev/null +++ b/assets/first_party/music/SongSanctuary.strudel.js @@ -0,0 +1,67 @@ +// @title Song Sanctuary theme +// @by Will Thompson +// Copyright The Threadbare Authors +// SPDX-License-Identifier: CC-BY-SA-4.0 +setcpm(80 / 8); + +$: stack( + s("shaker_small:8").struct("[~ x]*4"), + s("timpani:9").struct("x*2").mask("<~ x>/8"), + s("bongo:2").struct("[~ [x x?]]*8").mask("<~ x>/8"), + s("fingercymbal").struct("/2"), +).room(".8:6"); + +var bar = "<0!2 1!2 2!2 3!2 0 1 2 3 4!4>"; + +$: n( + bar.pick([ + "0@3 4 0@2 0@2", + "1@3 5 1@2 1@2", + "1@3 1 -3@2 4@2", + "0@3 4 <0 7>@3 4", + "0@3 4 <0 7>@3 4", + ]), +) + .orbit(3) + .gain(1.3) + .room(".8:4") + .scale("Ab1:major") + .sound("gm_acoustic_bass:1"); + +$: n( + bar.pick([ + "[0 9 4 7]*4", + "[1 10 5 8]*4", + "[[1 10 5 7]*2 [1 10 4 6]*2]", + "[0 9 4 7]*4", + "[0 9 4 [6|7|7|8]]*4", + ]), +) + .scale("") + .add(note(perlin.range(0, 0.1))) + .clip(3) + .sound("gm_acoustic_guitar_nylon:7") + .gain(0.5) + .pan("<.25!16 0.5!2>") + .orbit(2) + .room(".8:6") + .mask("<~ 1>/8") + .gain(0.6); + +$: n( + bar.pick([ + "[0 2@2 1] 2 ~@2", + "[1 3@2 2] 3 ~@2", + "[3@2 2 3] 1 ~@2", + "[2@2 1 2] 0 ~@2", + "[2@2 1 2] 0 ~@2", + ]), +) + .scale("Ab3:major") + .add(note(perlin.range(0, 0.1))) + .sound("kalimba:9,folkharp:3") + .gain(0.3) + .pan(0.75) + .orbit(4) + .room(".8:4") + .mask("<~ ~ x ~>/4"); diff --git a/assets/first_party/music/SongSanctuary_Full.ogg b/assets/first_party/music/SongSanctuary_Full.ogg new file mode 100644 index 0000000000..8473ed4932 --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Full.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55d284be7fc141a514bef65d775e9e1bbe305c1ae5484360ebfd9269450becbb +size 701730 diff --git a/assets/first_party/music/SongSanctuary_Full.ogg.import b/assets/first_party/music/SongSanctuary_Full.ogg.import new file mode 100644 index 0000000000..733e42aedf --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Full.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://k0g7i1mv3e40" +path="res://.godot/imported/SongSanctuary_Full.ogg-5ca6e5243c6fb39d6d5e83d33d3560ac.oggvorbisstr" + +[deps] + +source_file="res://assets/first_party/music/SongSanctuary_Full.ogg" +dest_files=["res://.godot/imported/SongSanctuary_Full.ogg-5ca6e5243c6fb39d6d5e83d33d3560ac.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=80.0 +beat_count=64 +bar_beats=4 diff --git a/assets/first_party/music/SongSanctuary_Step1.ogg b/assets/first_party/music/SongSanctuary_Step1.ogg new file mode 100644 index 0000000000..9a369052f4 --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Step1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9191e36ae81e518a1d799c9e00ea57d78187aa8ab1d740e287de88e6b22bf3e +size 165197 diff --git a/assets/first_party/music/SongSanctuary_Step1.ogg.import b/assets/first_party/music/SongSanctuary_Step1.ogg.import new file mode 100644 index 0000000000..4699a1bb5a --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Step1.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://blayfkg7vg4a6" +path="res://.godot/imported/SongSanctuary_Step1.ogg-7674debb48b3581a24cb1c4f1d6e3d42.oggvorbisstr" + +[deps] + +source_file="res://assets/first_party/music/SongSanctuary_Step1.ogg" +dest_files=["res://.godot/imported/SongSanctuary_Step1.ogg-7674debb48b3581a24cb1c4f1d6e3d42.oggvorbisstr"] + +[params] + +loop=true +loop_offset=6.0 +bpm=80.0 +beat_count=16 +bar_beats=4 diff --git a/assets/first_party/music/SongSanctuary_Step2.ogg b/assets/first_party/music/SongSanctuary_Step2.ogg new file mode 100644 index 0000000000..8ca4a49b2e --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Step2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23b8ee1cb4c8a935443ee7138e1f92122e29fd4c49ff8c0ba3739f0e65d2a6c0 +size 164128 diff --git a/assets/first_party/music/SongSanctuary_Step2.ogg.import b/assets/first_party/music/SongSanctuary_Step2.ogg.import new file mode 100644 index 0000000000..9c47001f8a --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Step2.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cq6fkwodai236" +path="res://.godot/imported/SongSanctuary_Step2.ogg-5b720dd675fb91f5b17a02bbc9ce9a04.oggvorbisstr" + +[deps] + +source_file="res://assets/first_party/music/SongSanctuary_Step2.ogg" +dest_files=["res://.godot/imported/SongSanctuary_Step2.ogg-5b720dd675fb91f5b17a02bbc9ce9a04.oggvorbisstr"] + +[params] + +loop=true +loop_offset=6.0 +bpm=80.0 +beat_count=16 +bar_beats=4 diff --git a/assets/first_party/music/SongSanctuary_Step3.ogg b/assets/first_party/music/SongSanctuary_Step3.ogg new file mode 100644 index 0000000000..220e39b4a7 --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Step3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d4fa9329932cccc44d538d0286089d1e9e916a23ff522a885e08157ea4b2180 +size 163032 diff --git a/assets/first_party/music/SongSanctuary_Step3.ogg.import b/assets/first_party/music/SongSanctuary_Step3.ogg.import new file mode 100644 index 0000000000..7fa5c6b609 --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Step3.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://coklrcdylmkxw" +path="res://.godot/imported/SongSanctuary_Step3.ogg-7a4185473f3fac2c43a1a3233c136ff5.oggvorbisstr" + +[deps] + +source_file="res://assets/first_party/music/SongSanctuary_Step3.ogg" +dest_files=["res://.godot/imported/SongSanctuary_Step3.ogg-7a4185473f3fac2c43a1a3233c136ff5.oggvorbisstr"] + +[params] + +loop=true +loop_offset=6.0 +bpm=80.0 +beat_count=16 +bar_beats=4 diff --git a/assets/first_party/music/SongSanctuary_Step4.ogg b/assets/first_party/music/SongSanctuary_Step4.ogg new file mode 100644 index 0000000000..1195931d84 --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Step4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a18de246011f819f33ca3e31f7f7310226b5fa8e4d317366125dee123ec96e5 +size 166290 diff --git a/assets/first_party/music/SongSanctuary_Step4.ogg.import b/assets/first_party/music/SongSanctuary_Step4.ogg.import new file mode 100644 index 0000000000..6900d36de5 --- /dev/null +++ b/assets/first_party/music/SongSanctuary_Step4.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://1iuhkbumkpab" +path="res://.godot/imported/SongSanctuary_Step4.ogg-54475b36d8f8242ee40cb1c175a57d23.oggvorbisstr" + +[deps] + +source_file="res://assets/first_party/music/SongSanctuary_Step4.ogg" +dest_files=["res://.godot/imported/SongSanctuary_Step4.ogg-54475b36d8f8242ee40cb1c175a57d23.oggvorbisstr"] + +[params] + +loop=true +loop_offset=6.0 +bpm=80.0 +beat_count=16 +bar_beats=4 diff --git a/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/dialogues/musician.dialogue b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/dialogues/musician.dialogue index 003b1abe96..5047a4c3fb 100644 --- a/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/dialogues/musician.dialogue +++ b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/dialogues/musician.dialogue @@ -22,7 +22,7 @@ Musician: The songs can make wonderful things happen... make items or creatures Musician: Those altars? They hold the memory of each song in the ashes of their fires. Musician: Now, if I remember correctly, there's a song that used to open the portal to the Ink Well, where songwriters found the ink to write all the songs of the world. Musician: Let's see if I can remember how it works... -Musician: Try tapping the first, and second stones, then check the first altar above. If you see flames, we're on to the right melody. +Musician: Listen to each altar, and try to match its melody. If you see flames, we're on to the right melody. => END ~ hello_again @@ -46,12 +46,11 @@ Musician: Hello again, StoryWeaver. Would you like a hint? ~ hint_melody_0 match get_hint_level() when 0 - Musician: Hmmm... Try tapping the first, second, and third stones in that order. + Musician: Listen to the first altar. You should be able to hear the tune. when 1 - Musician: Even I'm forgetting in this torn world, let's see... - Musician: OK, I remember tapping the first, second, third, and fifth stones. + Musician: I think the melody starts on the second stone... else - Musician: I remember tapping the first, second, third, and fifth stones. + Musician: Now I remember! I used to tap the second stone, then the fourth, the third, and the fourth again. => END ~ hint_melody_1 @@ -62,7 +61,7 @@ match get_hint_level() when 1 Musician: The symbol seems to suggest that you need to move up one note, and repeat the first melody. else - Musician: I think that altar symbol means start with the second note... then third, fourth, and sixth. + Musician: I think that altar symbol means start with the third rock... then fifth, fourth, and fifth again. => END ~ hint_melody_2 @@ -72,7 +71,7 @@ match get_hint_level() when 1 Musician: Try playing the previous melody but in reverse. else - Musician: OK, I think it is sixth, fourth, third, and second for this one. + Musician: OK, I think it is fifth, fourth, fifth again, and third for this one. => END ~ hint_melody_3 @@ -82,7 +81,7 @@ match get_hint_level() when 1 Musician: Think about what you have already played... the answer is there. else - Musician: Play the very first melody, but in reverse. Fifth, third, second, and first should do it. + Musician: Play the very first melody, but in reverse. => END ~ item_hint diff --git a/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd new file mode 100644 index 0000000000..1cd9de0178 --- /dev/null +++ b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +extends Node2D + +@onready var background_music: BackgroundMusic = %BackgroundMusic + + +func _on_sequence_puzzle_step_solved(step_index: int) -> void: + # This assumes that the clip indexes correspond to the puzzle indexes. + var stream := background_music.stream as AudioStreamInteractive + var next_clip := stream.get_clip_name(step_index + 1) + MusicPlayer.switch_to_clip(next_clip) diff --git a/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd.uid b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd.uid new file mode 100644 index 0000000000..9ebbd28566 --- /dev/null +++ b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd.uid @@ -0,0 +1 @@ +uid://ckme5a4h5jthr diff --git a/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/musical_rock.tscn b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/musical_rock.tscn index 6ee6e0cad2..28bbd3e420 100644 --- a/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/musical_rock.tscn +++ b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/musical_rock.tscn @@ -15,6 +15,7 @@ collision_layer = 16 collision_mask = 0 script = ExtResource("1_4t6fr") sprite_frames = ExtResource("2_56adf") +strike_duration = 0.38333333333331 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=2080006295] unique_name_in_owner = true diff --git a/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/song_sanctuary_music.tres b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/song_sanctuary_music.tres new file mode 100644 index 0000000000..1d4264ce20 --- /dev/null +++ b/scenes/quests/lore_quests/quest_001/1_music_puzzle/components/song_sanctuary_music.tres @@ -0,0 +1,33 @@ +[gd_resource type="AudioStreamInteractive" format=3 uid="uid://wkn0u0npcijf"] + +[ext_resource type="AudioStream" uid="uid://blayfkg7vg4a6" path="res://assets/first_party/music/SongSanctuary_Step1.ogg" id="1_ed4bk"] +[ext_resource type="AudioStream" uid="uid://cq6fkwodai236" path="res://assets/first_party/music/SongSanctuary_Step2.ogg" id="2_1g5jr"] +[ext_resource type="AudioStream" uid="uid://coklrcdylmkxw" path="res://assets/first_party/music/SongSanctuary_Step3.ogg" id="3_pourw"] +[ext_resource type="AudioStream" uid="uid://1iuhkbumkpab" path="res://assets/first_party/music/SongSanctuary_Step4.ogg" id="4_fs84w"] +[ext_resource type="AudioStream" uid="uid://k0g7i1mv3e40" path="res://assets/first_party/music/SongSanctuary_Full.ogg" id="5_ticue"] + +[resource] +clip_count = 5 +clip_0/name = &"Step1" +clip_0/stream = ExtResource("1_ed4bk") +clip_0/auto_advance = 0 +clip_1/name = &"Step2" +clip_1/stream = ExtResource("2_1g5jr") +clip_1/auto_advance = 0 +clip_2/name = &"Step3" +clip_2/stream = ExtResource("3_pourw") +clip_2/auto_advance = 0 +clip_3/name = &"Step4" +clip_3/stream = ExtResource("4_fs84w") +clip_3/auto_advance = 0 +clip_4/name = &"Full" +clip_4/stream = ExtResource("5_ticue") +clip_4/auto_advance = 0 +_transitions = { +Vector2i(-1, -1): { +"fade_beats": 0.0, +"fade_mode": 0, +"from_time": 2, +"to_time": 1 +} +} diff --git a/scenes/quests/lore_quests/quest_001/1_music_puzzle/music_puzzle.tscn b/scenes/quests/lore_quests/quest_001/1_music_puzzle/music_puzzle.tscn index a46f06aece..5acae9fbed 100644 --- a/scenes/quests/lore_quests/quest_001/1_music_puzzle/music_puzzle.tscn +++ b/scenes/quests/lore_quests/quest_001/1_music_puzzle/music_puzzle.tscn @@ -1,6 +1,7 @@ [gd_scene format=4 uid="uid://7hoy2p14t6kc"] [ext_resource type="TileSet" uid="uid://oynx002hv8tl" path="res://tiles/water.tres" id="1_ftljy"] +[ext_resource type="Script" uid="uid://ckme5a4h5jthr" path="res://scenes/quests/lore_quests/quest_001/1_music_puzzle/components/music_puzzle.gd" id="1_icnj0"] [ext_resource type="PackedScene" uid="uid://iu2q66clupc6" path="res://scenes/game_elements/characters/player/player.tscn" id="2_0ayb4"] [ext_resource type="Texture2D" uid="uid://be3845r07rhkm" path="res://scenes/game_elements/props/buildings/house/components/House_Wool_Red_Stage3.png" id="2_00t5e"] [ext_resource type="TileSet" uid="uid://bjx3gvah0ycl1" path="res://tiles/foam_2.tres" id="2_ftljy"] @@ -32,14 +33,14 @@ [ext_resource type="AudioStream" uid="uid://vgr28w2aalr1" path="res://assets/first_party/sounds/ambient/ForestAmbient.ogg" id="23_mgtd3"] [ext_resource type="SpriteFrames" uid="uid://b6doys1c3yelx" path="res://scenes/game_elements/props/decoration/bush/components/bush_spriteframes_red_small.tres" id="23_u8pjn"] [ext_resource type="AudioStream" uid="uid://cg57q82pb243w" path="res://assets/third_party/nepalese_hand_bells/handBells-c4.ogg" id="24_fgtmq"] -[ext_resource type="AudioStream" uid="uid://b83x8h0ob5mpq" path="res://assets/third_party/nepalese_hand_bells/handBells-d4.ogg" id="25_jdge0"] -[ext_resource type="AudioStream" uid="uid://cmtiwg2cylmts" path="res://assets/third_party/nepalese_hand_bells/handBells-e4.ogg" id="26_pjyxn"] -[ext_resource type="AudioStream" uid="uid://8k1hyi4gjae4" path="res://assets/third_party/nepalese_hand_bells/handBells-f4.ogg" id="27_ftljy"] -[ext_resource type="AudioStream" uid="uid://6oahn2ucxxjv" path="res://assets/third_party/nepalese_hand_bells/handBells-g4.ogg" id="28_orlow"] +[ext_resource type="AudioStream" uid="uid://dhvit65nmsp7h" path="res://assets/third_party/nepalese_hand_bells/handBells-g3.ogg" id="25_jdge0"] +[ext_resource type="AudioStream" uid="uid://bkflhi36lferi" path="res://assets/third_party/nepalese_hand_bells/handBells-g#3.ogg" id="26_pjyxn"] +[ext_resource type="AudioStream" uid="uid://cxmocxbawfhbm" path="res://assets/third_party/nepalese_hand_bells/handBells-a#3.ogg" id="27_ftljy"] [ext_resource type="SpriteFrames" uid="uid://pabpxy4b51t2" path="res://scenes/quests/lore_quests/quest_001/1_music_puzzle/components/bonfire_sign/bonfire_sign_forward.tres" id="29_crvxf"] -[ext_resource type="AudioStream" uid="uid://bdboi4ndapqec" path="res://assets/third_party/nepalese_hand_bells/handBells-a4.ogg" id="29_lbjl7"] +[ext_resource type="AudioStream" uid="uid://c46bu4sn1lpml" path="res://assets/third_party/nepalese_hand_bells/handBells-c#4.ogg" id="29_orlow"] [ext_resource type="SpriteFrames" uid="uid://ddpiw5p3lcyud" path="res://scenes/quests/lore_quests/quest_001/1_music_puzzle/components/bonfire_sign/bonfire_sign_forward_up.tres" id="30_0wfv2"] [ext_resource type="AudioStream" uid="uid://ctty20c12j0f5" path="res://assets/third_party/sounds/bonfire_sign/FireStart.ogg" id="30_55bav"] +[ext_resource type="AudioStream" uid="uid://5dtwojx17yy3" path="res://assets/third_party/nepalese_hand_bells/handBells-d#4.ogg" id="30_lbjl7"] [ext_resource type="SpriteFrames" uid="uid://d22724e7hsofa" path="res://scenes/quests/lore_quests/quest_001/1_music_puzzle/components/bonfire_sign/bonfire_sign_backward_up.tres" id="31_55bav"] [ext_resource type="AudioStream" uid="uid://c7om8kdork2rx" path="res://assets/third_party/sounds/characters/enemies/guard/Torch.ogg" id="31_ink4c"] [ext_resource type="SpriteFrames" uid="uid://cefk7kf0bpm3q" path="res://scenes/quests/lore_quests/quest_001/1_music_puzzle/components/bonfire_sign/bonfire_sign_backward.tres" id="32_0wfv2"] @@ -48,7 +49,9 @@ [ext_resource type="Script" uid="uid://edcifob4jc4s" path="res://scenes/game_logic/talk_behavior.gd" id="43_icnj0"] [ext_resource type="Resource" uid="uid://jf1tng8jxd3o" path="res://scenes/quests/lore_quests/quest_001/1_music_puzzle/components/dialogues/music_lore_helper.dialogue" id="44_pgedt"] [ext_resource type="Script" uid="uid://du8wfijr35r35" path="res://scenes/game_elements/props/interact_area/interact_area.gd" id="45_6y4lh"] +[ext_resource type="Script" uid="uid://c8405c212rbn6" path="res://scenes/game_elements/props/background_music/components/background_music.gd" id="45_ps6xw"] [ext_resource type="Script" uid="uid://diskln3jup064" path="res://scenes/game_elements/characters/npcs/components/helper_character.gd" id="46_jaqfj"] +[ext_resource type="AudioStream" uid="uid://wkn0u0npcijf" path="res://scenes/quests/lore_quests/quest_001/1_music_puzzle/components/song_sanctuary_music.tres" id="47_orlow"] [sub_resource type="Resource" id="Resource_dp3eg"] script = ExtResource("15_rxyid") @@ -70,6 +73,7 @@ _data = { point_count = 4 [node name="MusicPuzzle" type="Node2D" unique_id=1049570333] +script = ExtResource("1_icnj0") [node name="TileMapLayers" type="Node2D" parent="." unique_id=699615603] @@ -1367,6 +1371,9 @@ limit_bottom = 2048 position_smoothing_enabled = true editor_draw_limits = true +[node name="AudioListener2D" type="AudioListener2D" parent="OnTheGround/Player" unique_id=1685974923] +current = true + [node name="SequencePuzzleAssistant" parent="OnTheGround" unique_id=736222449 node_paths=PackedStringArray("puzzle") instance=ExtResource("20_jdge0")] position = Vector2(888, 865) puzzle = NodePath("../SequencePuzzle") @@ -1375,6 +1382,7 @@ look_at_side = 0 sprite_frames = ExtResource("4_8nm0x") [node name="SequencePuzzle" type="Node2D" parent="OnTheGround" unique_id=1957681156] +unique_name_in_owner = true y_sort_enabled = true position = Vector2(1410, 950) script = ExtResource("7_nonj7") @@ -1389,34 +1397,34 @@ text = "The Magical Melody y_sort_enabled = true position = Vector2(-1069, -33) -[node name="C" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=224048554 instance=ExtResource("22_0awvw")] +[node name="G" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=224048554 instance=ExtResource("22_0awvw")] sprite_modulate = Color(0.2937, 0.634442, 0.89, 1) -audio_stream = ExtResource("24_fgtmq") +audio_stream = ExtResource("25_jdge0") -[node name="D" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=2145263970 instance=ExtResource("22_0awvw")] +[node name="Ab" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=2145263970 instance=ExtResource("22_0awvw")] position = Vector2(80, -8) sprite_modulate = Color(0.89, 0.2937, 0.804817, 1) -audio_stream = ExtResource("25_jdge0") +audio_stream = ExtResource("26_pjyxn") -[node name="E" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=654636490 instance=ExtResource("22_0awvw")] +[node name="Bb" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=654636490 instance=ExtResource("22_0awvw")] position = Vector2(160, -16) sprite_modulate = Color(0.89, 0.804817, 0.2937, 1) -audio_stream = ExtResource("26_pjyxn") +audio_stream = ExtResource("27_ftljy") -[node name="F" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=1823554115 instance=ExtResource("22_0awvw")] +[node name="C" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=1823554115 instance=ExtResource("22_0awvw")] position = Vector2(240, -24) sprite_modulate = Color(0.2937, 0.89, 0.634451, 1) -audio_stream = ExtResource("27_ftljy") +audio_stream = ExtResource("24_fgtmq") -[node name="G" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=1942800513 instance=ExtResource("22_0awvw")] +[node name="Db" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=1942800513 instance=ExtResource("22_0awvw")] position = Vector2(320, -32) sprite_modulate = Color(0.464066, 0.2937, 0.89, 1) -audio_stream = ExtResource("28_orlow") +audio_stream = ExtResource("29_orlow") -[node name="A" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=707462418 instance=ExtResource("22_0awvw")] +[node name="Eb" parent="OnTheGround/SequencePuzzle/Rocks" unique_id=707462418 instance=ExtResource("22_0awvw")] position = Vector2(400, -40) sprite_modulate = Color(0.89, 0.2937, 0.2937, 1) -audio_stream = ExtResource("29_lbjl7") +audio_stream = ExtResource("30_lbjl7") [node name="Bonfires" type="Node2D" parent="OnTheGround/SequencePuzzle" unique_id=954791934] y_sort_enabled = true @@ -1449,31 +1457,31 @@ solved_ambient_sound = ExtResource("31_ink4c") [node name="SequencePuzzleStep1" type="Node2D" parent="OnTheGround/SequencePuzzle/Steps" unique_id=960878679 node_paths=PackedStringArray("sequence", "hint_sign")] script = ExtResource("20_thpfs") -sequence = [NodePath("../../Rocks/C"), NodePath("../../Rocks/D"), NodePath("../../Rocks/E"), NodePath("../../Rocks/G")] +sequence = [NodePath("../../Rocks/Ab"), NodePath("../../Rocks/C"), NodePath("../../Rocks/Bb"), NodePath("../../Rocks/C")] hint_sign = NodePath("../../Bonfires/BonfireSign1") [node name="SequencePuzzleStep2" type="Node2D" parent="OnTheGround/SequencePuzzle/Steps" unique_id=918194050 node_paths=PackedStringArray("sequence", "hint_sign")] script = ExtResource("20_thpfs") -sequence = [NodePath("../../Rocks/D"), NodePath("../../Rocks/E"), NodePath("../../Rocks/F"), NodePath("../../Rocks/A")] +sequence = [NodePath("../../Rocks/Bb"), NodePath("../../Rocks/Db"), NodePath("../../Rocks/C"), NodePath("../../Rocks/Db")] hint_sign = NodePath("../../Bonfires/BonfireSign2") [node name="SequencePuzzleStep3" type="Node2D" parent="OnTheGround/SequencePuzzle/Steps" unique_id=813372225 node_paths=PackedStringArray("sequence", "hint_sign")] script = ExtResource("20_thpfs") -sequence = [NodePath("../../Rocks/A"), NodePath("../../Rocks/F"), NodePath("../../Rocks/E"), NodePath("../../Rocks/D")] +sequence = [NodePath("../../Rocks/Db"), NodePath("../../Rocks/C"), NodePath("../../Rocks/Db"), NodePath("../../Rocks/Bb")] hint_sign = NodePath("../../Bonfires/BonfireSign3") [node name="SequencePuzzleStep4" type="Node2D" parent="OnTheGround/SequencePuzzle/Steps" unique_id=1131686816 node_paths=PackedStringArray("sequence", "hint_sign")] script = ExtResource("20_thpfs") -sequence = [NodePath("../../Rocks/G"), NodePath("../../Rocks/E"), NodePath("../../Rocks/D"), NodePath("../../Rocks/C")] +sequence = [NodePath("../../Rocks/C"), NodePath("../../Rocks/Bb"), NodePath("../../Rocks/C"), NodePath("../../Rocks/Ab")] hint_sign = NodePath("../../Bonfires/BonfireSign4") [node name="CollectibleItem" parent="OnTheGround/SequencePuzzle" unique_id=530712613 instance=ExtResource("14_src2c")] position = Vector2(-726, 43) revealed = false -next_scene = "uid://cgemeabsewy1f" item = SubResource("Resource_dp3eg") collected_dialogue = ExtResource("6_l4i5r") dialogue_title = &"well_done" +next_scene = "uid://cgemeabsewy1f" [node name="Helper" parent="OnTheGround" unique_id=1098678013 instance=ExtResource("42_ps6xw")] position = Vector2(675, 1714) @@ -1532,10 +1540,9 @@ script = ExtResource("22_nonj7") [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="ForestSoundPath/PlayerFollower" unique_id=633215010] stream = ExtResource("23_mgtd3") -volume_db = 3.0 autoplay = true max_distance = 1000.0 -attenuation = 1.41421 +attenuation = 2.0 panning_strength = 0.0 bus = &"SFX" @@ -1550,10 +1557,18 @@ script = ExtResource("22_nonj7") [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="RiverSoundPath/PlayerFollower" unique_id=7340519] stream = ExtResource("35_l8fgn") +volume_db = -4.0 autoplay = true -max_distance = 1000.0 -attenuation = 1.41421 +max_distance = 750.0 +attenuation = 2.0 panning_strength = 0.0 bus = &"SFX" +[node name="BackgroundMusic" type="Node" parent="." unique_id=589457193] +unique_name_in_owner = true +script = ExtResource("45_ps6xw") +stream = ExtResource("47_orlow") +metadata/_custom_type_script = "uid://c8405c212rbn6" + [connection signal="solved" from="OnTheGround/SequencePuzzle" to="OnTheGround/SequencePuzzle/CollectibleItem" method="reveal"] +[connection signal="step_solved" from="OnTheGround/SequencePuzzle" to="." method="_on_sequence_puzzle_step_solved"]