From 3643b1de2c5edd2fd76600ec17b30caa9c22f547 Mon Sep 17 00:00:00 2001 From: Justus Lind Date: Fri, 11 Aug 2023 19:02:35 +1000 Subject: [PATCH] Muse Dash: Make item_name_to_id and location_name_to_id ordering deterministic (#2086) * Fix up non-deterministic order of item_name_to_id and location_name_to_id. * Remove debug line. * Change to use a Chainmap instead and simplify logic a bit. * Add the forgotten music sheet item. --- worlds/musedash/MuseDashCollection.py | 13 +++++++++++-- worlds/musedash/__init__.py | 22 ++++++---------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/worlds/musedash/MuseDashCollection.py b/worlds/musedash/MuseDashCollection.py index 54e0f57c..66753935 100644 --- a/worlds/musedash/MuseDashCollection.py +++ b/worlds/musedash/MuseDashCollection.py @@ -1,5 +1,6 @@ from .Items import SongData, AlbumData from typing import Dict, List, Optional +from collections import ChainMap def load_text_file(name: str) -> str: @@ -10,6 +11,7 @@ def load_text_file(name: str) -> str: class MuseDashCollections: """Contains all the data of Muse Dash, loaded from MuseDashData.txt.""" + MUSIC_SHEET_NAME: str = "Music Sheet" MUSIC_SHEET_CODE: int FREE_ALBUMS = [ @@ -45,11 +47,15 @@ class MuseDashCollections: "Error SFX Trap": 9, } + item_names_to_id = ChainMap({}, sfx_trap_items, vfx_trap_items) + location_names_to_id = ChainMap(song_locations, album_locations) + def __init__(self, start_item_id: int, items_per_location: int): self.MUSIC_SHEET_CODE = start_item_id + self.item_names_to_id[self.MUSIC_SHEET_NAME] = self.MUSIC_SHEET_CODE - self.vfx_trap_items = {k: (v + start_item_id) for (k, v) in self.vfx_trap_items.items()} - self.sfx_trap_items = {k: (v + start_item_id) for (k, v) in self.sfx_trap_items.items()} + self.vfx_trap_items.update({k: (v + start_item_id) for (k, v) in self.vfx_trap_items.items()}) + self.sfx_trap_items.update({k: (v + start_item_id) for (k, v) in self.sfx_trap_items.items()}) item_id_index = start_item_id + 50 location_id_index = start_item_id @@ -85,6 +91,9 @@ class MuseDashCollections: diff_of_easy, diff_of_hard, diff_of_master) item_id_index += 1 + self.item_names_to_id.update({name: data.code for name, data in self.song_items.items()}) + self.item_names_to_id.update({name: data.code for name, data in self.album_items.items()}) + for name in self.album_items.keys(): for i in range(0, items_per_location): new_name = f"{name}-{i}" diff --git a/worlds/musedash/__init__.py b/worlds/musedash/__init__.py index 790f09ac..f34142a2 100644 --- a/worlds/musedash/__init__.py +++ b/worlds/musedash/__init__.py @@ -40,24 +40,14 @@ class MuseDashWorld(World): game = "Muse Dash" option_definitions = musedash_options topology_present = False - data_version = 7 + data_version = 8 web = MuseDashWebWorld() - music_sheet_name: str = "Music Sheet" - # Necessary Data md_collection = MuseDashCollections(2900000, 2) - item_name_to_id = { - name: data.code for name, data in md_collection.album_items.items() | md_collection.song_items.items() - } - item_name_to_id[music_sheet_name] = md_collection.MUSIC_SHEET_CODE - for item in md_collection.sfx_trap_items.items() | md_collection.vfx_trap_items.items(): - item_name_to_id[item[0]] = item[1] - - location_name_to_id = { - name: id for name, id in md_collection.album_locations.items() | md_collection.song_locations.items() - } + item_name_to_id = md_collection.item_names_to_id + location_name_to_id = md_collection.location_names_to_id # Working Data victory_song_name: str = "" @@ -165,7 +155,7 @@ class MuseDashWorld(World): self.location_count = minimum_location_count def create_item(self, name: str) -> Item: - if name == self.music_sheet_name: + if name == self.md_collection.MUSIC_SHEET_NAME: return MuseDashFixedItem(name, ItemClassification.progression_skip_balancing, self.md_collection.MUSIC_SHEET_CODE, self.player) @@ -191,7 +181,7 @@ class MuseDashWorld(World): # First add all goal song tokens for _ in range(0, item_count): - self.multiworld.itempool.append(self.create_item(self.music_sheet_name)) + self.multiworld.itempool.append(self.create_item(self.md_collection.MUSIC_SHEET_NAME)) # Then add all traps trap_count = self.get_trap_count() @@ -255,7 +245,7 @@ class MuseDashWorld(World): def set_rules(self) -> None: self.multiworld.completion_condition[self.player] = lambda state: \ - state.has(self.music_sheet_name, self.player, self.get_music_sheet_win_count()) + state.has(self.md_collection.MUSIC_SHEET_NAME, self.player, self.get_music_sheet_win_count()) def get_available_traps(self) -> List[str]: dlc_songs = self.multiworld.allow_just_as_planned_dlc_songs[self.player]