Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions assets/first_party/music/SongSanctuary.strudel.js
Original file line number Diff line number Diff line change
@@ -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("<x!4 x ~ ~ ~>/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("<Ab2:major>")
.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");
3 changes: 3 additions & 0 deletions assets/first_party/music/SongSanctuary_Full.ogg
Git LFS file not shown
19 changes: 19 additions & 0 deletions assets/first_party/music/SongSanctuary_Full.ogg.import
Original file line number Diff line number Diff line change
@@ -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
3 changes: 3 additions & 0 deletions assets/first_party/music/SongSanctuary_Step1.ogg
Git LFS file not shown
19 changes: 19 additions & 0 deletions assets/first_party/music/SongSanctuary_Step1.ogg.import
Original file line number Diff line number Diff line change
@@ -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
3 changes: 3 additions & 0 deletions assets/first_party/music/SongSanctuary_Step2.ogg
Git LFS file not shown
19 changes: 19 additions & 0 deletions assets/first_party/music/SongSanctuary_Step2.ogg.import
Original file line number Diff line number Diff line change
@@ -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
3 changes: 3 additions & 0 deletions assets/first_party/music/SongSanctuary_Step3.ogg
Git LFS file not shown
19 changes: 19 additions & 0 deletions assets/first_party/music/SongSanctuary_Step3.ogg.import
Original file line number Diff line number Diff line change
@@ -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
3 changes: 3 additions & 0 deletions assets/first_party/music/SongSanctuary_Step4.ogg
Git LFS file not shown
19 changes: 19 additions & 0 deletions assets/first_party/music/SongSanctuary_Step4.ogg.import
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# SPDX-FileCopyrightText: The Threadbare Authors
# SPDX-License-Identifier: MPL-2.0
~ start
if thread.revealed:
=> collect_the_thread

if puzzle.is_solved():
=> item_hint

Expand All @@ -22,7 +25,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
Expand All @@ -46,12 +49,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
Expand All @@ -62,7 +64,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
Expand All @@ -72,7 +74,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
Expand All @@ -82,13 +84,15 @@ 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
Musician: You did it!... That's the magical melody... how wonderful. It's been so long since I heard it.
Musician: You have opened the portal to the Ink Well. Let's go there to collect ink so songs and stories can be written again.
Musician: But we must be careful, InkDrinkers dwell there!
do thread.reveal()
~ collect_the_thread
Musician: The melody awakened the memory of song. Collect the Memory threads before you go!
=> END

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# SPDX-FileCopyrightText: The Threadbare Authors
# SPDX-License-Identifier: MPL-2.0
extends Node2D

@onready var background_music: BackgroundMusic = %BackgroundMusic
@onready var thread: CollectibleItem = %CollectibleItem


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)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://ckme5a4h5jthr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
}
}
Loading