ready for export

This commit is contained in:
Adam Burns 2026-03-16 00:25:37 -04:00
parent e0c93f0e19
commit 1caed8e5bd
38 changed files with 744 additions and 119 deletions

BIN
assets/audio/blank-song.wav Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://mu1pkwkw3wyu"
path="res://.godot/imported/blank-song.wav-2c3b0e1a59785e41d9b1e9c6d2855fc4.sample"
[deps]
source_file="res://assets/audio/blank-song.wav"
dest_files=["res://.godot/imported/blank-song.wav-2c3b0e1a59785e41d9b1e9c6d2855fc4.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://diaivgv13xa8k"
path="res://.godot/imported/eine-kleine-blank.wav-3cf1079fa8dd4d381dc4d6fbd9e452b1.sample"
[deps]
source_file="res://assets/audio/eine-kleine-blank.wav"
dest_files=["res://.godot/imported/eine-kleine-blank.wav-3cf1079fa8dd4d381dc4d6fbd9e452b1.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://b6xe72a7nd2ol"
path="res://.godot/imported/eine-kleine-fast.wav-ee8157a6ec683ee91b7a1ba81656729d.sample"
[deps]
source_file="res://assets/audio/eine-kleine-fast.wav"
dest_files=["res://.godot/imported/eine-kleine-fast.wav-ee8157a6ec683ee91b7a1ba81656729d.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

View File

@ -0,0 +1,24 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://dlvawr3wv7ob4"
path="res://.godot/imported/eine-kleine-intro.wav-62220a455d3d38061ded9a60d4a6ec3e.sample"
[deps]
source_file="res://assets/audio/eine-kleine-intro.wav"
dest_files=["res://.godot/imported/eine-kleine-intro.wav-62220a455d3d38061ded9a60d4a6ec3e.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

View File

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cveidfttgu174"
path="res://.godot/imported/outro-screen-ALBM.png-c8b007393368a82095cf4821f4bb0e54.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/misc/outro-screen-ALBM.png"
dest_files=["res://.godot/imported/outro-screen-ALBM.png-c8b007393368a82095cf4821f4bb0e54.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

View File

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cicani7q1g5p"
path="res://.godot/imported/splash-screen-ALBM.png-d99bf01ddeac6f659a3371a4f4322275.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/misc/splash-screen-ALBM.png"
dest_files=["res://.godot/imported/splash-screen-ALBM.png-d99bf01ddeac6f659a3371a4f4322275.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
assets/ui/keyboard_x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 B

View File

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://4apr80conxxu"
path="res://.godot/imported/keyboard_x.png-2b6f22848ca94cdb13d5e35617c64312.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/ui/keyboard_x.png"
dest_files=["res://.godot/imported/keyboard_x.png-2b6f22848ca94cdb13d5e35617c64312.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

View File

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://doepfsn70f3we"
path="res://.godot/imported/keyboard_x_outline.png-ba4481e0ca0cc0ecf687f4f48d171968.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/ui/keyboard_x_outline.png"
dest_files=["res://.godot/imported/keyboard_x_outline.png-ba4481e0ca0cc0ecf687f4f48d171968.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

49
export_presets.cfg Normal file
View File

@ -0,0 +1,49 @@
[preset.0]
name="Web"
platform="Web"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path=""
patches=PackedStringArray()
patch_delta_encoding=false
patch_delta_compression_level_zstd=19
patch_delta_min_reduction=0.1
patch_delta_include_filters="*"
patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.0.options]
custom_template/debug=""
custom_template/release=""
variant/extensions_support=false
variant/thread_support=false
vram_texture_compression/for_desktop=true
vram_texture_compression/for_mobile=false
html/export_icon=true
html/custom_html_shell=""
html/head_include=""
html/canvas_resize_policy=2
html/focus_canvas_on_start=true
html/experimental_virtual_keyboard=false
progressive_web_app/enabled=false
progressive_web_app/ensure_cross_origin_isolation_headers=true
progressive_web_app/offline_page=""
progressive_web_app/display=1
progressive_web_app/orientation=0
progressive_web_app/icon_144x144=""
progressive_web_app/icon_180x180=""
progressive_web_app/icon_512x512=""
progressive_web_app/background_color=Color(0, 0, 0, 1)
threads/emscripten_pool_size=8
threads/godot_pool_size=4

View File

@ -11,8 +11,9 @@ config_version=5
[application]
config/name="trijam-363-conductor"
run/main_scene="uid://irgt7rn5kfap"
run/main_scene="uid://bbw7g5cdqgafr"
config/features=PackedStringArray("4.6", "Forward Plus")
boot_splash/image="uid://cicani7q1g5p"
config/icon="res://icon.svg"
[autoload]
@ -26,6 +27,12 @@ window/size/viewport_height=720
[input]
ui_accept={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
viol={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":86,"key_label":0,"unicode":118,"location":0,"echo":false,"script":null)
@ -61,6 +68,11 @@ sample={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
]
}
execute={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"location":0,"echo":false,"script":null)
]
}
[physics]

View File

@ -3,6 +3,4 @@
[ext_resource type="Texture2D" uid="uid://cctoyonq28i8q" path="res://assets/ui/keyboard_v_outline.png" id="1_tpl0e"]
[node name="InputPrompt" type="Sprite2D" unique_id=590379112]
position = Vector2(0, 24)
scale = Vector2(0.25, 0.25)
texture = ExtResource("1_tpl0e")

34
scenes/intro.tscn Normal file
View File

@ -0,0 +1,34 @@
[gd_scene format=3 uid="uid://bbw7g5cdqgafr"]
[ext_resource type="Texture2D" uid="uid://cicani7q1g5p" path="res://assets/misc/splash-screen-ALBM.png" id="1_ioskq"]
[ext_resource type="Script" uid="uid://o45uvey2wnsb" path="res://scripts/intro.gd" id="1_yjqpq"]
[ext_resource type="AudioStream" uid="uid://dlvawr3wv7ob4" path="res://assets/audio/eine-kleine-intro.wav" id="3_4bx60"]
[node name="Intro" type="Control" unique_id=1666938959]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_yjqpq")
[node name="TextureRect" type="TextureRect" parent="." unique_id=244917967]
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
texture = ExtResource("1_ioskq")
[node name="StartButton" type="Button" parent="." unique_id=328829953]
unique_name_in_owner = true
layout_mode = 0
offset_left = 508.0
offset_top = 361.0
offset_right = 754.0
offset_bottom = 468.0
theme_override_font_sizes/font_size = 72
text = "BEGIN"
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="." unique_id=539142729]
stream = ExtResource("3_4bx60")
autoplay = true

View File

@ -23,16 +23,46 @@ position = Vector2(7, -6)
[node name="Conductor" parent="Musicians" unique_id=338073346 instance=ExtResource("8_tipki")]
unique_name_in_owner = true
position = Vector2(9, 32)
position = Vector2(-15, 39)
[node name="Cellist" parent="Musicians" unique_id=233159387 instance=ExtResource("6_85g3d")]
unique_name_in_owner = true
position = Vector2(18, 9)
position = Vector2(-59, 36)
[node name="Violinist" parent="Musicians" unique_id=557143802 instance=ExtResource("7_choun")]
unique_name_in_owner = true
position = Vector2(-48, 26)
position = Vector2(-13, 6)
[node name="Bassist" parent="Musicians" unique_id=884981738 instance=ExtResource("8_ya4ey")]
unique_name_in_owner = true
position = Vector2(-32, -1)
position = Vector2(33, 38)
[node name="UI" type="CanvasLayer" parent="." unique_id=731230116]
[node name="InstructionsBox" type="VBoxContainer" parent="UI" unique_id=135409027]
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -400.0
offset_top = 300.0
offset_right = 400.0
offset_bottom = 466.0
grow_horizontal = 2
[node name="Instructions" type="Label" parent="UI/InstructionsBox" unique_id=957159240]
unique_name_in_owner = true
custom_minimum_size = Vector2(800, 80)
layout_mode = 2
theme_override_font_sizes/font_size = 24
text = "Placeholder Instructions!"
horizontal_alignment = 1
vertical_alignment = 1
autowrap_mode = 3
[node name="OKButton" type="Button" parent="UI/InstructionsBox" unique_id=462603065]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_font_sizes/font_size = 24
text = "CONTINUE"

View File

@ -3,16 +3,41 @@
[ext_resource type="PackedScene" uid="uid://irgt7rn5kfap" path="res://scenes/levels/level.tscn" id="1_sxr8l"]
[node name="Level0" unique_id=1319338792 instance=ExtResource("1_sxr8l")]
instruction_strings = Array[String](["This is the tutorial level; the little person below is the CONDUCTOR", "When you're ready, press the spacebar to start the music", "OK, so if you've done that, you've probably noticed that the \"music\" here is just a click track...", "...and that it may already be muted. ", "That's a feature, not a bug!", "To turn it back up, press the \"X\" key.", "(\"X\" as in ... \"eXecute\"? ... and like the little button next to the conductor)", "(It'll make more sense in a minute.)", "OK, so now you've probably noticed that you have to *keep* pressing \"X\" to keep the volume up.", "Every time you push \"X\", it *boosts* the volume back up", "And after some time, the volume drops back down on its own", "(This time gets shorter as the game goes on.)", "When you've had enough of the click track, hit \"CONTINUE\" once more to move on"])
[node name="Cellist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="1" unique_id=233159387]
visible = false
[node name="VolumeBar" parent="Musicians/Cellist/InputPrompt" parent_id_path=PackedInt32Array(233159387, 1882230995) index="0" unique_id=2023225709]
custom_minimum_size = Vector2(24, 48)
offset_left = -32.0
offset_top = -25.0
offset_right = -8.0
offset_bottom = 23.0
[node name="Violinist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="2" unique_id=557143802]
visible = false
[node name="VolumeBar" parent="Musicians/Violinist/InputPrompt" parent_id_path=PackedInt32Array(557143802, 1882230995) index="0" unique_id=2023225709]
custom_minimum_size = Vector2(24, 48)
offset_left = 8.0
offset_top = -25.0
offset_right = 32.000015
offset_bottom = 23.0
[node name="Bassist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="3" unique_id=884981738]
visible = false
[node name="VolumeBar" parent="Musicians/Bassist/InputPrompt" parent_id_path=PackedInt32Array(884981738, 1882230995) index="0" unique_id=2023225709]
custom_minimum_size = Vector2(24, 48)
offset_left = 8.0
offset_top = -25.0
offset_right = 32.0
offset_bottom = 23.0
[node name="Instructions" parent="UI/InstructionsBox" parent_id_path=PackedInt32Array(135409027) index="0" unique_id=957159240]
text = "Welcome to \"A Little Byte-Music\""
[editable path="Musicians/Conductor"]
[editable path="Musicians/Cellist"]
[editable path="Musicians/Violinist"]

View File

@ -3,6 +3,8 @@
[ext_resource type="PackedScene" uid="uid://irgt7rn5kfap" path="res://scenes/levels/level.tscn" id="1_x6ivy"]
[node name="Level1" unique_id=1319338792 instance=ExtResource("1_x6ivy")]
level_number = 1
instruction_strings = Array[String](["In this case, it's the Bassist. Let's call them Bradley.", "This time around, pressing spacebar will actually trigger actual music...", "(Also, instead of pressing \"X\", you'll have to press \"B\" to keep Bradley playing.)", "But be careful! If you try to boost while the volume's already boosted, it won't sound good.", "(You'll also have to restart the level*.)", "(*in future versions.)", "If you haven't already, go ahead and hit spacebar to play the bass track!", "If the song's over, you can hit spacebar again to try again, or click continue to move on."])
[node name="Cellist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="1" unique_id=233159387]
visible = false
@ -10,6 +12,12 @@ visible = false
[node name="Violinist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="2" unique_id=557143802]
visible = false
[node name="Bassist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="3" unique_id=884981738]
position = Vector2(35, 28)
[node name="Instructions" parent="UI/InstructionsBox" parent_id_path=PackedInt32Array(135409027) index="0" unique_id=957159240]
text = "Oh look, it's a musician!"
[editable path="Musicians/Conductor"]
[editable path="Musicians/Cellist"]
[editable path="Musicians/Violinist"]

View File

@ -3,10 +3,21 @@
[ext_resource type="PackedScene" uid="uid://irgt7rn5kfap" path="res://scenes/levels/level.tscn" id="1_j2425"]
[node name="Level2" unique_id=1319338792 instance=ExtResource("1_j2425")]
level_number = 2
instruction_strings = Array[String](["This is the Cellist; let's call them Charlie!", "Charlie needs a little more prompting, so their volume meter runs down more quickly", "And of course, you still need to keep Bradley on time.", "(Conducting is hard!)", "Again, press spacebar to start/stop/restart the song.", "And when you're ready for the last level, click CONTINUE."])
[node name="Cellist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="1" unique_id=233159387]
position = Vector2(-63, 29)
[node name="Violinist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="2" unique_id=557143802]
visible = false
[node name="Bassist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="3" unique_id=884981738]
position = Vector2(35, 28)
[node name="Instructions" parent="UI/InstructionsBox" parent_id_path=PackedInt32Array(135409027) index="0" unique_id=957159240]
text = "Whoa, another one!"
[editable path="Musicians/Conductor"]
[editable path="Musicians/Cellist"]
[editable path="Musicians/Violinist"]

View File

@ -3,6 +3,20 @@
[ext_resource type="PackedScene" uid="uid://irgt7rn5kfap" path="res://scenes/levels/level.tscn" id="1_o8c3j"]
[node name="Level3" unique_id=1319338792 instance=ExtResource("1_o8c3j")]
level_number = 3
instruction_strings = Array[String](["Vic the Violinist is *such* a diva, and needs nearly constant attention.", "But of course, you can't neglect Bradley and Charlie.", "Go ahead and press spacebar, and see how you do!", ""])
[node name="Cellist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="1" unique_id=233159387]
position = Vector2(-63, 29)
[node name="Violinist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="2" unique_id=557143802]
position = Vector2(-11, -1)
[node name="Bassist" parent="Musicians" parent_id_path=PackedInt32Array(237973745) index="3" unique_id=884981738]
position = Vector2(35, 28)
[node name="Instructions" parent="UI/InstructionsBox" parent_id_path=PackedInt32Array(135409027) index="0" unique_id=957159240]
text = "Last level! The whole band is here now."
[editable path="Musicians/Conductor"]
[editable path="Musicians/Cellist"]

View File

@ -2,31 +2,27 @@
[ext_resource type="PackedScene" uid="uid://c1tceq1kcqngi" path="res://scenes/musicians/musician.tscn" id="1_ec361"]
[ext_resource type="SpriteFrames" uid="uid://c34ha4ekm1xor" path="res://resources/sprite_frames/bass_sprite_frames.tres" id="2_58d2m"]
[ext_resource type="Texture2D" uid="uid://bw3nb0oru0pam" path="res://assets/ui/keyboard_b.png" id="3_qpy72"]
[ext_resource type="Texture2D" uid="uid://bmc2ijkmfndv7" path="res://assets/ui/keyboard_b_outline.png" id="4_5nfdv"]
[ext_resource type="AudioStream" uid="uid://cc6smyxkrrvfr" path="res://assets/audio/eine-kleine-bass.wav" id="5_58d2m"]
[ext_resource type="PackedScene" uid="uid://r5ec5td6b2b2" path="res://scenes/tilemaps.tscn" id="6_qpy72"]
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_58d2m"]
polygon = PackedVector2Array(-2, 13, 3, 14, 6, 13)
polygon = PackedVector2Array(-6, 14, -3, 15, 2, 14)
[node name="Bassist" unique_id=233159387 instance=ExtResource("1_ec361")]
sprite_frames = ExtResource("2_58d2m")
solid_texture = ExtResource("3_qpy72")
outline_texture = ExtResource("4_5nfdv")
frame_progress = 0.0
flip_h = true
input_action = "bass"
[node name="Audio" parent="." index="0" unique_id=1183742914]
stream = ExtResource("5_58d2m")
[node name="Light" parent="." index="1" unique_id=428469575]
position = Vector2(7, 7)
position = Vector2(1, 6)
[node name="Occluder" parent="." index="2" unique_id=807216766]
occluder = SubResource("OccluderPolygon2D_58d2m")
[node name="InputPrompt" parent="." index="3" unique_id=590379112]
position = Vector2(18, 4)
[node name="InputPrompt" parent="." index="7" unique_id=1882230995]
position = Vector2(-16, 0)
texture = ExtResource("4_5nfdv")
[node name="Tilemaps" parent="." index="4" unique_id=875292520 instance=ExtResource("6_qpy72")]
visible = false

View File

@ -5,16 +5,17 @@
[ext_resource type="Texture2D" uid="uid://dahurq3y0kh20" path="res://assets/ui/keyboard_c.png" id="3_vjovb"]
[ext_resource type="Texture2D" uid="uid://d1onhhk6xorit" path="res://assets/ui/keyboard_c_outline.png" id="4_vmq6l"]
[ext_resource type="AudioStream" uid="uid://duovjdbif7wkw" path="res://assets/audio/eine-kleine-cello.wav" id="5_vjovb"]
[ext_resource type="PackedScene" uid="uid://r5ec5td6b2b2" path="res://scenes/tilemaps.tscn" id="6_vmq6l"]
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_vjovb"]
polygon = PackedVector2Array(-4, 16, -7, 14, 0, 13)
[node name="Cellist" unique_id=233159387 instance=ExtResource("1_gkxwc")]
sprite_frames = ExtResource("2_3cfa0")
flip_h = true
frame_progress = 0.0
solid_texture = ExtResource("3_vjovb")
outline_texture = ExtResource("4_vmq6l")
boost_note_type = 2
input_action = "cello"
[node name="Audio" parent="." index="0" unique_id=1183742914]
stream = ExtResource("5_vjovb")
@ -25,9 +26,5 @@ position = Vector2(8, 5)
[node name="Occluder" parent="." index="2" unique_id=807216766]
occluder = SubResource("OccluderPolygon2D_vjovb")
[node name="InputPrompt" parent="." index="3" unique_id=590379112]
position = Vector2(17, 3)
[node name="InputPrompt" parent="." index="8" unique_id=1882230995]
texture = ExtResource("4_vmq6l")
[node name="Tilemaps" parent="." index="4" unique_id=875292520 instance=ExtResource("6_vmq6l")]
visible = false

View File

@ -1,19 +1,24 @@
[gd_scene format=3 uid="uid://drwm126itwavd"]
[ext_resource type="PackedScene" uid="uid://c1tceq1kcqngi" path="res://scenes/musicians/musician.tscn" id="1_td0jb"]
[ext_resource type="Texture2D" uid="uid://bcw48038qg8od" path="res://assets/ui/keyboard_r.png" id="3_lajfc"]
[ext_resource type="Texture2D" uid="uid://do6jqp2l6nmwm" path="res://assets/ui/keyboard_r_outline.png" id="4_grljo"]
[ext_resource type="SpriteFrames" uid="uid://brmhup007maeh" path="res://resources/sprite_frames/conductor_sprite_frames.tres" id="2_lajfc"]
[ext_resource type="AudioStream" uid="uid://b8n6p428csquv" path="res://assets/audio/eine-kleine-click.wav" id="5_grljo"]
[ext_resource type="Texture2D" uid="uid://doepfsn70f3we" path="res://assets/ui/keyboard_x_outline.png" id="6_4kkbu"]
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_lajfc"]
polygon = PackedVector2Array(-4, 15, -2, 14, 0, 14)
polygon = PackedVector2Array(-1, 14, 2, 14, 4, 15)
[node name="Conductor" unique_id=233159387 instance=ExtResource("1_td0jb")]
solid_texture = ExtResource("3_lajfc")
outline_texture = ExtResource("4_grljo")
sprite_frames = ExtResource("2_lajfc")
frame_progress = 0.0
flip_h = true
input_action = "execute"
[node name="Audio" parent="." index="0" unique_id=1183742914]
stream = ExtResource("5_grljo")
[node name="Occluder" parent="." index="2" unique_id=807216766]
occluder = SubResource("OccluderPolygon2D_lajfc")
[node name="InputPrompt" parent="." index="7" unique_id=1882230995]
texture = ExtResource("6_4kkbu")

View File

@ -2,11 +2,9 @@
[ext_resource type="Texture2D" uid="uid://42h7vrqekyma" path="res://assets/sprites/symphonyguys.png" id="1_7bqbn"]
[ext_resource type="Script" uid="uid://djmn4qgj45j2p" path="res://scripts/musician.gd" id="1_ksqn6"]
[ext_resource type="Texture2D" uid="uid://cacp5ppga66l8" path="res://assets/ui/keyboard_s.svg" id="3_1d8vp"]
[ext_resource type="PackedScene" uid="uid://cwdkw1p371bks" path="res://scenes/input_prompt.tscn" id="3_6yfn3"]
[ext_resource type="PackedScene" uid="uid://ckx47081eegis" path="res://scenes/light.tscn" id="3_svwww"]
[ext_resource type="Texture2D" uid="uid://ck6iss1he1kpq" path="res://assets/ui/keyboard_s_outline.svg" id="4_vrlc6"]
[ext_resource type="AudioStream" uid="uid://b13l86o40lpvg" path="res://assets/audio/drone-trombone.wav" id="5_1d8vp"]
[ext_resource type="AudioStream" uid="uid://bd01iv6fpqbdh" path="res://assets/audio/eine-kleine-viol.wav" id="5_1d8vp"]
[sub_resource type="AtlasTexture" id="AtlasTexture_5pb5f"]
atlas = ExtResource("1_7bqbn")
@ -52,14 +50,33 @@ animations = [{
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_1d8vp"]
polygon = PackedVector2Array(-4, 14, -1, 13, 0, 14)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1d8vp"]
bg_color = Color(0.6, 0.6, 0.6, 0)
draw_center = false
corner_radius_top_left = 8
corner_radius_top_right = 8
corner_radius_bottom_right = 8
corner_radius_bottom_left = 8
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7bqbn"]
bg_color = Color(0, 0, 0, 1)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.8, 0.8, 0.8, 0)
corner_radius_top_left = 8
corner_radius_top_right = 8
corner_radius_bottom_right = 8
corner_radius_bottom_left = 8
[node name="Musician" type="AnimatedSprite2D" unique_id=233159387]
sprite_frames = SubResource("SpriteFrames_1b7aj")
animation = &"idle"
autoplay = "idle"
frame_progress = 0.25206318
frame_progress = 0.4639073
script = ExtResource("1_ksqn6")
solid_texture = ExtResource("3_1d8vp")
outline_texture = ExtResource("4_vrlc6")
boost_note_type = 4
input_action = "sample"
[node name="Audio" type="AudioStreamPlayer2D" parent="." unique_id=1183742914]
@ -74,25 +91,46 @@ position = Vector2(4, 9)
unique_name_in_owner = true
occluder = SubResource("OccluderPolygon2D_1d8vp")
[node name="InputPrompt" parent="." unique_id=590379112 instance=ExtResource("3_6yfn3")]
unique_name_in_owner = true
position = Vector2(16, 0)
texture = ExtResource("4_vrlc6")
[node name="MusicianCamera" type="Camera2D" parent="." unique_id=478462884]
zoom = Vector2(12, 12)
editor_draw_screen = false
[node name="VolumeBar" type="ProgressBar" parent="." unique_id=2023225709]
[node name="BoostTimer" type="Timer" parent="." unique_id=1715371353]
unique_name_in_owner = true
custom_minimum_size = Vector2(24, 48)
offset_left = 25.0
offset_top = -25.0
offset_right = 49.0
offset_bottom = 23.0
[node name="BeatTimer" type="Timer" parent="." unique_id=1308693046]
unique_name_in_owner = true
[node name="BeatParticles" type="CPUParticles2D" parent="." unique_id=1182124992]
light_mask = 0
position = Vector2(0, -15)
emitting = false
lifetime = 0.15000000000000002
one_shot = true
direction = Vector2(0, -1)
spread = 30.0
gravity = Vector2(0, 490)
initial_velocity_min = 75.0
initial_velocity_max = 100.0
[node name="InputPrompt" type="Sprite2D" parent="." unique_id=1882230995]
unique_name_in_owner = true
position = Vector2(16, 0)
scale = Vector2(0.25, 0.25)
texture = ExtResource("4_vrlc6")
[node name="VolumeBar" type="ProgressBar" parent="InputPrompt" unique_id=2023225709]
unique_name_in_owner = true
show_behind_parent = true
light_mask = 0
custom_minimum_size = Vector2(48, 48)
offset_left = -24.0
offset_top = -24.0
offset_right = 24.0
offset_bottom = 24.0
theme_override_styles/background = SubResource("StyleBoxFlat_1d8vp")
theme_override_styles/fill = SubResource("StyleBoxFlat_7bqbn")
min_value = -80.0
max_value = 0.0
fill_mode = 3
show_percentage = false
[node name="BoostTimer" type="Timer" parent="." unique_id=1715371353]
unique_name_in_owner = true

View File

@ -2,31 +2,24 @@
[ext_resource type="PackedScene" uid="uid://c1tceq1kcqngi" path="res://scenes/musicians/musician.tscn" id="1_bgcse"]
[ext_resource type="SpriteFrames" uid="uid://bkq7b1w5jh1ec" path="res://resources/sprite_frames/viol_sprite_frames.tres" id="2_pec4u"]
[ext_resource type="Texture2D" uid="uid://bm53tpx7cbocx" path="res://assets/ui/keyboard_v.png" id="3_4d75b"]
[ext_resource type="Texture2D" uid="uid://cctoyonq28i8q" path="res://assets/ui/keyboard_v_outline.png" id="4_noys6"]
[ext_resource type="AudioStream" uid="uid://bd01iv6fpqbdh" path="res://assets/audio/eine-kleine-viol.wav" id="5_pec4u"]
[ext_resource type="PackedScene" uid="uid://r5ec5td6b2b2" path="res://scenes/tilemaps.tscn" id="6_4d75b"]
[sub_resource type="OccluderPolygon2D" id="OccluderPolygon2D_pec4u"]
polygon = PackedVector2Array(-1, 14, 2, 13, 4, 13)
polygon = PackedVector2Array(-5, 13, -2, 13, 1, 14)
[node name="Violinist" unique_id=233159387 instance=ExtResource("1_bgcse")]
sprite_frames = ExtResource("2_pec4u")
solid_texture = ExtResource("3_4d75b")
outline_texture = ExtResource("4_noys6")
[node name="Audio" parent="." index="0" unique_id=1183742914]
stream = ExtResource("5_pec4u")
frame_progress = 0.0
flip_h = true
boost_note_type = 1
input_action = "viol"
[node name="Light" parent="." index="1" unique_id=428469575]
position = Vector2(7, 7)
position = Vector2(2, 9)
[node name="Occluder" parent="." index="2" unique_id=807216766]
occluder = SubResource("OccluderPolygon2D_pec4u")
[node name="InputPrompt" parent="." index="3" unique_id=590379112]
position = Vector2(18, 4)
[node name="InputPrompt" parent="." index="7" unique_id=1882230995]
position = Vector2(-16, 0)
texture = ExtResource("4_noys6")
[node name="Tilemaps" parent="." index="4" unique_id=875292520 instance=ExtResource("6_4d75b")]
visible = false

34
scenes/outro.gd Normal file
View File

@ -0,0 +1,34 @@
#@tool
#@icon(icon_path: String)
#class_name MyNode
extends Node
## Documentation comments
#signal
#enum
#const
#@export var
#var
#@onready var
@onready var outro_stream: AudioStreamPlayer = $OutroStream
## OVERRIDES
func _ready() -> void:
outro_stream.connect("finished", on_stream_finished)
func _process(_delta: float) -> void:
pass
func _physics_process(_delta: float) -> void:
pass
## CORE
## PRIVATE/HELPER
## RECEIVERS
func on_stream_finished() -> void:
get_tree().quit()
## SETTERS/GETTERS

1
scenes/outro.gd.uid Normal file
View File

@ -0,0 +1 @@
uid://c7h7awn4j2qv3

24
scenes/outro.tscn Normal file
View File

@ -0,0 +1,24 @@
[gd_scene format=3 uid="uid://c7eypje2fjbyx"]
[ext_resource type="Script" uid="uid://c7h7awn4j2qv3" path="res://scenes/outro.gd" id="1_a6ogt"]
[ext_resource type="Texture2D" uid="uid://cveidfttgu174" path="res://assets/misc/outro-screen-ALBM.png" id="1_nvx42"]
[ext_resource type="AudioStream" uid="uid://b6xe72a7nd2ol" path="res://assets/audio/eine-kleine-fast.wav" id="2_r6h2c"]
[node name="Outro" type="Control" unique_id=1312269195]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_a6ogt")
[node name="TextureRect" type="TextureRect" parent="." unique_id=1920943136]
layout_mode = 0
offset_right = 40.0
offset_bottom = 40.0
texture = ExtResource("1_nvx42")
[node name="OutroStream" type="AudioStreamPlayer" parent="." unique_id=2063751836]
stream = ExtResource("2_r6h2c")
autoplay = true

37
scripts/intro.gd Normal file
View File

@ -0,0 +1,37 @@
#@tool
#@icon(icon_path: String)
#class_name MyNode
extends Node
## Documentation comments
#signal
#enum
#const
const LEVEL_0 = preload("uid://1mhb537c1qxd")
#@export var
#var
@onready var start_button: Button = %StartButton
## OVERRIDES
func _ready() -> void:
start_button.connect("pressed", on_start_button_pressed)
func _process(_delta: float) -> void:
pass
func _physics_process(_delta: float) -> void:
pass
## CORE
## PRIVATE/HELPER
## RECEIVERS
func on_start_button_pressed() -> void:
get_tree().change_scene_to_packed(LEVEL_0)
## SETTERS/GETTERS

1
scripts/intro.gd.uid Normal file
View File

@ -0,0 +1 @@
uid://o45uvey2wnsb

View File

@ -7,45 +7,71 @@ extends Node2D
#signal
#enum
#const
const EINE_KLEINE_BLANK = preload("uid://diaivgv13xa8k")
const OUTRO = preload("uid://c7eypje2fjbyx")
@export var level_number: int = 0
@export var instruction_strings: Array[String]
# Musicians
@onready var conductor: Musician = %Conductor
@onready var violinist: Musician = %Violinist
@onready var cellist: Musician = %Cellist
@onready var bassist: Musician = %Bassist
#var musicians: Array[Musician]
var next_instruction: String
@onready var ok_button: Button = %OKButton
@onready var instructions: Label = %Instructions
@onready var tilemaps: Tilemaps = $Tilemaps
## Musicians
@onready var conductor: Musician = %Conductor
@onready var bassist: Musician = %Bassist
@onready var cellist: Musician = %Cellist
@onready var violinist: Musician = %Violinist
## OVERRIDES
func _ready() -> void:
_connect_signals()
tilemaps.canvas_modulate.visible = true
SceneManager.build_level(level_number)
#if instruction_strings:
#next_instruction = instruction_strings.pop_front()
#SceneManager.load_level(level_number)
if level_number < 3:
violinist.queue_free()
if level_number < 2:
cellist.queue_free()
if level_number < 1:
bassist.queue_free()
else:
conductor.audio.stream = EINE_KLEINE_BLANK
conductor.input_prompt.visible = false
#musicians = [
#conductor,
#bassist,
#cellist,
#violinist
#]
#func _process(_delta: float) -> void:
#pass
#
#func _physics_process(_delta: float) -> void:
#pass
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("ready"):
conductor.enter_exit()
if event.is_action_pressed("viol"):
violinist.enter_exit()
if event.is_action_pressed("cello"):
cellist.enter_exit()
if event.is_action_pressed("bass"):
bassist.enter_exit()
## CORE
func ui_continue() -> void:
if instruction_strings.size() > 0:
instructions.text = instruction_strings.pop_front()
else:
level_number += 1
if level_number <= 3:
SceneManager.load_level(level_number)
else:
get_tree().change_scene_to_packed(OUTRO)
## PRIVATE/HELPER
func _connect_signals() -> void:
ok_button.connect("pressed", on_ok_button_pressed)
## RECEIVERS
func on_ok_button_pressed() -> void:
ui_continue()
## SETTERS/GETTERS

View File

@ -8,18 +8,19 @@ extends AnimatedSprite2D
#enum
#const
@export_group("Input Textures")
@export var solid_texture: Texture2D
@export var outline_texture: Texture2D
#@export_group("Input Textures")
#@export var solid_texture: Texture2D
#@export var outline_texture: Texture2D
@export var beats_per_boost: int = 4
@export var song_tempo: int = 120
@export_enum("sample", "viol", "cello", "bass", "ready") var input_action: String
@export_enum("whole:4", "half:2", "quarter:1") var boost_note_type: int
@export_enum("sample", "viol", "cello", "bass", "execute") var input_action: String
var beat_count: int = 0
var decay_length: float
var decay_rate: float
var is_active: bool = false
var is_playing_music: bool = false
var is_boosted: bool
var is_over_boosted: bool = false
var seconds_per_beat: float
@ -30,17 +31,19 @@ var useconds_per_beat: int
@onready var occluder: LightOccluder2D = %Occluder
@onready var input_prompt: Sprite2D = %InputPrompt
@onready var volume_bar: ProgressBar = %VolumeBar
@onready var beat_timer: Timer = %BeatTimer
@onready var boost_timer: Timer = %BoostTimer
@onready var beat_particles: CPUParticles2D = $BeatParticles
## OVERRIDES
func _ready() -> void:
light.visible = false
_connect_signals()
input_prompt.texture = outline_texture
#input_prompt.texture = outline_texture
seconds_per_beat = 60.0/float(song_tempo)
decay_length = beats_per_boost * seconds_per_beat
beat_timer.wait_time = seconds_per_beat
decay_length = boost_note_type * seconds_per_beat
print("this musician's boosts will last %s seconds" % decay_length)
boost_timer.wait_time = decay_length
decay_rate = 80.0 / decay_length
@ -48,8 +51,8 @@ func _ready() -> void:
func _process(delta: float) -> void:
if is_over_boosted:
distort_pitch(sin(Time.get_ticks_msec()))
if is_active and not is_boosted:
distort_pitch()
if is_playing_music and not is_boosted:
drop_volume(decay_rate * delta)
volume_bar.value = audio.volume_db
@ -67,39 +70,58 @@ func boost_volume() -> void:
is_boosted = true
boost_timer.start()
func distort_pitch(distortion: float) -> void:
print("distorting by %s" % distortion)
audio.pitch_scale += distortion
print("pitch scale is %s" % audio.pitch_scale)
func distort_pitch() -> void:
audio.pitch_scale += randf_range(-0.001, 0.0001)
func drop_volume(d_r: float) -> void:
audio.volume_db -= d_r
func play_pause() -> void:
if is_active:
play("idle")
audio.stop()
light.visible = false
is_active = false
input_prompt.texture = outline_texture
if not is_playing_music:
_play()
else:
play("default")
audio.play()
if not is_boosted:
is_boosted = true
boost_timer.start()
light.visible = true
is_active = true
input_prompt.texture = solid_texture
_pause()
## PRIVATE/HELPER
func _connect_signals() -> void:
boost_timer.connect("timeout", on_boost_timer_timeout)
audio.connect("finished", play_pause)
beat_timer.connect("timeout", on_beat_timer_timeout)
func _play() -> void:
play("default")
audio.play()
beat_timer.start()
if not is_boosted:
is_boosted = true
boost_timer.start()
light.visible = true
is_playing_music = true
#input_prompt.texture = solid_texture
func _pause() -> void:
play("idle")
audio.stop()
beat_timer.stop()
light.visible = false
is_playing_music = false
#input_prompt.texture = outline_texture
## RECEIVERS
func on_beat_timer_timeout() -> void:
beat_count += 1
if beat_count % 4 == 0:
beat_particles.color = Color.RED
beat_particles.amount = 24
beat_particles.lifetime = 0.2
else:
beat_particles.color = Color.WHITE
beat_particles.amount = 8
beat_particles.lifetime = 0.15
beat_particles.restart()
func on_boost_timer_timeout() -> void:
print("boost over")
boost_timer.stop()

View File

@ -6,23 +6,37 @@ extends Node
#signal
#enum
#const
const LEVEL_0 = preload("uid://1mhb537c1qxd")
const LEVEL_1 = preload("uid://dwqw0ieu8smw7")
const LEVEL_2 = preload("uid://cdbfis58lkruf")
const LEVEL_3 = preload("uid://ccoc6j4r7yixt")
#@export var
var levels: Array[Level]
var current_level: Level
var levels: Array[PackedScene]
var current_level: PackedScene
#@onready var
## OVERRIDES
func _ready() -> void:
pass
levels = [
LEVEL_0,
LEVEL_1,
LEVEL_2,
LEVEL_3
]
#func _process(_delta: float) -> void:
#pass
## CORE
func build_level(level_number: int) -> void:
func load_level(level_number: int) -> void:
print_debug("Building level #%s" % level_number)
get_tree().change_scene_to_packed(levels[level_number])
## PRIVATE/HELPER