changed from checkboxes to radio. added blacklist.

This commit is contained in:
Timothy GFO 2023-12-04 22:37:31 -04:00
parent da65552076
commit c98316446b
2 changed files with 30 additions and 16 deletions

View file

@ -23,6 +23,7 @@ To use it just launch the executable file (if available for your os) or type "py
If you have any issues make a gitlab issue. There may be bugs. If you have any issues make a gitlab issue. There may be bugs.
## Roadmap ## Roadmap
* consider the posibility of adding a alternate, custom music preserving, updater for Mega Man Maker.
* improve the single-song actions to make them more persistant * improve the single-song actions to make them more persistant
* modify restore_ogmusic so it is able to restore only the last change. Maybe config files will be needed for this. * modify restore_ogmusic so it is able to restore only the last change. Maybe config files will be needed for this.
* make it so that if "you press apply music and then replace song" it checks for that and doesn't allow the "replaced song" to be reverted back to original. * make it so that if "you press apply music and then replace song" it checks for that and doesn't allow the "replaced song" to be reverted back to original.
@ -30,7 +31,6 @@ If you have any issues make a gitlab issue. There may be bugs.
* ability to preserve changes through Mega Man Maker updates, by using a config file and/or a downloaded zip of the game. * ability to preserve changes through Mega Man Maker updates, by using a config file and/or a downloaded zip of the game.
* stop using os.path in favour of pathlib * stop using os.path in favour of pathlib
* switch to using a config file (or database) for keeping track of which tracks have been changed, that way only having one original_music folder and being able to *show* the user which song you used to replace which file. * switch to using a config file (or database) for keeping track of which tracks have been changed, that way only having one original_music folder and being able to *show* the user which song you used to replace which file.
* add selective mute, so that you mute every music except the boss music, or every song except menu music or both.
* add a way to show the available nsf files in the selected folder, like a playlist. * add a way to show the available nsf files in the selected folder, like a playlist.
* Instead of duplicating a single file a lot of times, maybe I'll implement symlink support. * Instead of duplicating a single file a lot of times, maybe I'll implement symlink support.

View file

@ -28,6 +28,15 @@ def level_music():
level_music = ['MetalMan - (GB II).nsf', 'IceMan - (GB I).nsf', 'CutMan - (GB I).nsf', 'Neptune - (GB V).nsf', 'GBVWily2.nsf', 'WoodMan - (GB II).nsf', 'Saturn - (GB V).nsf', 'Jupiter - (GB V).nsf', 'Terra - (GB V).nsf', 'Venus - (GB V).nsf', 'GBIIIWily2.nsf', 'AirMan - (GB II).nsf', 'Uranus - (GB V).nsf', 'Pluto - (GB V).nsf', 'GBVWily1.nsf', 'Mercury - (GB V).nsf', 'GBIIWily2.nsf', 'MagnetMan - (GB II).nsf', 'Mars - (GB V).nsf', 'GBIIIWily1.nsf', 'ElecMan - (GB I).nsf', 'GBIWily2.nsf', 'TopMan - (GB II).nsf', 'CrashMan - (GB II).nsf', 'GBIWily1.nsf', 'Punk - (GB III).nsf', 'HardMan - (GB II).nsf', 'NeedleMan - (GB II).nsf', 'FireMan - (GB I).nsf', 'GBIVWily1.nsf', 'GBIIWily1.nsf', 'FreezeMan.nsf', 'JunkMan.nsf', 'SlashMan.nsf', 'CloudMan.nsf', 'SpringMan.nsf', 'Wily4.nsf', 'RobotMuseum.nsf', 'Wily1.nsf', 'Intro.nsf', 'Wily3.nsf', 'ShadeMan.nsf', 'ShadeManAlt.nsf', 'TurboMan.nsf', 'BurstMan.nsf', 'Wily2.nsf', 'WilyTower2.nsf', 'HyperStormH.nsf', 'WilyTower1.nsf', 'WilyTower3.nsf', 'MegaWaterS.nsf', 'WilyTower4.nsf', 'BusterRodG.nsf', 'GravityMan.nsf', 'WaveMan.nsf', 'StoneMan.nsf', 'MM5WilyCirno.nsf', 'MM5Wily.nsf', 'StarMan.nsf', 'NapalmMan.nsf', 'CrystalMan.nsf', 'ProtoCastle.nsf', 'ChargeMan.nsf', 'GyroMan.nsf', 'FlameMan.nsf', 'MrX.nsf', 'YamatoMan.nsf', 'CentaurMan.nsf', 'WindMan.nsf', 'PlantMan.nsf', 'MM6Wily.nsf', 'KnightMan.nsf', 'BlizzardMan.nsf', 'TomahawkMan.nsf', 'MM2Wily2.nsf', 'Crashman.nsf', 'MM2Wily1.nsf', 'MM2Wily6.nsf', 'Metalman.nsf', 'Flashman.nsf', 'Bubbleman.nsf', 'Woodman.nsf', 'Heatman.nsf', 'Quickman.nsf', 'Airman.nsf', 'Bombman.nsf', 'MM1Wily1.nsf', 'MM1Wily2.nsf', 'Fireman.nsf', 'Iceman.nsf', 'Cutman.nsf', 'Elecman.nsf', 'PUIntroStage.nsf', 'Timeman.nsf', 'Oilman.nsf', 'Gutsman.nsf', 'FrostMan.nsf', 'GrenadeMan.nsf', 'AquaMan.nsf', 'AstroMan.nsf', 'Wily4.nsf', 'TenguMan(SS).nsf', 'Wily1.nsf', 'IntroStage(Underwater).nsf', 'SwordMan.nsf', 'Wily3.nsf', 'SearchMan.nsf', 'IntroStage.nsf', 'ClownMan.nsf', 'Wily2.nsf', 'TenguMan(PSX).nsf', 'Megaman4.nsf', 'ToadMan.nsf', 'MM4Wily2.nsf', 'RingMan.nsf', 'MM4Wily1.nsf', 'DrillMan.nsf', 'BrightMan.nsf', 'DiveMan.nsf', 'SkullMan.nsf', 'DustMan.nsf', 'Cossack1.nsf', 'PharaohMan.nsf', 'Cossack2.nsf', 'MagnetMan.nsf', 'MM3Wily2.nsf', 'MM3Wily3.nsf', 'SnakeMan.nsf', 'Megaman3.nsf', 'MM3Wily1.nsf', 'GeminiMan.nsf', 'ShadowMan.nsf', 'HardMan.nsf', 'TopMan.nsf', 'NeedleMan.nsf', 'SparkMan.nsf', 'KazeYoTsutaete.nsf', 'MMB_-_King_Nix.nsf', '30XXTitleLooped.nsf', 'FakeMan.nsf', 'PlugMan.nsf', 'GalaxyMan.nsf', 'EndlessAttack.nsf', 'SplashWoman.nsf', 'Wily4.nsf', 'Wily1.nsf', 'MagmaMan.nsf', 'JewelMan.nsf', 'ConcreteMan.nsf', 'Wily3.nsf', 'TornadoMan.nsf', 'Wily2.nsf', 'HornetMan.nsf', 'StrikeMan.nsf', 'Challenges.nsf', 'Wily1Outside.nsf', 'SolarMan.nsf', 'EndlessAttack.nsf', 'Wily4.nsf', 'NitroMan.nsf', 'Wily1Inside.nsf', 'CommandoMan.nsf', 'Punk.nsf', 'Wily5.nsf', 'Wily3.nsf', 'Enker.nsf', 'Ballade.nsf', 'ChillMan.nsf', 'BladeMan.nsf', 'PumpMan.nsf', 'Wily2.nsf', 'SheepMan.nsf', 'MagicMan.nsf', 'ColdMan.nsf', 'MM&BWily1.nsf', 'MM&BKing1.nsf', 'PirateMan.nsf', 'DynamoMan.nsf', 'GroundMan.nsf', 'AstroMan.nsf', 'Intro.nsf', 'TenguMan.nsf', 'CrystalGate.nsf', 'BurnerMan.nsf', 'BounceMan.nsf', 'FuseMan.nsf', 'TorchMan.nsf', 'Challenges.nsf', 'WilyStage.nsf', 'TundraMan.nsf', 'AcidMan.nsf', 'DrLightTrial.nsf', 'BlockMan.nsf', 'BlastMan.nsf', 'ImpactMan.nsf'] level_music = ['MetalMan - (GB II).nsf', 'IceMan - (GB I).nsf', 'CutMan - (GB I).nsf', 'Neptune - (GB V).nsf', 'GBVWily2.nsf', 'WoodMan - (GB II).nsf', 'Saturn - (GB V).nsf', 'Jupiter - (GB V).nsf', 'Terra - (GB V).nsf', 'Venus - (GB V).nsf', 'GBIIIWily2.nsf', 'AirMan - (GB II).nsf', 'Uranus - (GB V).nsf', 'Pluto - (GB V).nsf', 'GBVWily1.nsf', 'Mercury - (GB V).nsf', 'GBIIWily2.nsf', 'MagnetMan - (GB II).nsf', 'Mars - (GB V).nsf', 'GBIIIWily1.nsf', 'ElecMan - (GB I).nsf', 'GBIWily2.nsf', 'TopMan - (GB II).nsf', 'CrashMan - (GB II).nsf', 'GBIWily1.nsf', 'Punk - (GB III).nsf', 'HardMan - (GB II).nsf', 'NeedleMan - (GB II).nsf', 'FireMan - (GB I).nsf', 'GBIVWily1.nsf', 'GBIIWily1.nsf', 'FreezeMan.nsf', 'JunkMan.nsf', 'SlashMan.nsf', 'CloudMan.nsf', 'SpringMan.nsf', 'Wily4.nsf', 'RobotMuseum.nsf', 'Wily1.nsf', 'Intro.nsf', 'Wily3.nsf', 'ShadeMan.nsf', 'ShadeManAlt.nsf', 'TurboMan.nsf', 'BurstMan.nsf', 'Wily2.nsf', 'WilyTower2.nsf', 'HyperStormH.nsf', 'WilyTower1.nsf', 'WilyTower3.nsf', 'MegaWaterS.nsf', 'WilyTower4.nsf', 'BusterRodG.nsf', 'GravityMan.nsf', 'WaveMan.nsf', 'StoneMan.nsf', 'MM5WilyCirno.nsf', 'MM5Wily.nsf', 'StarMan.nsf', 'NapalmMan.nsf', 'CrystalMan.nsf', 'ProtoCastle.nsf', 'ChargeMan.nsf', 'GyroMan.nsf', 'FlameMan.nsf', 'MrX.nsf', 'YamatoMan.nsf', 'CentaurMan.nsf', 'WindMan.nsf', 'PlantMan.nsf', 'MM6Wily.nsf', 'KnightMan.nsf', 'BlizzardMan.nsf', 'TomahawkMan.nsf', 'MM2Wily2.nsf', 'Crashman.nsf', 'MM2Wily1.nsf', 'MM2Wily6.nsf', 'Metalman.nsf', 'Flashman.nsf', 'Bubbleman.nsf', 'Woodman.nsf', 'Heatman.nsf', 'Quickman.nsf', 'Airman.nsf', 'Bombman.nsf', 'MM1Wily1.nsf', 'MM1Wily2.nsf', 'Fireman.nsf', 'Iceman.nsf', 'Cutman.nsf', 'Elecman.nsf', 'PUIntroStage.nsf', 'Timeman.nsf', 'Oilman.nsf', 'Gutsman.nsf', 'FrostMan.nsf', 'GrenadeMan.nsf', 'AquaMan.nsf', 'AstroMan.nsf', 'Wily4.nsf', 'TenguMan(SS).nsf', 'Wily1.nsf', 'IntroStage(Underwater).nsf', 'SwordMan.nsf', 'Wily3.nsf', 'SearchMan.nsf', 'IntroStage.nsf', 'ClownMan.nsf', 'Wily2.nsf', 'TenguMan(PSX).nsf', 'Megaman4.nsf', 'ToadMan.nsf', 'MM4Wily2.nsf', 'RingMan.nsf', 'MM4Wily1.nsf', 'DrillMan.nsf', 'BrightMan.nsf', 'DiveMan.nsf', 'SkullMan.nsf', 'DustMan.nsf', 'Cossack1.nsf', 'PharaohMan.nsf', 'Cossack2.nsf', 'MagnetMan.nsf', 'MM3Wily2.nsf', 'MM3Wily3.nsf', 'SnakeMan.nsf', 'Megaman3.nsf', 'MM3Wily1.nsf', 'GeminiMan.nsf', 'ShadowMan.nsf', 'HardMan.nsf', 'TopMan.nsf', 'NeedleMan.nsf', 'SparkMan.nsf', 'KazeYoTsutaete.nsf', 'MMB_-_King_Nix.nsf', '30XXTitleLooped.nsf', 'FakeMan.nsf', 'PlugMan.nsf', 'GalaxyMan.nsf', 'EndlessAttack.nsf', 'SplashWoman.nsf', 'Wily4.nsf', 'Wily1.nsf', 'MagmaMan.nsf', 'JewelMan.nsf', 'ConcreteMan.nsf', 'Wily3.nsf', 'TornadoMan.nsf', 'Wily2.nsf', 'HornetMan.nsf', 'StrikeMan.nsf', 'Challenges.nsf', 'Wily1Outside.nsf', 'SolarMan.nsf', 'EndlessAttack.nsf', 'Wily4.nsf', 'NitroMan.nsf', 'Wily1Inside.nsf', 'CommandoMan.nsf', 'Punk.nsf', 'Wily5.nsf', 'Wily3.nsf', 'Enker.nsf', 'Ballade.nsf', 'ChillMan.nsf', 'BladeMan.nsf', 'PumpMan.nsf', 'Wily2.nsf', 'SheepMan.nsf', 'MagicMan.nsf', 'ColdMan.nsf', 'MM&BWily1.nsf', 'MM&BKing1.nsf', 'PirateMan.nsf', 'DynamoMan.nsf', 'GroundMan.nsf', 'AstroMan.nsf', 'Intro.nsf', 'TenguMan.nsf', 'CrystalGate.nsf', 'BurnerMan.nsf', 'BounceMan.nsf', 'FuseMan.nsf', 'TorchMan.nsf', 'Challenges.nsf', 'WilyStage.nsf', 'TundraMan.nsf', 'AcidMan.nsf', 'DrLightTrial.nsf', 'BlockMan.nsf', 'BlastMan.nsf', 'ImpactMan.nsf']
return level_music return level_music
def whitelist_to_blacklist(whitelist):
blacklist = []
for element in safelist():
if element not in whitelist:
blacklist.append(element)
return blacklist
print(whitelist_to_blacklist(level_music()))
# def generate_whitelist(megamaker_folder): # def generate_whitelist(megamaker_folder):
# subfolders = os.listdir(os.path.join(megamaker_folder, "Music")) # subfolders = os.listdir(os.path.join(megamaker_folder, "Music"))
# subfolders.remove("Other") # subfolders.remove("Other")
@ -111,6 +120,7 @@ def create_mute_file(base64_str):
def check_folder_structure(megamaker_folder, og_music=False, whitelist=[]): def check_folder_structure(megamaker_folder, og_music=False, whitelist=[]):
megamaker_folder = os.path.abspath(megamaker_folder) megamaker_folder = os.path.abspath(megamaker_folder)
subfolders = ([ f.path for f in os.scandir(megamaker_folder) if f.is_dir() ]) subfolders = ([ f.path for f in os.scandir(megamaker_folder) if f.is_dir() ])
print(subfolders)
music_folder = os.path.join(megamaker_folder, "Music") music_folder = os.path.join(megamaker_folder, "Music")
if og_music: if og_music:
music_folder = os.path.join(megamaker_folder, "original_music") music_folder = os.path.join(megamaker_folder, "original_music")
@ -296,8 +306,8 @@ title = [
] ]
change_all = [ change_all = [
[sg.Button("Mute All"), sg.Button("Apply Music"), sg.Button("Restore Music")], [sg.Button("Mute"), sg.Button("Apply Music"), sg.Button("Restore Music")],
[sg.Checkbox("Boss Music", default=True, key="-BOSS-"), sg.Checkbox("Level Music", default=True, key="-LEVEL-")] [sg.Radio("All", "music", default=True, key="-ALL-"), sg.Radio("Boss Music","music", key="-BOSS-"), sg.Radio("Level Music", "music", key="-LEVEL-"), sg.Checkbox("All except selected", key="-BLACKLIST-")]
] ]
change_one = [ change_one = [
@ -349,7 +359,7 @@ while True:
webbrowser.open("https://gitlab.com/gamefeveronline") webbrowser.open("https://gitlab.com/gamefeveronline")
if event == "About": if event == "About":
sg.popup(how_to_use) sg.popup(how_to_use)
if event == "Mute All": if event == "Mute":
if values["-BOSS-"] == True or values["-LEVEL-"] == True: if values["-BOSS-"] == True or values["-LEVEL-"] == True:
if values["-BOSS-"] == True and values["-LEVEL-"] == True: if values["-BOSS-"] == True and values["-LEVEL-"] == True:
whitelist = [] whitelist = []
@ -377,20 +387,24 @@ while True:
else: else:
window["-LAST-CHANGED-"].update("") window["-LAST-CHANGED-"].update("")
if event == "Apply Music": if event == "Apply Music":
if values["-BOSS-"] == True or values["-LEVEL-"] == True: if values["-ALL-"] != True:
if values["-BOSS-"] == True and values["-LEVEL-"] == True: if values["-BOSS-"] == True:
whitelist = [] if values["-BLACKLIST-"] == True:
elif values["-BOSS-"] == True: whitelist = whitelist_to_blacklist(boss_music())
else:
whitelist = boss_music() whitelist = boss_music()
elif values["-LEVEL-"] == True: elif values["-LEVEL-"] == True:
if values["-BLACKLIST-"] == True:
whitelist = whitelist_to_blacklist(level_music())
else:
whitelist = level_music() whitelist = level_music()
else:
whitelist = []
if not nsf_changer(values["-IN-"], values["-OUT-"], whitelist=whitelist): if not nsf_changer(values["-IN-"], values["-OUT-"], whitelist=whitelist):
restore_ogmusic(values["-OUT-"]) restore_ogmusic(values["-OUT-"])
if not nsf_changer(values["-IN-"], values["-OUT-"], whitelist=whitelist): if not nsf_changer(values["-IN-"], values["-OUT-"], whitelist=whitelist):
sg.popup_error("MegaMaker folder is not valid or definitions out of date.") sg.popup_error("MegaMaker folder is not valid or definitions out of date.")
else:
sg.popup("None of the checkboxes are active.")
if event == "Restore Music": # Needs testing if event == "Restore Music": # Needs testing
# sg.popup_error("DOESNT WORK EITHER HAHAHAHAHAHAA") # sg.popup_error("DOESNT WORK EITHER HAHAHAHAHAHAA")
if not restore_ogmusic(values["-OUT-"]): if not restore_ogmusic(values["-OUT-"]):