From 380b59ade2258a5873f5c5dcea5a39fd36706a77 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Tue, 7 Apr 2020 04:18:26 +0200 Subject: [PATCH] the setup experience --- MultiClient.py | 11 +++++ host.yaml | 2 + icon.ico | Bin 0 -> 8293 bytes inno_setup.iss | 112 +++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 11 +++-- 5 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 icon.ico create mode 100644 inno_setup.iss diff --git a/MultiClient.py b/MultiClient.py index e4bf3a03..a18e7fc4 100644 --- a/MultiClient.py +++ b/MultiClient.py @@ -346,6 +346,17 @@ async def snes_connect(ctx : Context, address): if problem not in seen_problems: seen_problems.add(problem) logging.error(f"Error connecting to QUsb2snes ({problem})") + if len(seen_problems) == 1: + #this is the first problem. Let's try launching QUsb2snes if it isn't already running + qusb2snes_path = Utils.get_options()["general_options"]["qusb2snes"] + import os + if os.path.isfile(qusb2snes_path): + logging.info(f"Attempting to start {qusb2snes_path}") + import subprocess + subprocess.Popen(qusb2snes_path, cwd=os.path.dirname(qusb2snes_path)) + else: + logging.info(f"Attempt to start (Q)Usb2Snes was aborted as path {qusb2snes_path} was not found, please start it yourself if it is not running") + await asyncio.sleep(1) else: ctx.snes_state = SNES_CONNECTED diff --git a/host.yaml b/host.yaml index 906f43c6..90ffaaa1 100644 --- a/host.yaml +++ b/host.yaml @@ -1,6 +1,8 @@ general_options: #File name of the v1.0 J rom rom_file: "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc" + # set this to your (Q)Usb2Snes location if you want the MultiClient to attempt an auto start, does nothing if not found + qusb2snes: "QUsb2Snes\\QUsb2Snes.exe" #options for MultiServer #null means nothing, for the server this means to default the value #these overwrite command line arguments! diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..797410abee15d5261fbf51479b9cccee9a4e1cc2 GIT binary patch literal 8293 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 literal 0 HcmV?d00001 diff --git a/inno_setup.iss b/inno_setup.iss new file mode 100644 index 00000000..1cf2ae99 --- /dev/null +++ b/inno_setup.iss @@ -0,0 +1,112 @@ +#define sourcepath "build\exe.win-amd64-3.8\" +#define MyAppName "BerserkerMultiWorld" +#define MyAppExeName "BerserkerMultiClient.exe" +#define MyAppIcon "icon.ico" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. +; Do not use the same AppId value in installers for other applications. +AppId={{6D826EE0-49BE-4B36-BACE-09C6971CD85C}} +AppName={#MyAppName} +AppVerName={#MyAppName} +DefaultDirName={commonappdata}\{#MyAppName} +DisableProgramGroupPage=yes +OutputDir=setups +OutputBaseFilename=Setup {#MyAppName} +Compression=lzma2 +SolidCompression=yes +LZMANumBlockThreads=8 +ArchitecturesInstallIn64BitMode=x64 +ChangesAssociations=yes +ArchitecturesAllowed=x64 +AllowNoIcons=yes +SetupIconFile={#MyAppIcon} +UninstallDisplayIcon={app}\{#MyAppExeName} +LicenseFile= LICENSE +WizardStyle= modern +SetupLogging=yes + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; + + +[Dirs] +NAME: "{app}"; Flags: setntfscompression; Permissions: everyone-modify users-modify authusers-modify; + +[Files] +Source: "{code:GetROMPath}"; DestDir: "{app}"; DestName: "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"; Flags: external +Source: "{#sourcepath}*"; Excludes: "*.key, *.log, *.hpkey"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "vc_redist.x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{group}\{#MyAppName} Folder"; Filename: "{app}"; +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; +Name: "{commondesktop}\{#MyAppName} Folder"; Filename: "{app}"; Tasks: desktopicon +Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/passive /norestart"; Check: IsVCRedist64BitNeeded; StatusMsg: "Installing VC++ redistributable..." +; Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent + +[UninstallDelete] +Type: dirifempty; Name: "{app}" + +[Registry] + +Root: HKCR; Subkey: ".bmbp"; ValueData: "{#MyAppName}patch"; Flags: uninsdeletevalue; ValueType: string; ValueName: "" +Root: HKCR; Subkey: "{#MyAppName}patch"; ValueData: "{#MyAppName} Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: "" +Root: HKCR; Subkey: "{#MyAppName}patch\DefaultIcon"; ValueData: "{app}\{#MyAppExeName},0"; ValueType: string; ValueName: "" +Root: HKCR; Subkey: "{#MyAppName}patch\shell\open\command"; ValueData: """{app}\{#MyAppExeName}"" ""%1"""; ValueType: string; ValueName: "" + + + +[Code] +// See: https://stackoverflow.com/a/51614652/2287576 +function IsVCRedist64BitNeeded(): boolean; +var + strVersion: string; +begin + if (RegQueryStringValue(HKEY_LOCAL_MACHINE, + 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', strVersion)) then + begin + // Is the installed version at least 14.24 ? + Log('VC Redist x64 Version : found ' + strVersion); + Result := (CompareStr(strVersion, 'v14.24.28127.4') < 0); + end + else + begin + // Not even an old version installed + Log('VC Redist x64 is not already installed'); + Result := True; + end; +end; + +var + ROMFilePage: TInputFileWizardPage; + +procedure InitializeWizard(); +begin + ROMFilePage := + CreateInputFilePage( + wpLicense, + 'Select ROM File', + 'Where is your Zelda no Densetsu - Kamigami no Triforce (Japan).sfc located?', + 'Select the file, then click Next.'); + + ROMFilePage.Add( + 'Location of ROM file:', + 'SNES ROM files|*.sfc|All files|*.*', + '.sfc'); +end; + +function GetROMPath(Param: string): string; +begin + if Assigned(RomFilePage) then + Result := ROMFilePage.Values[0] + else + Result := ''; + end; diff --git a/setup.py b/setup.py index 05495896..7ead2143 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,6 @@ import shutil import sys import sysconfig from pathlib import Path - import cx_Freeze is_64bits = sys.maxsize > 2 ** 32 @@ -15,9 +14,8 @@ sbuildfolder = str(buildfolder) libfolder = Path(buildfolder, "lib") library = Path(libfolder, "library.zip") print("Outputting to: " + str(buildfolder)) -build_resources = "exe_resources" compress = False -holoviews = False +icon="icon.ico" from hashlib import sha3_512 import base64 @@ -54,7 +52,8 @@ exes = [] for script, scriptname in scripts.items(): exes.append(cx_Freeze.Executable( script=script, - targetName=scriptname + ("" if sys.platform == "linux" else ".exe")) + targetName=scriptname + ("" if sys.platform == "linux" else ".exe"), + icon=icon) ) @@ -63,9 +62,9 @@ import datetime buildtime = datetime.datetime.now() cx_Freeze.setup( - name="HonorarPlus", + name="BerserkerMultiWorld", version=f"{buildtime.year}.{buildtime.month}.{buildtime.day}.{buildtime.hour}", - description="HonorarPlus", + description="BerserkerMultiWorld", executables=exes, options={ "build_exe": {