diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..827e08c --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/base +/Output +/skse +/*.chm +/*.chw +/*.exe +/*.cmd diff --git a/EnderalInstaller.iss b/EnderalInstaller.iss new file mode 100644 index 0000000..5700c5e --- /dev/null +++ b/EnderalInstaller.iss @@ -0,0 +1,319 @@ +#define RemoteHost GetEnv('REMOTE_HOST') +#define RemoteVersionDir GetEnv('REMOTE_DIR_VERSIONED') +#define RemoteMediaDir GetEnv('REMOTE_DIR_MEDIA') + +[Setup] +AppName=Enderal SE +DefaultGroupName=Enderal SE +AppVersion=2.1.0 +AppVerName=Enderal SE 2.1 [mod.pub] +AppPublisher=ModPub +AppPublisherURL=https://mod.pub/ +AppReadmeFile=https://mod.pub/enderal-se/38-enderal-se +AppSupportURL=https://mod.pub/enderal-se/38/comments +AppUpdatesURL=https://mod.pub/enderal-se/38/files +WizardStyle=modern +DefaultDirName={drive:{src}}\Games\Enderal SE +ArchitecturesAllowed=x64 +OutputBaseFilename=EnderalSE_Install +ExtraDiskSpaceRequired=20204613632 +AllowNetworkDrive=no +Compression=lzma2/max +SolidCompression=yes +SetupIconFile=enderal.ico +UninstallDisplayName=Enderal SE +UninstallDisplayIcon={app}\Game\Data\enderal.ico +DisableWelcomePage=yes +DisableDirPage=no +DisableProgramGroupPage=no +AllowNoIcons=yes + +[Files] +; Root +Source: "{code:GetSkyrimPath}\SkyrimSE.exe"; DestDir: "{app}\Game"; Flags: external ignoreversion +Source: "{code:GetSkyrimPath}\SkyrimSELauncher.exe"; DestDir: "{app}\Game"; Check: IsNotVR(); Flags: external ignoreversion + +Source: "{code:GetSkyrimPath}\SkyrimVR.exe"; DestDir: "{app}\Game"; Check: IsVR(); Flags: external ignoreversion +Source: "{code:GetSkyrimPath}\openvr_api.dll"; DestDir: "{app}\Game"; Check: IsVR(); Flags: external ignoreversion +Source: "{code:GetSkyrimPath}\atimgpud.dll"; DestDir: "{app}\Game"; Check: IsVR(); Flags: external ignoreversion + +Source: "{code:GetSkyrimPath}\steam_api64.dll"; DestDir: "{app}\Game"; Check: IsSteam(); Flags: external ignoreversion +Source: "{code:GetSkyrimPath}\Galaxy64.dll"; DestDir: "{app}\Game"; Check: IsGOG(); Flags: external ignoreversion +Source: "{code:GetSkyrimPath}\binkw64.dll"; DestDir: "{app}\Game"; Flags: external skipifsourcedoesntexist ignoreversion +Source: "{code:GetSkyrimPath}\bink2w64.dll"; DestDir: "{app}\Game"; Flags: external skipifsourcedoesntexist ignoreversion + +Source: "{code:GetSkyrimPath}\ControlMap_Custom.txt"; DestDir: "{app}\Game"; Flags: external skipifsourcedoesntexist +Source: "{code:GetSkyrimPath}\Skyrim_Default.ini"; DestDir: "{app}\Game"; Flags: external skipifsourcedoesntexist +Source: "{code:GetSkyrimPath}\High.ini"; DestDir: "{app}\Game"; Flags: external skipifsourcedoesntexist +Source: "{code:GetSkyrimPath}\Low.ini"; DestDir: "{app}\Game"; Flags: external skipifsourcedoesntexist +Source: "{code:GetSkyrimPath}\Medium.ini"; DestDir: "{app}\Game"; Flags: external skipifsourcedoesntexist +Source: "{code:GetSkyrimPath}\Ultra.ini"; DestDir: "{app}\Game"; Flags: external skipifsourcedoesntexist + +; Data +Source: "{code:GetSkyrimPath}\Data\Skyrim - Animations.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Interface.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Meshes0.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Meshes1.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Shaders.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Sounds.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures0.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures1.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures2.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures3.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures4.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures5.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures6.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures7.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Textures8.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp +Source: "{code:GetSkyrimPath}\Data\Skyrim - Patch.bsa"; DestDir: "{app}\Game\Data"; Flags: external comparetimestamp skipifsourcedoesntexist +Source: "{code:GetSkyrimPath}\Data\Skyrim_VR - Main.bsa"; DestDir: "{app}\Game\Data"; Check: IsVR(); Flags: external comparetimestamp + +; Enderal +Source: "base\*"; DestDir: "{app}\Game\Data"; Excludes: "*.esl,ccBGSSSE001-Fish.esm,ccBGSSSE025-AdvDSGS.esm,E - Meshes.bsa,E - Sounds.bsa,E - Textures1.bsa,E - Textures2.bsa,L - Voices.bsa,Enderal_Credits.bik,EnderalIntro.bik,MQ17BlackGuardian.bik,MQP03NearDeathExperience.bik"; Flags: recursesubdirs ignoreversion + +; SKSE +Source: "skse\1.4.15.0\*"; DestDir: "{app}\Game"; Check: IsSkyrimVersion('1.4.15.0'); Flags: ignoreversion +Source: "skse\1.5.97.0\*"; DestDir: "{app}\Game"; Check: IsSkyrimVersion('1.5.97.0'); Flags: ignoreversion +Source: "skse\1.6.640.0\*"; DestDir: "{app}\Game"; Check: IsSkyrimVersion('1.6.640.0'); Flags: ignoreversion +Source: "skse\1.6.659.0\*"; DestDir: "{app}\Game"; Check: IsSkyrimVersion('1.6.659.0'); Flags: ignoreversion +Source: "skse\1.6.1130.0\*"; DestDir: "{app}\Game"; Check: IsSkyrimVersion('1.6.1130.0'); Flags: ignoreversion +Source: "skse\1.6.1170.0\*"; DestDir: "{app}\Game"; Check: IsSkyrimVersion('1.6.1170.0'); Flags: ignoreversion +Source: "skse\1.6.1179.0\*"; DestDir: "{app}\Game"; Check: IsSkyrimVersion('1.6.1179.0'); Flags: ignoreversion + +Source: "wget.exe"; DestDir: "{app}"; Flags: deleteafterinstall ignoreversion +Source: "modlhandler.exe"; DestDir: "{app}\MO2"; Flags: uninsneveruninstall ignoreversion + +[InstallDelete] +Type: files; Name: "{app}\Game\SkyrimSE.exe" +Type: files; Name: "{app}\Game\SkyrimSELauncher.exe" +Type: files; Name: "{app}\Game\SkyrimVR.exe" +Type: files; Name: "{app}\Game\sksevr_*.dll" +Type: files; Name: "{app}\Game\skse64_*.dll" +Type: files; Name: "{app}\Game\skse*_steam_loader.dll" +Type: files; Name: "{app}\Game\steam_api64.dll" +Type: files; Name: "{app}\Game\Galaxy64.dll" +Type: files; Name: "{app}\Game\binkw64.dll" +Type: files; Name: "{app}\Game\bink2w64.dll" +Type: files; Name: "{app}\Game\openvr_api.dll" +Type: files; Name: "{app}\Game\atimgpud.dll" +Type: files; Name: "{app}\Game\Data\SkyrimVR.esm" + +[UninstallDelete] +Type: files; Name: "{app}\Game\Data\E - Meshes.bsa" +Type: files; Name: "{app}\Game\Data\E - Sounds.bsa" +Type: files; Name: "{app}\Game\Data\E - Textures1.bsa" +Type: files; Name: "{app}\Game\Data\E - Textures2.bsa" +Type: files; Name: "{app}\Game\Data\L - Voices.bsa" + +Type: files; Name: "{app}\Game\Data\Video\Enderal_Credits.bik" +Type: files; Name: "{app}\Game\Data\Video\EnderalIntro.bik" +Type: files; Name: "{app}\Game\Data\Video\MQ17BlackGuardian.bik" +Type: files; Name: "{app}\Game\Data\Video\MQP03NearDeathExperience.bik" + +Type: dirifempty; Name: "{app}\Game\Data" +Type: dirifempty; Name: "{app}\Game\Creations" +Type: dirifempty; Name: "{app}\Game\Mods" +Type: dirifempty; Name: "{app}\Game" + +[Run] +Filename: "{app}\wget.exe"; StatusMsg: "Downloading E - Meshes.bsa (1.48 Gb)..."; Parameters: "-nd -N -P ""{app}\Game\Data"" ""{#RemoteHost}/{#RemoteVersionDir}/E%20-%20Meshes.bsa"""; Flags: runhidden +Filename: "{app}\wget.exe"; StatusMsg: "Downloading E - Textures1.bsa (1.7 Gb)..."; Parameters: "-nd -N -P ""{app}\Game\Data"" ""{#RemoteHost}/{#RemoteVersionDir}/E%20-%20Textures1.bsa"""; Flags: runhidden +Filename: "{app}\wget.exe"; StatusMsg: "Downloading E - Textures2.bsa (1.72 Gb)..."; Parameters: "-nd -N -P ""{app}\Game\Data"" ""{#RemoteHost}/{#RemoteVersionDir}/E%20-%20Textures2.bsa"""; Flags: runhidden + +Filename: "{app}\wget.exe"; StatusMsg: "Downloading E - Sounds.bsa (1.3 Gb)..."; Parameters: "-nd -N -P ""{app}\Game\Data"" ""{#RemoteHost}/{#RemoteMediaDir}/E%20-%20Sounds.bsa"""; Flags: runhidden +Filename: "{app}\wget.exe"; StatusMsg: "Downloading L - Voices.bsa (1.38 Gb)..."; Parameters: "-nd -N -P ""{app}\Game\Data"" ""{#RemoteHost}/{#RemoteMediaDir}/L%20-%20Voices.bsa"""; Flags: runhidden + +Filename: "{app}\wget.exe"; StatusMsg: "Downloading Enderal_Credits.bik (1.29 Gb)..."; Parameters: "-nd -N -P ""{app}\Game\Data\Video"" ""{#RemoteHost}/{#RemoteMediaDir}/Video/Enderal_Credits.bik"""; Check: IsNotVR(); Flags: runhidden +Filename: "{app}\wget.exe"; StatusMsg: "Downloading EnderalIntro.bik (275 Mb)..."; Parameters: "-nd -N -P ""{app}\Game\Data\Video"" ""{#RemoteHost}/{#RemoteMediaDir}/Video/EnderalIntro.bik"""; Check: IsNotVR(); Flags: runhidden +Filename: "{app}\wget.exe"; StatusMsg: "Downloading MQ17BlackGuardian.bik (474 Mb)..."; Parameters: "-nd -N -P ""{app}\Game\Data\Video"" ""{#RemoteHost}/{#RemoteMediaDir}/Video/MQ17BlackGuardian.bik"""; Check: IsNotVR(); Flags: runhidden +Filename: "{app}\wget.exe"; StatusMsg: "Downloading MQP03NearDeathExperience.bik (38 Mb)..."; Parameters: "-nd -N -P ""{app}\Game\Data\Video"" ""{#RemoteHost}/{#RemoteMediaDir}/Video/MQP03NearDeathExperience.bik"""; Check: IsNotVR(); Flags: runhidden + +Filename: "{tmp}\Mod.Organizer-2.5.0.exe"; Parameters: "/SILENT /DIR=""{app}\MO2""" +Filename: "{app}\MO2\modlhandler.exe"; Parameters: "forcereg"; Flags: runhidden +Filename: "{cmd}"; Parameters: "/d /c del /s /q ""{tmp}\Mod.Organizer-2.5.0.exe"""; Flags: runhidden + +Filename: "{app}\MO2\ModOrganizer.exe"; Parameters: """moshortcut://:SKSE"""; Description: "Launch Enderal SE"; Flags: postinstall +Filename: "https://mod.pub/enderal-se/38/changelogs"; Description: "See changelog"; Flags: shellexec postinstall runmaximized + +[INI] +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "General"; Key: "gameName"; String: "Skyrim VR"; Check: IsVR() +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "General"; Key: "gameName"; String: "Skyrim Special Edition"; Check: IsNotVR() +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "General"; Key: "first_start"; String: "false" +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "General"; Key: "selected_profile"; String: "@ByteArray(Default)"; Flags: createkeyifdoesntexist +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "General"; Key: "game_edition"; String: "Steam"; Check: IsSteam() +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "General"; Key: "game_edition"; String: "GOG"; Check: IsGOG() +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "General"; Key: "gamePath"; String: "@ByteArray({code:DoubleBackslashes|{app}}\\Game)" +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "General"; Key: "version"; String: "2.5" + +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "Settings"; Key: "profile_local_inis"; String: "true" +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "Settings"; Key: "profile_local_saves"; String: "true" +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "Settings"; Key: "profile_archive_invalidation"; String: "true" +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "Settings"; Key: "compact_downloads"; String: "true"; Flags: createkeyifdoesntexist +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "Settings"; Key: "category_mappings"; String: "false"; Flags: createkeyifdoesntexist +Filename: "{app}\MO2\ModOrganizer.ini"; Section: "Settings"; Key: "base_directory"; String: "{code:ConvertBackslashes|{app}}/Data" + +Filename: "{app}\Data\profiles\Default\skyrimprefs.ini"; Section: "Display"; Key: "iShadowMaskQuarter"; String: "4" +Filename: "{app}\Data\profiles\Default\skyrimprefs.ini"; Section: "Controls"; Key: "fMouseHeadingSensitivity"; String: "0.0420"; Flags: createkeyifdoesntexist + +[Icons] +Name: "{userdesktop}\Enderal SE"; Filename: "{app}\MO2\ModOrganizer.exe"; WorkingDir: "{app}\MO2"; Parameters: """moshortcut://:SKSE"""; IconFilename: "{app}\Game\Data\enderal.ico" +Name: "{app}\Run Enderal SE"; Filename: "{app}\MO2\ModOrganizer.exe"; WorkingDir: "{app}\MO2"; Parameters: """moshortcut://:SKSE"""; IconFilename: "{app}\Game\Data\enderal.ico" +Name: "{group}\Run Enderal SE"; Filename: "{app}\MO2\ModOrganizer.exe"; WorkingDir: "{app}\MO2"; Parameters: """moshortcut://:SKSE"""; IconFilename: "{app}\Game\Data\enderal.ico" +Name: "{group}\Manage mods"; Filename: "{app}\MO2\ModOrganizer.exe"; WorkingDir: "{app}\MO2"; Flags: runmaximized +Name: "{group}\Uninstall"; Filename: "{uninstallexe}" + +[Registry] +Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueType: String; ValueName: "{app}\MO2\ModOrganizer.exe"; ValueData: "RUNASADMIN"; Flags: uninsdeletekeyifempty uninsdeletevalue; MinVersion: 0,6.1 +Root: HKCU; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueType: String; ValueName: "{app}\MO2\ModOrganizer.exe"; ValueData: "RUNASADMIN"; Flags: uninsdeletekeyifempty uninsdeletevalue; MinVersion: 0,6.1 +Root: HKCU; Subkey: "Software\SureAI\EnderalSE"; ValueType: string; ValueName: "Install_Path"; ValueData: "{app}\Game\" + +[Code] +var + SkyrimDirPage: TInputDirWizardPage; + DownloadPage: TDownloadWizardPage; + sSkyrimPath, sSkyrimVersion: String; + +function IsSkyrimVersion(Param: String): Boolean; +begin + if sSkyrimVersion = Param then + Result := True; +end; + +function IsGOG(): Boolean; +begin + Result := (sSkyrimVersion = '1.6.659.0') or (sSkyrimVersion = '1.6.1179.0'); +end; + +function IsVR(): Boolean; +begin + Result := (sSkyrimVersion = '1.4.15.0'); +end; + +function IsNotVR(): Boolean; +begin + Result := not IsVR(); +end; + +function IsSteam(): Boolean; +begin + Result := (not IsGOG()) and (not IsVR()); +end; + +function GetSkyrimPath(Param: String): String; +begin + Result := sSkyrimPath; +end; + +function ConvertBackslashes(Param: String): String; +begin + StringChangeEx(Param, '\', '/', True); + Result := Param; +end; + +function DoubleBackslashes(Param: String): String; +begin + StringChangeEx(Param, '\', '\\', True); + Result := Param; +end; + +function OnDownloadProgress(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean; +begin + if Progress = ProgressMax then + Log(Format('Successfully downloaded file to {tmp}: %s', [FileName])); + Result := True; +end; + +function FindSkyrimPath(): Boolean; +begin + Result := True; + if not RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Bethesda Softworks\Skyrim Special Edition GOG', 'Installed Path', sSkyrimPath) then + if not RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Bethesda Softworks\Skyrim Special Edition', 'Installed Path', sSkyrimPath) then + if not RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Bethesda Softworks\Skyrim VR', 'Installed Path', sSkyrimPath) then + Result := False; +end; + +procedure InitializeWizard; +begin + FindSkyrimPath(); + + SkyrimDirPage := CreateInputDirPage(wpSelectTasks, 'Skyrim SE location', 'All necessary files will be copied to the Enderal SE directory, creating a new copy of Skyrim. The original Skyrim installation will not be modified.', '', False, ''); + SkyrimDirPage.Add('Select a directory with installed Skyrim Special Edition:'); + SkyrimDirPage.Values[0] := RemoveBackslashUnlessRoot(sSkyrimPath); + + DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadProgress); +end; + +function NextButtonClick(CurPageID: Integer): Boolean; +var + supportedVersions: TStringList; +begin + if CurPageID = SkyrimDirPage.ID then begin + sSkyrimPath := RemoveBackslashUnlessRoot(SkyrimDirPage.Values[0]) + '\'; + + if not GetVersionNumbersString(sSkyrimPath + 'SkyrimSE.exe', sSkyrimVersion) then begin + Result := False; + MsgBox('Please, select a directory with installed Skyrim Special Edition.', mbError, MB_OK); + Exit; + end + else if (sSkyrimVersion = '1.0.0.0') and FileExists(sSkyrimPath + 'binkw64.dll') then begin + if FileExists(sSkyrimPath + 'SkyrimVR.exe') then + sSkyrimVersion := '1.4.15.0' + else + sSkyrimVersion := '1.5.97.0'; + end; + + StringChangeEx(sSkyrimVersion, ' ', '', True); + + supportedVersions := TStringList.Create; + supportedVersions.Add('1.4.15.0'); + supportedVersions.Add('1.5.97.0'); + supportedVersions.Add('1.6.640.0'); + supportedVersions.Add('1.6.659.0'); + supportedVersions.Add('1.6.1130.0'); + supportedVersions.Add('1.6.1170.0'); + supportedVersions.Add('1.6.1179.0'); + + if supportedVersions.IndexOf(sSkyrimVersion) < 0 then begin + Result := False; + MsgBox('Skyrim SE ' + sSkyrimVersion + ' is untested with this version of Enderal SE.', mbError, MB_OK); + Exit; + end; + end; + + if CurPageID = wpReady then begin + if not FileExists(ExpandConstant('{app}') + '\Data\profiles\Default\plugins.txt') then begin + ForceDirectories(ExpandConstant('{app}') + '\Data\profiles\Default'); + SaveStringToFile(ExpandConstant('{app}') + '\Data\profiles\Default\plugins.txt', '# This file was automatically generated by Mod Organizer.' + #13#10 + '*Enderal - Forgotten Stories.esm' + #13#10, False); + end; + + DownloadPage.Clear; + DownloadPage.Add('https://github.com/ModOrganizer2/modorganizer/releases/download/v2.5.0/Mod.Organizer-2.5.0.exe', 'Mod.Organizer-2.5.0.exe', ''); + DownloadPage.Show; + try + try + DownloadPage.Download; // This downloads the files to {tmp} + Result := True; + except + if DownloadPage.AbortedByUser then + Log('Aborted by user.') + else + SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK); + Result := False; + end; + finally + DownloadPage.Hide; + end; + end else + Result := True; +end; + +function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String; +var + S: String; +begin + S := MemoDirInfo; + S := S + NewLine + NewLine + 'Skyrim location:'; + S := S + NewLine + Space + RemoveBackslashUnlessRoot(sSkyrimPath); + S := S + NewLine + Space + 'v' + sSkyrimVersion; + Result := S; +end; diff --git a/enderal.ico b/enderal.ico new file mode 100644 index 0000000..d3c716c Binary files /dev/null and b/enderal.ico differ