#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;