| 
									
										
										
										
											2025-01-13 03:59:16 +10:00
										 |  |  | from .Items import SongData | 
					
						
							|  |  |  | from .MuseDashData import SONG_DATA | 
					
						
							|  |  |  | from typing import Dict, List, Set | 
					
						
							| 
									
										
										
										
											2023-08-11 19:02:35 +10:00
										 |  |  | from collections import ChainMap | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MuseDashCollections: | 
					
						
							|  |  |  |     """Contains all the data of Muse Dash, loaded from MuseDashData.txt.""" | 
					
						
							| 
									
										
										
										
											2023-08-30 04:58:34 +10:00
										 |  |  |     STARTING_CODE = 2900000 | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-11 19:02:35 +10:00
										 |  |  |     MUSIC_SHEET_NAME: str = "Music Sheet" | 
					
						
							| 
									
										
										
										
											2023-08-30 04:58:34 +10:00
										 |  |  |     MUSIC_SHEET_CODE: int = STARTING_CODE | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-20 10:13:17 +10:00
										 |  |  |     FREE_ALBUMS: List[str] = [ | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  |         "Default Music", | 
					
						
							|  |  |  |         "Budget Is Burning: Nano Core", | 
					
						
							| 
									
										
										
										
											2023-08-30 04:58:34 +10:00
										 |  |  |         "Budget Is Burning Vol.1", | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-20 10:13:17 +10:00
										 |  |  |     MUSE_PLUS_DLC: str = "Muse Plus" | 
					
						
							| 
									
										
										
										
											2024-06-05 05:45:26 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Ordering matters for webhost. Order goes: Muse Plus, Time Limited Muse Plus Dlcs, Paid Dlcs | 
					
						
							| 
									
										
										
										
											2023-10-20 10:13:17 +10:00
										 |  |  |     DLC: List[str] = [ | 
					
						
							| 
									
										
										
										
											2024-06-05 05:45:26 +10:00
										 |  |  |         MUSE_PLUS_DLC, | 
					
						
							|  |  |  |         "CHUNITHM COURSE MUSE",  # Part of Muse Plus. Goes away 22nd May 2027. | 
					
						
							|  |  |  |         "maimai DX Limited-time Suite",  # Part of Muse Plus. Goes away 31st Jan 2026. | 
					
						
							| 
									
										
										
										
											2025-03-08 23:58:26 +10:00
										 |  |  |         "MSR Anthology",  # Goes away January 26, 2026.  | 
					
						
							| 
									
										
										
										
											2024-06-05 05:45:26 +10:00
										 |  |  |         "Miku in Museland",  # Paid DLC not included in Muse Plus | 
					
						
							|  |  |  |         "Rin Len's Mirrorland",  # Paid DLC not included in Muse Plus | 
					
						
							| 
									
										
										
										
											2025-03-08 23:58:26 +10:00
										 |  |  |         "MSR Anthology_Vol.02", # Goes away January 26, 2026.  | 
					
						
							| 
									
										
										
										
											2023-10-20 10:13:17 +10:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-05 18:33:15 +10:00
										 |  |  |     REMOVED_SONGS = [ | 
					
						
							|  |  |  |         "CHAOS Glitch", | 
					
						
							|  |  |  |         "FM 17314 SUGAR RADIO", | 
					
						
							| 
									
										
										
										
											2024-04-12 08:44:16 +10:00
										 |  |  |         "Yume Ou Mono Yo Secret", | 
					
						
							| 
									
										
										
										
											2024-08-25 02:19:42 +10:00
										 |  |  |         "Echo over you... Secret", | 
					
						
							|  |  |  |         "Tsukuyomi Ni Naru Replaced", | 
					
						
							| 
									
										
										
										
											2024-03-05 18:33:15 +10:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-13 03:59:16 +10:00
										 |  |  |     song_items = SONG_DATA | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  |     song_locations: Dict[str, int] = {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-05 05:45:26 +10:00
										 |  |  |     trap_items: Dict[str, int] = { | 
					
						
							| 
									
										
										
										
											2023-08-30 04:58:34 +10:00
										 |  |  |         "Bad Apple Trap": STARTING_CODE + 1, | 
					
						
							|  |  |  |         "Pixelate Trap": STARTING_CODE + 2, | 
					
						
							| 
									
										
										
										
											2023-11-16 20:33:56 +10:00
										 |  |  |         "Ripple Trap": STARTING_CODE + 3, | 
					
						
							|  |  |  |         "Vignette Trap": STARTING_CODE + 4, | 
					
						
							| 
									
										
										
										
											2023-08-30 04:58:34 +10:00
										 |  |  |         "Chromatic Aberration Trap": STARTING_CODE + 5, | 
					
						
							|  |  |  |         "Background Freeze Trap": STARTING_CODE + 6, | 
					
						
							|  |  |  |         "Gray Scale Trap": STARTING_CODE + 7, | 
					
						
							|  |  |  |         "Nyaa SFX Trap": STARTING_CODE + 8, | 
					
						
							|  |  |  |         "Error SFX Trap": STARTING_CODE + 9, | 
					
						
							| 
									
										
										
										
											2025-01-13 03:59:16 +10:00
										 |  |  |         "Focus Line Trap": STARTING_CODE + 10, | 
					
						
							| 
									
										
										
										
											2025-04-02 02:08:09 +10:00
										 |  |  |         "Beefcake SFX Trap": STARTING_CODE + 11, | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-05 05:45:26 +10:00
										 |  |  |     sfx_trap_items: List[str] = [ | 
					
						
							|  |  |  |         "Nyaa SFX Trap", | 
					
						
							|  |  |  |         "Error SFX Trap", | 
					
						
							| 
									
										
										
										
											2025-04-02 02:08:09 +10:00
										 |  |  |         "Beefcake SFX Trap", | 
					
						
							| 
									
										
										
										
											2024-06-05 05:45:26 +10:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-15 04:23:13 +10:00
										 |  |  |     filler_items: Dict[str, int] = { | 
					
						
							|  |  |  |         "Great To Perfect (10 Pack)": STARTING_CODE + 30, | 
					
						
							|  |  |  |         "Miss To Great (5 Pack)": STARTING_CODE + 31, | 
					
						
							|  |  |  |         "Extra Life": STARTING_CODE + 32, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     filler_item_weights: Dict[str, int] = { | 
					
						
							|  |  |  |         "Great To Perfect (10 Pack)": 10, | 
					
						
							|  |  |  |         "Miss To Great (5 Pack)": 3, | 
					
						
							|  |  |  |         "Extra Life": 1, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-13 03:59:16 +10:00
										 |  |  |     item_names_to_id: ChainMap = ChainMap({k: v.code for k, v in SONG_DATA.items()}, filler_items, trap_items) | 
					
						
							|  |  |  |     location_names_to_id: ChainMap = ChainMap(song_locations) | 
					
						
							| 
									
										
										
										
											2023-08-11 19:02:35 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-30 04:58:34 +10:00
										 |  |  |     def __init__(self) -> None: | 
					
						
							| 
									
										
										
										
											2023-08-11 19:02:35 +10:00
										 |  |  |         self.item_names_to_id[self.MUSIC_SHEET_NAME] = self.MUSIC_SHEET_CODE | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-30 04:58:34 +10:00
										 |  |  |         location_id_index = self.STARTING_CODE | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  |         for name in self.song_items.keys(): | 
					
						
							| 
									
										
										
										
											2023-08-30 04:58:34 +10:00
										 |  |  |             self.song_locations[f"{name}-0"] = location_id_index | 
					
						
							|  |  |  |             self.song_locations[f"{name}-1"] = location_id_index + 1 | 
					
						
							|  |  |  |             location_id_index += 2 | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-20 10:13:17 +10:00
										 |  |  |     def get_songs_with_settings(self, dlc_songs: Set[str], streamer_mode_active: bool, | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  |                                 diff_lower: int, diff_higher: int) -> List[str]: | 
					
						
							|  |  |  |         """Gets a list of all songs that match the filter settings. Difficulty thresholds are inclusive.""" | 
					
						
							|  |  |  |         filtered_list = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for songKey, songData in self.song_items.items(): | 
					
						
							| 
									
										
										
										
											2023-10-20 10:13:17 +10:00
										 |  |  |             if not self.song_matches_dlc_filter(songData, dlc_songs): | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2025-01-13 03:59:16 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-05 18:33:15 +10:00
										 |  |  |             if songKey in self.REMOVED_SONGS: | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2023-06-29 22:36:39 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if streamer_mode_active and not songData.streamer_mode: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if songData.easy is not None and diff_lower <= songData.easy <= diff_higher: | 
					
						
							|  |  |  |                 filtered_list.append(songKey) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if songData.hard is not None and diff_lower <= songData.hard <= diff_higher: | 
					
						
							|  |  |  |                 filtered_list.append(songKey) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if songData.master is not None and diff_lower <= songData.master <= diff_higher: | 
					
						
							|  |  |  |                 filtered_list.append(songKey) | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return filtered_list | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-05 05:45:26 +10:00
										 |  |  |     def filter_songs_to_dlc(self, song_list: List[str], dlc_songs: Set[str]) -> List[str]: | 
					
						
							|  |  |  |         return [song for song in song_list if self.song_matches_dlc_filter(self.song_items[song], dlc_songs)] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-20 10:13:17 +10:00
										 |  |  |     def song_matches_dlc_filter(self, song: SongData, dlc_songs: Set[str]) -> bool: | 
					
						
							|  |  |  |         if song.album in self.FREE_ALBUMS: | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if song.album in dlc_songs: | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Muse Plus provides access to any DLC not included as a seperate pack | 
					
						
							|  |  |  |         if song.album not in self.DLC and self.MUSE_PLUS_DLC in dlc_songs: | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return False |