From 0de77c8595cc302e0169c95a1a0951d352f48a3f Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Fri, 27 Jun 2025 12:18:47 -0600 Subject: [PATCH] Added MP3 player functionality --- assets/music/chorus_01.wav.import | 24 +++ assets/music/descending_04.wav.import | 24 +++ assets/music/desert_01.wav.import | 24 +++ assets/music/driving_01.wav.import | 24 +++ assets/music/driving_02.wav.import | 24 +++ assets/music/simple_sample_01.wav.import | 24 +++ assets/music/thaw_v1_fast.wav.import | 24 +++ assets/music/thaw_v1_slow.wav.import | 24 +++ assets/music/thaw_v2_fast.wav.import | 24 +++ assets/music/thaw_v2_slow.wav.import | 24 +++ src/equipment/mp3_player/mp3_controller.gd | 5 + src/equipment/mp3_player/mp3_player.gd | 28 +++ src/equipment/mp3_player/mp3_player.tscn | 8 + src/equipment/mp3_player/mp3_track.gd | 5 + src/equipment/mp3_player/mp3_track.gd.uid | 1 + .../mp3_player/retro_selector_list.gd | 12 +- .../mp3_player/retro_selector_list.tscn | 1 - src/game/milestone.gd | 2 +- src/world/save_state.gd | 5 +- src/world/world.tscn | 2 +- src/world/world_manager.gd | 26 ++- src/world/world_manager.tres | 161 +++++++++++++++--- 22 files changed, 456 insertions(+), 40 deletions(-) create mode 100644 assets/music/chorus_01.wav.import create mode 100644 assets/music/descending_04.wav.import create mode 100644 assets/music/desert_01.wav.import create mode 100644 assets/music/driving_01.wav.import create mode 100644 assets/music/driving_02.wav.import create mode 100644 assets/music/simple_sample_01.wav.import create mode 100644 assets/music/thaw_v1_fast.wav.import create mode 100644 assets/music/thaw_v1_slow.wav.import create mode 100644 assets/music/thaw_v2_fast.wav.import create mode 100644 assets/music/thaw_v2_slow.wav.import create mode 100644 src/equipment/mp3_player/mp3_track.gd create mode 100644 src/equipment/mp3_player/mp3_track.gd.uid diff --git a/assets/music/chorus_01.wav.import b/assets/music/chorus_01.wav.import new file mode 100644 index 0000000..87eec07 --- /dev/null +++ b/assets/music/chorus_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bp1dv4lv3344w" +path="res://.godot/imported/chorus_01.wav-08b913ed895775e6776d50f6bebe6a94.sample" + +[deps] + +source_file="res://assets/music/chorus_01.wav" +dest_files=["res://.godot/imported/chorus_01.wav-08b913ed895775e6776d50f6bebe6a94.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/descending_04.wav.import b/assets/music/descending_04.wav.import new file mode 100644 index 0000000..1e61bd5 --- /dev/null +++ b/assets/music/descending_04.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://ccqmeqw3moxfd" +path="res://.godot/imported/descending_04.wav-d6765ea0a0cafe097da2847bcc202f16.sample" + +[deps] + +source_file="res://assets/music/descending_04.wav" +dest_files=["res://.godot/imported/descending_04.wav-d6765ea0a0cafe097da2847bcc202f16.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/desert_01.wav.import b/assets/music/desert_01.wav.import new file mode 100644 index 0000000..df9e638 --- /dev/null +++ b/assets/music/desert_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dgxko5ds8u2lk" +path="res://.godot/imported/desert_01.wav-581b6d94c48b10543d281e48b9fba2bb.sample" + +[deps] + +source_file="res://assets/music/desert_01.wav" +dest_files=["res://.godot/imported/desert_01.wav-581b6d94c48b10543d281e48b9fba2bb.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/driving_01.wav.import b/assets/music/driving_01.wav.import new file mode 100644 index 0000000..10d8d85 --- /dev/null +++ b/assets/music/driving_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d4qqqrnplej6" +path="res://.godot/imported/driving_01.wav-cd2dee17817d890d256fe4c14c9be367.sample" + +[deps] + +source_file="res://assets/music/driving_01.wav" +dest_files=["res://.godot/imported/driving_01.wav-cd2dee17817d890d256fe4c14c9be367.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/driving_02.wav.import b/assets/music/driving_02.wav.import new file mode 100644 index 0000000..36f5dc7 --- /dev/null +++ b/assets/music/driving_02.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b1rmpakal8l6j" +path="res://.godot/imported/driving_02.wav-ab678e7fa7549ee6f71278ea940b33ae.sample" + +[deps] + +source_file="res://assets/music/driving_02.wav" +dest_files=["res://.godot/imported/driving_02.wav-ab678e7fa7549ee6f71278ea940b33ae.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/simple_sample_01.wav.import b/assets/music/simple_sample_01.wav.import new file mode 100644 index 0000000..57dc0cb --- /dev/null +++ b/assets/music/simple_sample_01.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dgvknkfvoqk8r" +path="res://.godot/imported/simple_sample_01.wav-f44635820b5ba74709e951468def2cb5.sample" + +[deps] + +source_file="res://assets/music/simple_sample_01.wav" +dest_files=["res://.godot/imported/simple_sample_01.wav-f44635820b5ba74709e951468def2cb5.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/thaw_v1_fast.wav.import b/assets/music/thaw_v1_fast.wav.import new file mode 100644 index 0000000..f816331 --- /dev/null +++ b/assets/music/thaw_v1_fast.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b6wrx5fibaujw" +path="res://.godot/imported/thaw_v1_fast.wav-69deab9ac1a9e8ba32290fbad3f5a8f6.sample" + +[deps] + +source_file="res://assets/music/thaw_v1_fast.wav" +dest_files=["res://.godot/imported/thaw_v1_fast.wav-69deab9ac1a9e8ba32290fbad3f5a8f6.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/thaw_v1_slow.wav.import b/assets/music/thaw_v1_slow.wav.import new file mode 100644 index 0000000..bb5e5c5 --- /dev/null +++ b/assets/music/thaw_v1_slow.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://b3ktgjeq6fupj" +path="res://.godot/imported/thaw_v1_slow.wav-28769b14b2030e9c75166aac3c81680a.sample" + +[deps] + +source_file="res://assets/music/thaw_v1_slow.wav" +dest_files=["res://.godot/imported/thaw_v1_slow.wav-28769b14b2030e9c75166aac3c81680a.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/thaw_v2_fast.wav.import b/assets/music/thaw_v2_fast.wav.import new file mode 100644 index 0000000..5dbb4dd --- /dev/null +++ b/assets/music/thaw_v2_fast.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://p14r7l44dahr" +path="res://.godot/imported/thaw_v2_fast.wav-86f532708c35d5089df8e52aecf29505.sample" + +[deps] + +source_file="res://assets/music/thaw_v2_fast.wav" +dest_files=["res://.godot/imported/thaw_v2_fast.wav-86f532708c35d5089df8e52aecf29505.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/assets/music/thaw_v2_slow.wav.import b/assets/music/thaw_v2_slow.wav.import new file mode 100644 index 0000000..85e0d34 --- /dev/null +++ b/assets/music/thaw_v2_slow.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bkvjtdlhjfr7n" +path="res://.godot/imported/thaw_v2_slow.wav-f845bbe60946eed225876fcc22e1147c.sample" + +[deps] + +source_file="res://assets/music/thaw_v2_slow.wav" +dest_files=["res://.godot/imported/thaw_v2_slow.wav-f845bbe60946eed225876fcc22e1147c.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=2 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/src/equipment/mp3_player/mp3_controller.gd b/src/equipment/mp3_player/mp3_controller.gd index d1a0120..8f0888a 100644 --- a/src/equipment/mp3_player/mp3_controller.gd +++ b/src/equipment/mp3_player/mp3_controller.gd @@ -13,6 +13,11 @@ var selecting := true @onready var transition_player: AnimationPlayer = %TransitionPlayer +func set_track_list(track_list: Array[String]) -> void: + retro_selector_list.options = track_list + retro_selector_list.rebuild_list() + + func set_paused(paused: bool) -> void: play_label.visible = not paused pause_label.visible = paused diff --git a/src/equipment/mp3_player/mp3_player.gd b/src/equipment/mp3_player/mp3_player.gd index 5f2c8b7..3bee45f 100644 --- a/src/equipment/mp3_player/mp3_player.gd +++ b/src/equipment/mp3_player/mp3_player.gd @@ -2,6 +2,11 @@ extends Tool ## Pump up the jamz! @onready var mp3_controller: MP3Controller = %MP3Controller +@onready var audio_stream_player: AudioStreamPlayer = %AudioStreamPlayer + + +func _ready() -> void: + World.instance.manager.mp3_collected.connect(_on_mp3_collected) func unlocked() -> bool: @@ -16,3 +21,26 @@ func fire() -> void: func switch_mode() -> void: mp3_controller.cancel() + + +func _on_mp3_collected(_track: MP3Track) -> void: + # TODO we may want to dynamically build the player tracklist + # rather than rebuilding the whole thing each time a track is collected + var mp3_list: Array[String] = [] + mp3_list.assign( + World.instance.manager.mp3_collection.map(func(mp3: MP3Track) -> String: return mp3.title) + ) + mp3_controller.set_track_list(mp3_list) + + +func pause_playback() -> void: + audio_stream_player.stream_paused = true + + +func resume_playback() -> void: + audio_stream_player.stream_paused = false + + +func select_track(idx: int) -> void: + audio_stream_player.stream = World.instance.manager.mp3_collection[idx].track + audio_stream_player.play() diff --git a/src/equipment/mp3_player/mp3_player.tscn b/src/equipment/mp3_player/mp3_player.tscn index 6d12b50..706f419 100644 --- a/src/equipment/mp3_player/mp3_player.tscn +++ b/src/equipment/mp3_player/mp3_player.tscn @@ -82,3 +82,11 @@ skew = 0.0331613 unique_name_in_owner = true offset_right = 70.0 offset_bottom = 76.0 + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +unique_name_in_owner = true +bus = &"Music" + +[connection signal="pause" from="HUDTool/Rumbler/Position/HUDElement/DeviceScreenMask/SubViewportContainer/SubViewport/ScreenTransform/MP3Controller" to="." method="pause_playback"] +[connection signal="resume" from="HUDTool/Rumbler/Position/HUDElement/DeviceScreenMask/SubViewportContainer/SubViewport/ScreenTransform/MP3Controller" to="." method="resume_playback"] +[connection signal="select_track" from="HUDTool/Rumbler/Position/HUDElement/DeviceScreenMask/SubViewportContainer/SubViewport/ScreenTransform/MP3Controller" to="." method="select_track"] diff --git a/src/equipment/mp3_player/mp3_track.gd b/src/equipment/mp3_player/mp3_track.gd new file mode 100644 index 0000000..1ff898b --- /dev/null +++ b/src/equipment/mp3_player/mp3_track.gd @@ -0,0 +1,5 @@ +class_name MP3Track extends Resource +## Tracks for the MP3 player + +@export var title: String +@export var track: AudioStream diff --git a/src/equipment/mp3_player/mp3_track.gd.uid b/src/equipment/mp3_player/mp3_track.gd.uid new file mode 100644 index 0000000..2ce0673 --- /dev/null +++ b/src/equipment/mp3_player/mp3_track.gd.uid @@ -0,0 +1 @@ +uid://kwiy3dv1h7q7 diff --git a/src/equipment/mp3_player/retro_selector_list.gd b/src/equipment/mp3_player/retro_selector_list.gd index 916334c..173997c 100644 --- a/src/equipment/mp3_player/retro_selector_list.gd +++ b/src/equipment/mp3_player/retro_selector_list.gd @@ -1,4 +1,3 @@ -@tool class_name RetroSelectorList extends Control const DEFAULT_HEIGHT := 76.0 @@ -23,11 +22,6 @@ const BLINK_INTERVAL := 0.2 @export var tween_scale := 0.24 -@export var debug_update_list: bool: - set(value): - if value: - _build_list() - var _active_tween: Tween @onready var screen_bounds_container: Control = %ScreenBoundsContainer @onready var title_list: VBoxContainer = %TitleList @@ -35,10 +29,10 @@ var _active_tween: Tween func _ready() -> void: - _build_list() + rebuild_list() -func _build_list() -> void: +func rebuild_list() -> void: # Remove any existing items for c: Node in title_list.get_children(): c.queue_free() @@ -49,7 +43,7 @@ func _build_list() -> void: item_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER title_list.add_child(item_label) - selection_idx = selection_idx % options.size() + selection_idx = (selection_idx % options.size()) if options else 0 func _new_tween() -> Tween: diff --git a/src/equipment/mp3_player/retro_selector_list.tscn b/src/equipment/mp3_player/retro_selector_list.tscn index c024d1e..0f48c2c 100644 --- a/src/equipment/mp3_player/retro_selector_list.tscn +++ b/src/equipment/mp3_player/retro_selector_list.tscn @@ -19,7 +19,6 @@ offset_right = 70.0 offset_bottom = 76.0 theme = ExtResource("2_4rnpc") script = ExtResource("1_kvinm") -options = Array[String](["thing1", "thing2", "uhh", "thing4"]) [node name="ScreenBoundsContainer" type="Control" parent="."] unique_name_in_owner = true diff --git a/src/game/milestone.gd b/src/game/milestone.gd index 4031331..6a36066 100644 --- a/src/game/milestone.gd +++ b/src/game/milestone.gd @@ -5,7 +5,7 @@ class_name Milestone extends Resource @export_multiline var message: String @export_group("Effects") -@export var bonus_track := false +@export var bonus_track: MP3Track @export var mp3_player := false @export var toothbrush := false @export var seminar := false diff --git a/src/world/save_state.gd b/src/world/save_state.gd index d3a209f..5bef0ef 100644 --- a/src/world/save_state.gd +++ b/src/world/save_state.gd @@ -1,7 +1,7 @@ class_name SaveState extends Resource ## Serializable container for gameplay state. -const CURRENT_VERSION := 1 +const CURRENT_VERSION := 2 const PERSISTENT_GROUP := "Persistent" const SERIALIZE_METHOD := "serialize" const DESERIALIZE_METHOD := "deserialize" @@ -18,6 +18,7 @@ const DESERIALIZE_METHOD := "deserialize" @export var mp3_player_unlocked: bool @export var toothbrush_unlocked: bool @export var stickers_unlocked: bool +@export var mp3_collection: Array[MP3Track] @export var grunk_tank: float @export var grunk_vault: float @@ -61,6 +62,7 @@ func load_to_world(world: World) -> void: world.manager.mp3_player_unlocked = mp3_player_unlocked world.manager.toothbrush_unlocked = toothbrush_unlocked world.manager.stickers_unlocked = stickers_unlocked + world.manager.mp3_collection = mp3_collection world.manager.grunk_tank = grunk_tank world.manager.grunk_vault = grunk_vault world.manager.alert_level = alert_level @@ -88,6 +90,7 @@ static func serialize(world: World) -> SaveState: save.mp3_player_unlocked = world.manager.mp3_player_unlocked save.toothbrush_unlocked = world.manager.toothbrush_unlocked save.stickers_unlocked = world.manager.stickers_unlocked + save.mp3_collection = world.manager.mp3_collection save.grunk_tank = world.manager.grunk_tank save.grunk_vault = world.manager.grunk_vault save.alert_level = world.manager.alert_level diff --git a/src/world/world.tscn b/src/world/world.tscn index a293b1d..a30f187 100644 --- a/src/world/world.tscn +++ b/src/world/world.tscn @@ -4,7 +4,7 @@ [ext_resource type="Resource" uid="uid://tgac5tnfx56r" path="res://src/world/world_manager.tres" id="2_5kmgb"] [ext_resource type="PackedScene" uid="uid://byvjsvavbg5xe" path="res://src/ui/menus/pause_menu/pause_menu.tscn" id="2_6fy3g"] [ext_resource type="Resource" uid="uid://0i72bf8ip1lx" path="res://src/world/spook_manager.tres" id="3_l0av5"] -[ext_resource type="PackedScene" uid="uid://dc4tts6342cuj" path="res://levels/prop_test/prop_test.tscn" id="4_5kmgb"] +[ext_resource type="PackedScene" uid="uid://bov4ok76woyc" path="res://levels/ghost_ship/ghost_ship.tscn" id="4_5kmgb"] [ext_resource type="PackedScene" uid="uid://c0uitm5cg88h1" path="res://src/ui/menus/kill_screen/kill_screen.tscn" id="6_l0av5"] [ext_resource type="PackedScene" uid="uid://brknr57xc2cp0" path="res://src/ui/elements/save_icon/save_icon.tscn" id="7_5kmgb"] diff --git a/src/world/world_manager.gd b/src/world/world_manager.gd index e7db4ba..45700d0 100644 --- a/src/world/world_manager.gd +++ b/src/world/world_manager.gd @@ -18,6 +18,9 @@ signal alert_cleared ## Emitted after the player's grunk vault reaches a new milestone. signal milestone_reached(milestone: Milestone) +## Emitted after the player collects a new MP3 +signal mp3_collected(mp3_track: MP3Track) + ## Emitted as soon as the player dies. signal player_dead @@ -40,20 +43,21 @@ const BIG_TANK_LIMIT := 198000 @export var mp3_player_unlocked := false @export var toothbrush_unlocked := false @export var stickers_unlocked := false +@export var mp3_collection: Array[MP3Track] = [] -var debug_emit_alert_signal: int: +@export var debug_emit_alert_signal: int: set(value): alert_raised.emit(value) -var debug_unlock_milestone: Milestone: +@export var debug_unlock_milestone: Milestone: set(value): milestone_reached.emit(value) ## Amount of grunk the player is currently carrying. -var grunk_tank := 0.0 +@export var grunk_tank := 0.0 ## Total amount of grunk that has been deposited by the player. -var grunk_vault := 0.0 +@export var grunk_vault := 0.0 ## Level of grunk agressiveness, raised whenever the player messes up. var alert_level := 0 @@ -147,15 +151,23 @@ func next_milestone_amount() -> int: func _on_milestone(milestone: Milestone) -> void: if milestone.mp3_player: mp3_player_unlocked = true - elif milestone.toothbrush: + if milestone.toothbrush: toothbrush_unlocked = true - elif milestone.stickers: + if milestone.stickers: stickers_unlocked = true - elif milestone.big_tank: + if milestone.big_tank: grunk_tank_limit = BIG_TANK_LIMIT + if milestone.bonus_track: + collect_mp3(milestone.bonus_track) # TODO the rest +## Add an MP3 player track to the player's collection. +func collect_mp3(track: MP3Track) -> void: + mp3_collection.append(track) + mp3_collected.emit(track) + + ## Called by Player on death. func on_player_death() -> void: player_dead.emit() diff --git a/src/world/world_manager.tres b/src/world/world_manager.tres index f64ee91..06fe7fe 100644 --- a/src/world/world_manager.tres +++ b/src/world/world_manager.tres @@ -1,14 +1,21 @@ -[gd_resource type="Resource" script_class="WorldManager" load_steps=13 format=3 uid="uid://tgac5tnfx56r"] +[gd_resource type="Resource" script_class="WorldManager" load_steps=33 format=3 uid="uid://tgac5tnfx56r"] [ext_resource type="Script" uid="uid://c1i5gnht15x0e" path="res://src/world/world_manager.gd" id="1_i77rl"] [ext_resource type="Script" uid="uid://ufxoxupdvyd5" path="res://src/game/milestone.gd" id="2_c37ff"] +[ext_resource type="Script" uid="uid://kwiy3dv1h7q7" path="res://src/equipment/mp3_player/mp3_track.gd" id="3_yiuq5"] +[ext_resource type="AudioStream" uid="uid://bp1dv4lv3344w" path="res://assets/music/chorus_01.wav" id="4_dwul7"] +[ext_resource type="AudioStream" uid="uid://ccqmeqw3moxfd" path="res://assets/music/descending_04.wav" id="5_dwul7"] +[ext_resource type="AudioStream" uid="uid://d4qqqrnplej6" path="res://assets/music/driving_01.wav" id="6_2q28t"] +[ext_resource type="AudioStream" uid="uid://dgvknkfvoqk8r" path="res://assets/music/simple_sample_01.wav" id="7_dojbf"] +[ext_resource type="AudioStream" uid="uid://bkvjtdlhjfr7n" path="res://assets/music/thaw_v2_slow.wav" id="8_81w62"] +[ext_resource type="AudioStream" uid="uid://b1rmpakal8l6j" path="res://assets/music/driving_02.wav" id="9_gv3bq"] +[ext_resource type="AudioStream" uid="uid://dgxko5ds8u2lk" path="res://assets/music/desert_01.wav" id="10_63s66"] [sub_resource type="Resource" id="Resource_h4r54"] script = ExtResource("2_c37ff") name = "[no reward]" message = "Check the MANUAL for SWEET TIPZ from the GRUNKIN' MASTERS!" -bonus_track = false mp3_player = false toothbrush = false seminar = false @@ -19,12 +26,18 @@ mystery = false fiesta = false metadata/_custom_type_script = "uid://ufxoxupdvyd5" +[sub_resource type="Resource" id="Resource_veuns"] +script = ExtResource("3_yiuq5") +title = "descending" +track = ExtResource("5_dwul7") +metadata/_custom_type_script = "uid://kwiy3dv1h7q7" + [sub_resource type="Resource" id="Resource_b83gw"] script = ExtResource("2_c37ff") name = "MP3 PLAYER" message = "MP3 PLAYER DECRYPTED. Enjoy some light music whilst you GRUNK." -bonus_track = false +bonus_track = SubResource("Resource_veuns") mp3_player = true toothbrush = false seminar = false @@ -40,7 +53,6 @@ script = ExtResource("2_c37ff") name = "TOOTHBRUSH" message = "TOOTHBRUSH DECRYPTED. Enjoy teethbrushing in moderation!" -bonus_track = false mp3_player = false toothbrush = true seminar = false @@ -51,12 +63,17 @@ mystery = false fiesta = false metadata/_custom_type_script = "uid://ufxoxupdvyd5" +[sub_resource type="Resource" id="Resource_h2b4l"] +script = ExtResource("3_yiuq5") +title = "slower" +track = ExtResource("8_81w62") +metadata/_custom_type_script = "uid://kwiy3dv1h7q7" + [sub_resource type="Resource" id="Resource_vebb4"] script = ExtResource("2_c37ff") name = "BONUS TRACK" -message = "BONUS TRACK DELIVERED -[TODO]" -bonus_track = true +message = "BONUS TRACK DELIVERED" +bonus_track = SubResource("Resource_h2b4l") mp3_player = false toothbrush = false seminar = false @@ -72,7 +89,6 @@ script = ExtResource("2_c37ff") name = "WELLNESS SEMINAR" message = "SEMINAR DECRYPTED. The FUTURE of WELLNESS is TODAY!" -bonus_track = false mp3_player = false toothbrush = false seminar = true @@ -83,12 +99,32 @@ mystery = false fiesta = false metadata/_custom_type_script = "uid://ufxoxupdvyd5" +[sub_resource type="Resource" id="Resource_enr7w"] +script = ExtResource("3_yiuq5") +title = "driving02" +track = ExtResource("9_gv3bq") +metadata/_custom_type_script = "uid://kwiy3dv1h7q7" + +[sub_resource type="Resource" id="Resource_dwul7"] +script = ExtResource("2_c37ff") +name = "BONUS TRACK" +message = "BONUS TRACK DELIVERED" +bonus_track = SubResource("Resource_enr7w") +mp3_player = false +toothbrush = false +seminar = false +big_tank = false +stickers = false +quota = false +mystery = false +fiesta = false +metadata/_custom_type_script = "uid://ufxoxupdvyd5" + [sub_resource type="Resource" id="Resource_36cpv"] script = ExtResource("2_c37ff") name = "EL TANK GRANDE" message = "\"EL TANK GRANDE\" DECRYPTED. GRUNK carrying capacity increased." -bonus_track = false mp3_player = false toothbrush = false seminar = false @@ -99,12 +135,32 @@ mystery = false fiesta = false metadata/_custom_type_script = "uid://ufxoxupdvyd5" +[sub_resource type="Resource" id="Resource_qb1w8"] +script = ExtResource("3_yiuq5") +title = "simple" +track = ExtResource("7_dojbf") +metadata/_custom_type_script = "uid://kwiy3dv1h7q7" + +[sub_resource type="Resource" id="Resource_ohbx8"] +script = ExtResource("2_c37ff") +name = "BONUS TRACK" +message = "BONUS TRACK DELIVERED" +bonus_track = SubResource("Resource_qb1w8") +mp3_player = false +toothbrush = false +seminar = false +big_tank = false +stickers = false +quota = false +mystery = false +fiesta = false +metadata/_custom_type_script = "uid://ufxoxupdvyd5" + [sub_resource type="Resource" id="Resource_pfnwj"] script = ExtResource("2_c37ff") name = "STICKER PACK" message = "NOW PRINTING... You can use STICKERS to EXPRESS your \"SELF\"" -bonus_track = false mp3_player = false toothbrush = false seminar = false @@ -115,12 +171,32 @@ mystery = false fiesta = false metadata/_custom_type_script = "uid://ufxoxupdvyd5" +[sub_resource type="Resource" id="Resource_drgdw"] +script = ExtResource("3_yiuq5") +title = "driving01" +track = ExtResource("6_2q28t") +metadata/_custom_type_script = "uid://kwiy3dv1h7q7" + +[sub_resource type="Resource" id="Resource_74vm3"] +script = ExtResource("2_c37ff") +name = "BONUS TRACK" +message = "BONUS TRACK DELIVERED" +bonus_track = SubResource("Resource_drgdw") +mp3_player = false +toothbrush = false +seminar = false +big_tank = false +stickers = false +quota = false +mystery = false +fiesta = false +metadata/_custom_type_script = "uid://ufxoxupdvyd5" + [sub_resource type="Resource" id="Resource_p7jc6"] script = ExtResource("2_c37ff") name = "QUOTA" message = "QUOTA SATISFIED. FINE WORK GRUNKER !" -bonus_track = false mp3_player = false toothbrush = false seminar = false @@ -131,11 +207,32 @@ mystery = false fiesta = false metadata/_custom_type_script = "uid://ufxoxupdvyd5" +[sub_resource type="Resource" id="Resource_mwqeg"] +script = ExtResource("3_yiuq5") +title = "gonk" +track = ExtResource("4_dwul7") +metadata/_custom_type_script = "uid://kwiy3dv1h7q7" + +[sub_resource type="Resource" id="Resource_6ok02"] +script = ExtResource("2_c37ff") +name = "BONUS TRACK" +message = "BONUS TRACK DELIVERED +THIS ONE'S A CLASSIC" +bonus_track = SubResource("Resource_mwqeg") +mp3_player = false +toothbrush = false +seminar = false +big_tank = false +stickers = false +quota = false +mystery = false +fiesta = false +metadata/_custom_type_script = "uid://ufxoxupdvyd5" + [sub_resource type="Resource" id="Resource_2eyq5"] script = ExtResource("2_c37ff") name = "???" message = "????? ?" -bonus_track = false mp3_player = false toothbrush = false seminar = false @@ -146,11 +243,31 @@ mystery = true fiesta = false metadata/_custom_type_script = "uid://ufxoxupdvyd5" +[sub_resource type="Resource" id="Resource_l175b"] +script = ExtResource("3_yiuq5") +title = "desert" +track = ExtResource("10_63s66") +metadata/_custom_type_script = "uid://kwiy3dv1h7q7" + +[sub_resource type="Resource" id="Resource_ysbqn"] +script = ExtResource("2_c37ff") +name = "BONUS TRACK" +message = "BONUS TRACK DELIVERED" +bonus_track = SubResource("Resource_l175b") +mp3_player = false +toothbrush = false +seminar = false +big_tank = false +stickers = false +quota = false +mystery = false +fiesta = false +metadata/_custom_type_script = "uid://ufxoxupdvyd5" + [sub_resource type="Resource" id="Resource_2qxxw"] script = ExtResource("2_c37ff") name = "taco fiesta" message = "ENJOY THE FIESTA GRUNKER !" -bonus_track = false mp3_player = false toothbrush = false seminar = false @@ -171,18 +288,22 @@ vault_milestones = Dictionary[int, ExtResource("2_c37ff")]({ 200000: SubResource("Resource_o6um0"), 300000: SubResource("Resource_vebb4"), 400000: SubResource("Resource_aolyc"), -500000: SubResource("Resource_vebb4"), +500000: SubResource("Resource_dwul7"), 600000: SubResource("Resource_36cpv"), -800000: SubResource("Resource_vebb4"), +800000: SubResource("Resource_ohbx8"), 1000000: SubResource("Resource_pfnwj"), -1400000: SubResource("Resource_vebb4"), +1400000: SubResource("Resource_74vm3"), 2000000: SubResource("Resource_p7jc6"), -2500000: SubResource("Resource_vebb4"), +2500000: SubResource("Resource_6ok02"), 3200000: SubResource("Resource_2eyq5"), -4200000: SubResource("Resource_vebb4"), +4200000: SubResource("Resource_ysbqn"), 6400000: SubResource("Resource_2qxxw") }) -mp3_player_unlocked = true -toothbrush_unlocked = true +mp3_player_unlocked = false +toothbrush_unlocked = false stickers_unlocked = false +mp3_collection = Array[ExtResource("3_yiuq5")]([]) +debug_emit_alert_signal = 0 +grunk_tank = 0.0 +grunk_vault = 0.0 metadata/_custom_type_script = "uid://c1i5gnht15x0e"