From b7900ade0309d3b8c13b830746ca1435141ffe26 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 8 Feb 2026 09:28:23 -0500 Subject: Added music shuffle --- apworld/__init__.py | 2 ++ apworld/client/manager.gd | 11 +++++++++++ apworld/client/player.gd | 11 +++++++++++ apworld/options.py | 8 ++++++++ 4 files changed, 32 insertions(+) (limited to 'apworld') diff --git a/apworld/__init__.py b/apworld/__init__.py index ba5d7ea..a80156c 100644 --- a/apworld/__init__.py +++ b/apworld/__init__.py @@ -157,6 +157,7 @@ class Lingo2World(World): "shuffle_doors", "shuffle_gallery_paintings", "shuffle_letters", + "shuffle_music", "shuffle_symbols", "shuffle_worldports", "strict_cyan_ending", @@ -167,6 +168,7 @@ class Lingo2World(World): slot_data: dict[str, object] = { **self.options.as_dict(*slot_options), "rte": [self.static_logic.objects.maps[map_id].name for map_id in self.player_logic.rte_mapping], + "seed": self.random.randint(0, 1000000), "version": self.static_logic.get_data_version(), } diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index 00f03ea..e259708 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd @@ -76,6 +76,7 @@ var endings_requirement = 0 var fast_travel_access = 0 var keyholder_sanity = false var masteries_requirement = 0 +var music_mapping = {} var port_pairings = {} var rte_mapping = [] var shuffle_control_center_colors = false @@ -84,6 +85,7 @@ var shuffle_gallery_paintings = false var shuffle_letters = kSHUFFLE_LETTERS_VANILLA var shuffle_symbols = false var shuffle_worldports = false +var slot_rng = null var strict_cyan_ending = false var strict_purple_ending = false var victory_condition = -1 @@ -514,6 +516,15 @@ func _client_connected(slot_data): if slot_data.has("rte"): rte_mapping = slot_data.get("rte") + slot_rng = RandomNumberGenerator.new() + slot_rng.seed = int(slot_data.get("seed", 0)) + + music_mapping.clear() + if bool(slot_data.get("shuffle_music", false)): + for map_name in global.reserved_scenes: + var track_index = slot_rng.randi_range(0, musicPlayer.all_tracks.size() - 1) + music_mapping[map_name] = musicPlayer.all_tracks.keys()[track_index] + # Set up item locks. _item_locks = {} diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 95c05d7..dabc15d 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd @@ -196,6 +196,17 @@ func _ready(): minimap.visible = ap.show_minimap get_parent().add_child.call_deferred(minimap) + if ap.music_mapping.has(global.map): + var song_setter = get_node_or_null("/root/scene/songSetter") + if song_setter: + song_setter.song_name = ap.music_mapping[global.map] + else: + var song_setter_prefab = preload("res://objects/nodes/songSetter.tscn") + song_setter = song_setter_prefab.instantiate() + song_setter.name = "songSetter" + song_setter.song_name = ap.music_mapping[global.map] + get_parent().add_child.call_deferred(song_setter) + super._ready() await get_tree().process_frame diff --git a/apworld/options.py b/apworld/options.py index 6fe6d8d..fb159e1 100644 --- a/apworld/options.py +++ b/apworld/options.py @@ -256,6 +256,13 @@ class TrapPercentage(Range): default = 0 +class ShuffleMusic(Toggle): + """ + If enabled, every map will be assigned a random music track. + """ + display_name = "Shuffle Music" + + @dataclass class Lingo2Options(PerGameCommonOptions): shuffle_doors: ShuffleDoors @@ -279,3 +286,4 @@ class Lingo2Options(PerGameCommonOptions): endings_requirement: EndingsRequirement masteries_requirement: MasteriesRequirement trap_percentage: TrapPercentage + shuffle_music: ShuffleMusic -- cgit 1.4.1