From 9a74c0f601f9963b6d4a8f1d37fd065c0f9daa76 Mon Sep 17 00:00:00 2001 From: Sauceke Date: Wed, 22 Oct 2025 19:15:49 +0400 Subject: [PATCH 1/9] [Installer] Fit everything into one page --- src/Installer/InstallScript.iss | 211 ++++++++++++++++++++------------ 1 file changed, 130 insertions(+), 81 deletions(-) diff --git a/src/Installer/InstallScript.iss b/src/Installer/InstallScript.iss index ae9ef22..2c4909c 100644 --- a/src/Installer/InstallScript.iss +++ b/src/Installer/InstallScript.iss @@ -88,14 +88,13 @@ Name: "{group}\Inno_Setup_Project"; Filename: "{app}\Inno_Setup_Project.exe" [Code] const - PageSize = 4; PluginCount = {#PluginCount}; + Spacing = 8; var - // The directory prompts don't fit all in one page, so we need more pages - // This is way too many pages but whatever - DirPages: array[0..{#PluginCount}] of TInputDirWizardPage; - Old_WizardForm_NextButton_OnClick: TNotifyEvent; - PlaceholderDir: String; + GameDirs: array[0..{#PluginCount - 1}] of String; + PathEdit: TEdit; + TitleComboBox: TComboBox; + PathList: TListBox; // The ID of the plugin at the given index (e. g. 'LoveMachine.KK') function GetPluginId(Index: Integer): String; @@ -160,20 +159,9 @@ begin Result := '' end; -// Tells us where on which page the install dir box for the given index is located -procedure GetPageAndIndex(Index: Integer; out Page: Integer; out IndexInPage: Integer); -begin - Page := Index / PageSize; - IndexInPage := Index mod PageSize; -end; - function GetDir(Index: String): String; -var - Page: Integer; - IndexInPage: Integer; begin - GetPageAndIndex(StrToInt(Index), Page, IndexInPage); - Result := DirPages[Page].Values[IndexInPage]; + Result := GameDirs[StrToInt(Index)]; end; function IsDirSelected(Index: Integer): Boolean; @@ -197,101 +185,165 @@ begin Result := 'GameDir.' + GetPluginId(Index); end; -function ValidateGameDir(Path: String): Boolean; +procedure Oopsie(Message: String; Show: Boolean); +begin + if Show then + MsgBox(Message, mbError, MB_OK); +end; + +function ValidateGameDir(Path: String; ShowErrors: Boolean): Boolean; var FindRec: TFindRec; - WarningMsg: String; begin Result := True; - if (not FindFirst(AddBackslash(Path) + '*_Data', FindRec)) and (Path <> PlaceholderDir) then + if not FindFirst(AddBackslash(Path) + '*_Data', FindRec) then begin - WarningMsg := Format(CustomMessage('NotAGameDir'), [Path]); - MsgBox(WarningMsg, mbError, MB_OK); + Oopsie(Format(CustomMessage('NotAGameDir'), [Path]), ShowErrors); Result := False; end; end; -function ValidateDirPage(Page: TWizardPage; DirCount: Integer): Boolean; +function AddGameDir(GameDir: String; PluginIndex: Integer; ShowErrors: Boolean): Boolean; var - DirPage: TInputDirWizardPage; - IndexInPage: Integer; + Index: Integer; begin - Result := True; - DirPage := Page as TInputDirWizardPage; - for IndexInPage := 0 to DirCount - 1 do + Result := False; + if not ValidateGameDir(GameDir, ShowErrors) then begin - if not ValidateGameDir(DirPage.Values[IndexInPage]) then + exit; + end; + if PluginIndex < 0 then + begin + Oopsie('Select game title', ShowErrors); + exit; + end; + if GameDirs[PluginIndex] <> '' then + begin + Oopsie('Conflicting path', ShowErrors); + exit; + end; + for Index := 0 to PluginCount - 1 do + begin + if GameDirs[Index] = GameDir then begin - Result := False; - break; + Oopsie('Conflicting title', ShowErrors); + exit; end; end; + GameDirs[PluginIndex] := GameDir; + PathList.Items.Add(GameDir); + Result := True; end; -function OnDirPageNextClick(Page: TWizardPage): Boolean; -begin - Result := ValidateDirPage(Page, PageSize); -end; - -function OnLastDirPageNextClick(Page: TWizardPage): Boolean; +procedure RemoveGameDir(GameDir: String); var - LastPage: Integer; - LastIndex: Integer; + Index: Integer; begin - GetPageAndIndex(PluginCount - 1, LastPage, LastIndex); - Result := ValidateDirPage(Page, LastIndex + 1); + for Index := 0 to PluginCount - 1 do + begin + if GameDirs[Index] = GameDir then + GameDirs[Index] := ''; + end; + PathList.Items.Delete(PathList.Items.IndexOf(GameDir)); end; -procedure AddDirPrompts; +procedure PopulateGameListPage; var Index: Integer; - Page: Integer; - IndexInPage: Integer; - PrevPageID: Integer; + GameDir: String; begin for Index := 0 to PluginCount - 1 do begin - GetPageAndIndex(Index, Page, IndexInPage); - if Page = 0 then - PrevPageID := wpSelectDir - else - PrevPageID := DirPages[Page - 1].ID; - if IndexInPage = 0 then - DirPages[Page] := CreateInputDirPage(PrevPageID, - Format(CustomMessage('SelectPathTitle'), [Page + 1]), - CustomMessage('SelectPath'), - '', False, ''); - DirPages[Page].Add(GetGameName(Index)); - DirPages[Page].Values[IndexInPage] := + TitleComboBox.Items.Add(GetGameName(Index)); + end; + for Index := 0 to PluginCount - 1 do + begin + GameDir := GetPreviousData(GetPreviousDataKey(Index), GuessGamePath(Index)); - DirPages[Page].OnNextButtonClick := @OnDirPageNextClick; + if GameDir <> '' then + AddGameDir(GameDir, Index, False); end; - DirPages[Page].OnNextButtonClick := @OnLastDirPageNextClick; end; -// based on https://stackoverflow.com/a/31706698 -procedure New_WizardForm_NextButton_OnClick(Sender: TObject); +procedure OnBrowseClick(Sender: TObject); var - Index: Integer; - Page: Integer; - IndexInPage: Integer; + Path: String; begin - for Index := 0 to PluginCount - 1 do + Path := PathEdit.Text; + if Path = '' then + Path := ExpandConstant('{sd}'); + if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), Path, False) then begin - GetPageAndIndex(Index, Page, IndexInPage); - if DirPages[Page].Values[IndexInPage] = '' then - // Force value to pass validation - DirPages[Page].Values[IndexInPage] := PlaceholderDir; + PathEdit.Text := Path; end; - Old_WizardForm_NextButton_OnClick(Sender); - for Index := 0 to PluginCount - 1 do +end; + +procedure OnAddClick(Sender: TObject); +begin + if AddGameDir(PathEdit.Text, TitleComboBox.ItemIndex, True) then begin - GetPageAndIndex(Index, Page, IndexInPage); - if DirPages[Page].Values[IndexInPage] = PlaceholderDir then - DirPages[Page].Values[IndexInPage] := ''; + PathEdit.Text := ''; + TitleComboBox.ItemIndex := -1; end; end; +procedure OnRemoveClick(Sender: TObject); +begin + if PathList.ItemIndex >= 0 then + RemoveGameDir(PathList.Items[PathList.ItemIndex]); +end; + +procedure AddGameListPage; +var + GameListPage: TWizardPage; + BrowseBtn: TButton; + AddBtn: TButton; + RemoveBtn: TButton; +begin + GameListPage := CreateCustomPage(wpSelectDir, + 'Select Destinations', + 'To add a game, select the game folder and the title, then click Add.'); + PathEdit := TEdit.Create(WizardForm); + PathEdit.Parent := GameListPage.Surface; + PathEdit.Left := 0; + PathEdit.Top := 0; + BrowseBtn := TButton.Create(WizardForm); + BrowseBtn.Parent := GameListPage.Surface; + BrowseBtn.Left := GameListPage.Surface.Width - BrowseBtn.Width; + BrowseBtn.Top := 0; + BrowseBtn.Height := PathEdit.Height; + BrowseBtn.Caption := SetupMessage(msgButtonBrowse); + BrowseBtn.OnClick := @OnBrowseClick; + PathEdit.Width := BrowseBtn.Left - PathEdit.Left - Spacing; + TitleComboBox := TComboBox.Create(WizardForm); + TitleComboBox.Parent := GameListPage.Surface; + TitleComboBox.Left := 0; + TitleComboBox.Top := PathEdit.Height + Spacing; + TitleComboBox.Width := GameListPage.Surface.Width; + TitleComboBox.Text := 'Select game title...'; + AddBtn := TButton.Create(WizardForm); + AddBtn.Parent := GameListPage.Surface; + AddBtn.Left := 0; + AddBtn.Top := TitleComboBox.Top + TitleComboBox.Height + Spacing; + AddBtn.Height := BrowseBtn.Height; + AddBtn.Caption := 'Add'; + AddBtn.OnClick := @OnAddClick; + PathList := TListBox.Create(WizardForm); + PathList.Parent := GameListPage.Surface; + PathList.Left := 0; + PathList.Top := AddBtn.Top + AddBtn.Height + Spacing; + PathList.Width := GameListPage.Surface.Width; + PathList.Height := GameListPage.Surface.Height - BrowseBtn.Height - PathList.Top - Spacing; + PathList.MultiSelect := False; + RemoveBtn := TButton.Create(WizardForm); + RemoveBtn.Parent := GameListPage.Surface; + RemoveBtn.Left := 0; + RemoveBtn.Top := PathList.Top + PathList.Height + spacing; + RemoveBtn.Height := BrowseBtn.Height; + RemoveBtn.Caption := 'Remove'; + RemoveBtn.OnClick := @OnRemoveClick; +end; + procedure CheckIntiface; var ErrorCode: Integer; @@ -304,11 +356,9 @@ end; procedure InitializeWizard; begin - PlaceholderDir := ExpandConstant('{%TEMP}'); CheckIntiface; - AddDirPrompts; - Old_WizardForm_NextButton_OnClick := WizardForm.NextButton.OnClick; - WizardForm.NextButton.OnClick := @New_WizardForm_NextButton_OnClick; + AddGameListPage; + PopulateGameListPage; end; procedure RegisterPreviousData(PreviousDataKey: Integer); @@ -320,8 +370,7 @@ var begin for Index := 0 to PluginCount - 1 do begin - GetPageAndIndex(Index, Page, IndexInPage); - DirPath := DirPages[Page].Values[IndexInPage]; + DirPath := GameDirs[Index]; if DirExists(DirPath) then SetPreviousData(PreviousDataKey, GetPreviousDataKey(Index), DirPath); end; From 8866b6a77ec4513ecdccd12194d1b2c7b0dca8be Mon Sep 17 00:00:00 2001 From: Sauceke Date: Wed, 22 Oct 2025 23:12:57 +0400 Subject: [PATCH 2/9] [Installer] i18n --- src/Installer/EN.isl | 10 ++++++++-- src/Installer/InstallScript.iss | 16 ++++++++-------- src/Installer/JP.isl | 10 ++++++++-- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/Installer/EN.isl b/src/Installer/EN.isl index 87a4d6f..ec7d50d 100644 --- a/src/Installer/EN.isl +++ b/src/Installer/EN.isl @@ -1,5 +1,11 @@ [CustomMessages] InstallIntiface=LoveMachine requires Intiface Central to be installed. Install it now? -SelectPathTitle=Select Destinations - Page %d -SelectPath=Select the game folder for each of your games. Leave blank for games you don't have. +GameListTitle=Select Destinations +GameListDesc=To add a game, select the game folder and the title, then click Add. NotAGameDir=Path %s does not appear to be a Unity game directory. Please select the directory containing the game data. +TitlePlaceholder=Select game title... +MissingTitle=Game not recognized, please select it manually from the dropdown. +ConflictingPaths=Another path is already set for %s. Overwrite it? +ConflictingTitles=This path is already set for %s. Overwrite it? +AddBtn=Add +RemoveBtn=Remove \ No newline at end of file diff --git a/src/Installer/InstallScript.iss b/src/Installer/InstallScript.iss index 2c4909c..4695491 100644 --- a/src/Installer/InstallScript.iss +++ b/src/Installer/InstallScript.iss @@ -214,19 +214,19 @@ begin end; if PluginIndex < 0 then begin - Oopsie('Select game title', ShowErrors); + Oopsie(CustomMessage('MissingTitle'), ShowErrors); exit; end; if GameDirs[PluginIndex] <> '' then begin - Oopsie('Conflicting path', ShowErrors); + Oopsie(Format(CustomMessage('ConflictingPaths'), [GetGameName(PluginIndex)]), ShowErrors); exit; end; for Index := 0 to PluginCount - 1 do begin if GameDirs[Index] = GameDir then begin - Oopsie('Conflicting title', ShowErrors); + Oopsie(Format(CustomMessage('ConflictingTitles'), [GetGameName(Index)]), ShowErrors); exit; end; end; @@ -301,8 +301,8 @@ var RemoveBtn: TButton; begin GameListPage := CreateCustomPage(wpSelectDir, - 'Select Destinations', - 'To add a game, select the game folder and the title, then click Add.'); + CustomMessage('GameListTitle'), + CustomMessage('GameListDesc')); PathEdit := TEdit.Create(WizardForm); PathEdit.Parent := GameListPage.Surface; PathEdit.Left := 0; @@ -320,13 +320,13 @@ begin TitleComboBox.Left := 0; TitleComboBox.Top := PathEdit.Height + Spacing; TitleComboBox.Width := GameListPage.Surface.Width; - TitleComboBox.Text := 'Select game title...'; + TitleComboBox.Text := CustomMessage('TitlePlaceholder'); AddBtn := TButton.Create(WizardForm); AddBtn.Parent := GameListPage.Surface; AddBtn.Left := 0; AddBtn.Top := TitleComboBox.Top + TitleComboBox.Height + Spacing; AddBtn.Height := BrowseBtn.Height; - AddBtn.Caption := 'Add'; + AddBtn.Caption := CustomMessage('AddBtn'); AddBtn.OnClick := @OnAddClick; PathList := TListBox.Create(WizardForm); PathList.Parent := GameListPage.Surface; @@ -340,7 +340,7 @@ begin RemoveBtn.Left := 0; RemoveBtn.Top := PathList.Top + PathList.Height + spacing; RemoveBtn.Height := BrowseBtn.Height; - RemoveBtn.Caption := 'Remove'; + RemoveBtn.Caption := CustomMessage('RemoveBtn'); RemoveBtn.OnClick := @OnRemoveClick; end; diff --git a/src/Installer/JP.isl b/src/Installer/JP.isl index 981e01e..36e6cb4 100644 --- a/src/Installer/JP.isl +++ b/src/Installer/JP.isl @@ -1,5 +1,11 @@ [CustomMessages] InstallIntiface=LoveMachineを使用するにはIntiface Centralをインストールする必要があります。今インストールしますか? -SelectPathTitle=インストール先・%dページ -SelectPath=インストール先のゲームフォルダを選択してください。持っていないゲームの入力欄は空白のままにしておいてください。 +GameListTitle=インストール先 +GameListDesc=ゲームを追加するには、ゲームフォルダとタイトルを選択して「追加」ボタンをクリックします。 NotAGameDir=「%s」はUnityゲームフォルダじゃないみたいです。ゲームデータを含むフォルダを選択してください。 +TitlePlaceholder=ゲームタイトルを選択... +MissingTitle=ゲームを認識できません。ドロップダウンから手で選択してください。 +ConflictingPaths=「%s」のフォルダは既に選択されています。上書きしますか? +ConflictingTitles=このフォルダは既に「%s」に関連付けられています。上書きしますか? +AddBtn=追加 +RemoveBtn=削除 \ No newline at end of file From b40c6e4d62ff232a9209f4ebb87dfbdc0c656609 Mon Sep 17 00:00:00 2001 From: Sauceke Date: Thu, 23 Oct 2025 01:08:05 +0400 Subject: [PATCH 3/9] [Installer] Implement overwrite dialogs --- src/Installer/EN.isl | 6 ++-- src/Installer/InstallScript.iss | 60 +++++++++++++++++++-------------- src/Installer/JP.isl | 6 ++-- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/Installer/EN.isl b/src/Installer/EN.isl index ec7d50d..47f8da1 100644 --- a/src/Installer/EN.isl +++ b/src/Installer/EN.isl @@ -2,10 +2,10 @@ InstallIntiface=LoveMachine requires Intiface Central to be installed. Install it now? GameListTitle=Select Destinations GameListDesc=To add a game, select the game folder and the title, then click Add. -NotAGameDir=Path %s does not appear to be a Unity game directory. Please select the directory containing the game data. +NotAGameDir=Path %1 does not appear to be a Unity game directory. Please select the directory containing the game data. TitlePlaceholder=Select game title... MissingTitle=Game not recognized, please select it manually from the dropdown. -ConflictingPaths=Another path is already set for %s. Overwrite it? -ConflictingTitles=This path is already set for %s. Overwrite it? +ConflictingPaths=Another path is already set for %1. Overwrite it? +ConflictingTitles=This path is already set for %1. Overwrite it? AddBtn=Add RemoveBtn=Remove \ No newline at end of file diff --git a/src/Installer/InstallScript.iss b/src/Installer/InstallScript.iss index 4695491..9882ac5 100644 --- a/src/Installer/InstallScript.iss +++ b/src/Installer/InstallScript.iss @@ -185,68 +185,76 @@ begin Result := 'GameDir.' + GetPluginId(Index); end; -procedure Oopsie(Message: String; Show: Boolean); +procedure Warn(Message: String; Interactive: Boolean); begin - if Show then + if Interactive then MsgBox(Message, mbError, MB_OK); end; -function ValidateGameDir(Path: String; ShowErrors: Boolean): Boolean; +function Ask(Message: String; Interactive: Boolean): Boolean; +begin + Result := Interactive and (MsgBox(Message, mbConfirmation, MB_YESNO) = IDYES); +end; + +function ValidateGameDir(Path: String; Interactive: Boolean): Boolean; var FindRec: TFindRec; begin Result := True; if not FindFirst(AddBackslash(Path) + '*_Data', FindRec) then begin - Oopsie(Format(CustomMessage('NotAGameDir'), [Path]), ShowErrors); + Warn(FmtMessage(CustomMessage('NotAGameDir'), [Path]), Interactive); Result := False; end; end; -function AddGameDir(GameDir: String; PluginIndex: Integer; ShowErrors: Boolean): Boolean; +procedure RemoveGameDir(GameDir: String); +var + Index: Integer; +begin + for Index := 0 to PluginCount - 1 do + begin + if GameDirs[Index] = GameDir then + GameDirs[Index] := ''; + end; + PathList.Items.Delete(PathList.Items.IndexOf(GameDir)); +end; + +function AddGameDir(GameDir: String; PluginIndex: Integer; Interactive: Boolean): Boolean; var Index: Integer; begin Result := False; - if not ValidateGameDir(GameDir, ShowErrors) then + if not ValidateGameDir(GameDir, Interactive) then begin exit; end; if PluginIndex < 0 then begin - Oopsie(CustomMessage('MissingTitle'), ShowErrors); + Warn(CustomMessage('MissingTitle'), Interactive); exit; end; if GameDirs[PluginIndex] <> '' then begin - Oopsie(Format(CustomMessage('ConflictingPaths'), [GetGameName(PluginIndex)]), ShowErrors); - exit; + if Ask(FmtMessage(CustomMessage('ConflictingPaths'), [GetGameName(PluginIndex)]), Interactive) then + RemoveGameDir(GameDirs[PluginIndex]) + else + exit; end; for Index := 0 to PluginCount - 1 do begin - if GameDirs[Index] = GameDir then - begin - Oopsie(Format(CustomMessage('ConflictingTitles'), [GetGameName(Index)]), ShowErrors); + if GameDirs[Index] <> GameDir then + continue; + if Ask(FmtMessage(CustomMessage('ConflictingTitles'), [GetGameName(Index)]), Interactive) then + RemoveGameDir(GameDirs[Index]) + else exit; - end; end; GameDirs[PluginIndex] := GameDir; PathList.Items.Add(GameDir); Result := True; end; -procedure RemoveGameDir(GameDir: String); -var - Index: Integer; -begin - for Index := 0 to PluginCount - 1 do - begin - if GameDirs[Index] = GameDir then - GameDirs[Index] := ''; - end; - PathList.Items.Delete(PathList.Items.IndexOf(GameDir)); -end; - procedure PopulateGameListPage; var Index: Integer; @@ -349,7 +357,7 @@ var ErrorCode: Integer; begin if ShouldInstallIntiface() then - if MsgBox(CustomMessage('InstallIntiface'), mbConfirmation, MB_YESNO) = IDYES then + if Ask(CustomMessage('InstallIntiface'), True) then if not ShellExec('open', 'https://intiface.com/central/', '', '', SW_SHOW, ewNoWait, ErrorCode) then MsgBox(SysErrorMessage(ErrorCode), mbError, MB_OK); end; diff --git a/src/Installer/JP.isl b/src/Installer/JP.isl index 36e6cb4..03c11dd 100644 --- a/src/Installer/JP.isl +++ b/src/Installer/JP.isl @@ -2,10 +2,10 @@ InstallIntiface=LoveMachineを使用するにはIntiface Centralをインストールする必要があります。今インストールしますか? GameListTitle=インストール先 GameListDesc=ゲームを追加するには、ゲームフォルダとタイトルを選択して「追加」ボタンをクリックします。 -NotAGameDir=「%s」はUnityゲームフォルダじゃないみたいです。ゲームデータを含むフォルダを選択してください。 +NotAGameDir=「%1」はUnityゲームフォルダじゃないみたいです。ゲームデータを含むフォルダを選択してください。 TitlePlaceholder=ゲームタイトルを選択... MissingTitle=ゲームを認識できません。ドロップダウンから手で選択してください。 -ConflictingPaths=「%s」のフォルダは既に選択されています。上書きしますか? -ConflictingTitles=このフォルダは既に「%s」に関連付けられています。上書きしますか? +ConflictingPaths=「%1」のフォルダは既に選択されています。上書きしますか? +ConflictingTitles=このフォルダは既に「%1」に関連付けられています。上書きしますか? AddBtn=追加 RemoveBtn=削除 \ No newline at end of file From 5e23f8226092cd38e6889dbcf2835cab87387490 Mon Sep 17 00:00:00 2001 From: Sauceke Date: Thu, 23 Oct 2025 02:13:20 +0400 Subject: [PATCH 4/9] [*] Add executable name field to all plugins --- src/LoveMachine.AGH/PluginInfo.ini | Bin 306 -> 350 bytes src/LoveMachine.AI/PluginInfo.ini | Bin 408 -> 466 bytes src/LoveMachine.AIDR/PluginInfo.ini | Bin 298 -> 362 bytes src/LoveMachine.COM3D2/PluginInfo.ini | Bin 454 -> 504 bytes src/LoveMachine.DJ/PluginInfo.ini | Bin 280 -> 342 bytes src/LoveMachine.EC/PluginInfo.ini | Bin 290 -> 358 bytes src/LoveMachine.HC.DigitalCraft/PluginInfo.ini | Bin 352 -> 418 bytes src/LoveMachine.HC/PluginInfo.ini | Bin 396 -> 452 bytes src/LoveMachine.HKR/PluginInfo.ini | Bin 298 -> 366 bytes src/LoveMachine.HS/PluginInfo.ini | Bin 398 -> 464 bytes src/LoveMachine.HS2/PluginInfo.ini | Bin 434 -> 496 bytes src/LoveMachine.I2C/PluginInfo.ini | Bin 288 -> 340 bytes src/LoveMachine.IO/PluginInfo.ini | Bin 272 -> 314 bytes src/LoveMachine.KK/PluginInfo.ini | Bin 394 -> 446 bytes src/LoveMachine.KKLB/PluginInfo.ini | Bin 298 -> 372 bytes src/LoveMachine.KKS/PluginInfo.ini | Bin 462 -> 532 bytes src/LoveMachine.LE/PluginInfo.ini | Bin 266 -> 320 bytes src/LoveMachine.OA/PluginInfo.ini | Bin 296 -> 360 bytes src/LoveMachine.OT/PluginInfo.ini | Bin 272 -> 338 bytes src/LoveMachine.PH/PluginInfo.ini | Bin 342 -> 406 bytes src/LoveMachine.RG/PluginInfo.ini | Bin 416 -> 470 bytes src/LoveMachine.SC/PluginInfo.ini | Bin 274 -> 336 bytes src/LoveMachine.SCH/PluginInfo.ini | Bin 314 -> 386 bytes src/LoveMachine.SCS/PluginInfo.ini | Bin 270 -> 332 bytes src/LoveMachine.SG/PluginInfo.ini | Bin 274 -> 360 bytes src/LoveMachine.SIH/PluginInfo.ini | Bin 270 -> 332 bytes src/LoveMachine.VRK/PluginInfo.ini | Bin 262 -> 318 bytes src/LoveMachine.WP/PluginInfo.ini | Bin 272 -> 338 bytes 28 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/LoveMachine.AGH/PluginInfo.ini b/src/LoveMachine.AGH/PluginInfo.ini index 0371bab76ead74ea245480bfc6aeaa49f0c8c8f9..82c837e1690398b59fcc1cfb0eb1a140f1f2cfa0 100644 GIT binary patch delta 52 zcmdnQbdPC+5u=VPLj^-BLo!1tLkUA7LlQ#{kmmHjVBlroVgLX; C3kiz= delta 7 Ocmcb|w25hh5hDN$90GU% diff --git a/src/LoveMachine.AI/PluginInfo.ini b/src/LoveMachine.AI/PluginInfo.ini index 21c3974594a6f80b728692e660e0e991a3c77019..e31ee7e0d6397c4997e2f29ecf59f613bb5d558a 100644 GIT binary patch delta 66 zcmbQie2IC(3`Q$gh6;vMhGd3Ph7yKEh9rg@AkPoT$_3I247Nb*$l%GK%Mi>^$&e3J Ll?A4G8Mqh#^Fa*6 delta 7 Ocmcb_JcD_|3`PJ990Ixk diff --git a/src/LoveMachine.AIDR/PluginInfo.ini b/src/LoveMachine.AIDR/PluginInfo.ini index b61b95687968bb29310e8d4a6bad5248ac3b1660..693b43c6895fb525af916e26ad334dd4104abbef 100644 GIT binary patch delta 72 zcmZ3*^onVN7NdhJLj^-BLo!1tLkUA7LlQ#{kmmXVGKbGybN3n E090TKxBvhE delta 7 OcmZ3){D5gg0wVwmzyg^7 diff --git a/src/LoveMachine.HC/PluginInfo.ini b/src/LoveMachine.HC/PluginInfo.ini index 0b57124de9806527773cbc82e7b209da1332aaf9..b47e2ce2e446facfe1fc92b7f76b1c7eb615aa07 100644 GIT binary patch delta 38 rcmeBSKEk}Ahf&&UQ delta 7 OcmaFIw2Eni79#)*R04Pa diff --git a/src/LoveMachine.HS/PluginInfo.ini b/src/LoveMachine.HS/PluginInfo.ini index 4b0476abcb7ffb94291d6c44967881f74461cad4..6d5d94d2a0cb9fa34ad5478393652a60c0686210 100644 GIT binary patch delta 74 zcmeBUzQDYpkI~7Mp@JcmA(^3+p@bokA&DUe$nyiTa)Go0gDntyFyu4j0eO`S!9Wru SpA1wR&tS%2!obVG#Q*?lkPayT delta 7 Ocmcb>+{e73j}ZV1$O5DQ diff --git a/src/LoveMachine.HS2/PluginInfo.ini b/src/LoveMachine.HS2/PluginInfo.ini index f73b6a3c4f53e7155d9aed46f0877b625737751b..7b84575cb7f10570958fd08e990046dd52165b7c 100644 GIT binary patch delta 50 zcmdnQ{DFDHCPqb9h6;vMhGd3Ph7yKEh9rg@AkPoT$_3I247Lmkll>VbS$G+^7yv{J B3Pb<^ delta 7 Ocmeysyoq_kCPn}aqyr29 diff --git a/src/LoveMachine.I2C/PluginInfo.ini b/src/LoveMachine.I2C/PluginInfo.ini index d8a144ebf845592c1e54a5ab8edee8afcccb647c..aaa8baa63636e697162d8ba73194912299d1c6ff 100644 GIT binary patch delta 60 zcmZ3$bcJby0;7p5Lj^-BLo!1tLkUA7LlQ#{kmm=&WF8RmGH@{f E0Fa>zPXGV_ delta 7 Ocmcb@w18=Y0wVwmSOQ7_ diff --git a/src/LoveMachine.IO/PluginInfo.ini b/src/LoveMachine.IO/PluginInfo.ini index 43a7937c6d8e6ffaab6e3c72e71963042bf6514c..bf2c884e3dda099b03705e9641ad427af8ed39d9 100644 GIT binary patch delta 50 zcmbQhw2Ntj0Hc;GLj^-BLo!1tLkUA7LlQ#{kmmH_Hi diff --git a/src/LoveMachine.LE/PluginInfo.ini b/src/LoveMachine.LE/PluginInfo.ini index e939289496e17aa117e57c857b52413221b39230..63e170bb5b3559e7ab906e92bb6d690f46643aac 100644 GIT binary patch delta 62 zcmeBTI>5Ani_y%Lp@JcmA(^3+p@bokA&DUe$nyiTa)Go0gDnvI0C~kgSyzTKhD@M5 IF9R0?0GoLWdjJ3c delta 7 OcmX@W)Wx)cixB_{G6D(! diff --git a/src/LoveMachine.OA/PluginInfo.ini b/src/LoveMachine.OA/PluginInfo.ini index a0a5f8acf5093de8bbb0176ff6d63a3291488f56..71453bfe50d13be0ab69989c7df93d72a090057d 100644 GIT binary patch delta 38 rcmZ3%^nz)F2BWkqLj^-BLo!1tLkUA7LlQ#{kmmv&f7^Ac+Lj^-BLo!1tLkUA7LlQ#{kmm}#$W;z%mhmEGH@{f E09gYIDgXcg delta 7 OcmbQne2r;C7$X1+CIWc? diff --git a/src/LoveMachine.RG/PluginInfo.ini b/src/LoveMachine.RG/PluginInfo.ini index b61c939b97d07f2a27cf21ff580512fb5110a1aa..c8892c1c1e04e33c883f9a966207c39abde0b50c 100644 GIT binary patch delta 38 rcmZ3$e2sa-0!C?9h6;vMhGd3Ph7yKEh9rg@AkPoT%4JBMI9D0~#_b8U delta 7 Ocmcb{ynuPb0!9D~a01Q% diff --git a/src/LoveMachine.SC/PluginInfo.ini b/src/LoveMachine.SC/PluginInfo.ini index 0960cd0f624e3ecdac46300180ee1d14b609b82c..0d6567125fdac6bcf8de0751839deeb41c61d8ca 100644 GIT binary patch delta 51 zcmbQlbb)Du5Tmp!Lj^-BLo!1tLkUA7LlQ#{kmmG>K`05F-Ez+5##7 diff --git a/src/LoveMachine.SCH/PluginInfo.ini b/src/LoveMachine.SCH/PluginInfo.ini index d424722ba6d90f8b7987493daf88cea74b84ff1f..cd217f86866b5b32fcd2b2829e699423d62668df 100644 GIT binary patch delta 38 rcmdnR)Wp2Oic#8?p@JcmA(^3+p@bokA&DUe$nyiTav4%5&esJ1vBU`| delta 7 OcmZo--o>=RiV*+_)&ea6 diff --git a/src/LoveMachine.SCS/PluginInfo.ini b/src/LoveMachine.SCS/PluginInfo.ini index e5d44fe042a522bd55955bcc36fef2c0ba114168..ee2528efe38e1ea0f60c17fb483c1d211b505634 100644 GIT binary patch delta 38 rcmeBUI>WSqk5Sr{p@JcmA(^3+p@bokA&DUe$nyiTav4%5&Q}HiugeJ! delta 7 OcmX@Z)W@`ej}ZV0q5>WO diff --git a/src/LoveMachine.SG/PluginInfo.ini b/src/LoveMachine.SG/PluginInfo.ini index 44c695a39a34ce1fe343f71d6c04474fb72101da..b5c3cbd35293298981b5ce8266b8afb9a379bc23 100644 GIT binary patch delta 75 zcmbQl^nz)F5Tmp!Lj^-BLo!1tLkUA7LlQ#{kmmK`05F-E!f&xMS diff --git a/src/LoveMachine.SIH/PluginInfo.ini b/src/LoveMachine.SIH/PluginInfo.ini index 96debed1c9c90c2e95010a5af340832a9eeae569..3afc791e1ce9e875267bef945fbcc54bff3ee958 100644 GIT binary patch delta 70 zcmeBUI>WSqkI~MRp@JcmA(^3+p@bokA&DUe$nyiTa)Go0gDnsT1LbnT{2~TVhCBuj NpiClAH7^4f0{{&44J7~o delta 7 OcmX@Z)W@`ej}ZV0q5>WO diff --git a/src/LoveMachine.VRK/PluginInfo.ini b/src/LoveMachine.VRK/PluginInfo.ini index fd78b3a51ab03a5cdf4ab9ac450996695ab5d1e7..f9f1322e6353c6adf4036b7d0541cc7e05b92f5d 100644 GIT binary patch delta 64 zcmZo;+Q+nkjnTrDp@JcmA(^3+p@bokA&DUe$nyiTa)Go0gDnt;F$6KhGk62V@)+_N LvVfSEfr|kEukj1G delta 7 OcmdnT)W)=djS&C}2m$~A diff --git a/src/LoveMachine.WP/PluginInfo.ini b/src/LoveMachine.WP/PluginInfo.ini index 851f87ee72820927fef9a8b7eb9334c4c4e68cf3..ed92c822b1ac2278587681e5eaa6bacc68c38381 100644 GIT binary patch delta 74 zcmbQhbctz$0Hc#DLj^-BLo!1tLkUA7LlQ#{kmm delta 7 Ocmcb_G=XV@03!ej+5#v5 From b205edbd4e6618f98665601307b574d26e5f19cc Mon Sep 17 00:00:00 2001 From: Sauceke Date: Thu, 23 Oct 2025 02:42:15 +0400 Subject: [PATCH 5/9] [Installer] Auto-select game title based on exe name --- src/Installer/InstallScript.iss | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/Installer/InstallScript.iss b/src/Installer/InstallScript.iss index 9882ac5..e7f4938 100644 --- a/src/Installer/InstallScript.iss +++ b/src/Installer/InstallScript.iss @@ -16,6 +16,7 @@ #define GetGameRegSubKey(Index) ReadIni(GetPluginInfoIni(Index), GetPluginId(Index), "RegSubKey") #define GetGameRegName(Index) ReadIni(GetPluginInfoIni(Index), GetPluginId(Index), "RegName") #define GetGameArchitecture(Index) ReadIni(GetPluginInfoIni(Index), GetPluginId(Index), "Architecture") +#define GetExecutableName(Index) ReadIni(GetPluginInfoIni(Index), GetPluginId(Index), "ExecutableName") #define I 0 #sub AddGameEntry @@ -146,6 +147,16 @@ begin end; end; +function GetExecutableName(Index: Integer): String; +begin + case Index of + #sub ExeNameMapping + {#I}: Result := '{#GetExecutableName(I)}'; + #endsub + #for {I = 0; I < PluginCount; I++} ExeNameMapping + end; +end; + // Tries to guess the root directory of the game at the given index function GuessGamePath(Index: Integer): String; begin @@ -159,6 +170,21 @@ begin Result := '' end; +function GuessPluginIndex(GameDir: String): Integer; +var + Index: Integer; +begin + Result := -1; + for Index := 0 to PluginCount - 1 do + begin + if FileExists(AddBackslash(GameDir) + GetExecutableName(Index) + '.exe') then + begin + Result := Index; + break; + end; + end; +end; + function GetDir(Index: String): String; begin Result := GameDirs[StrToInt(Index)]; @@ -283,6 +309,7 @@ begin if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), Path, False) then begin PathEdit.Text := Path; + TitleComboBox.ItemIndex := GuessPluginIndex(Path); end; end; From 31604c01f47d0a94fcf2c855301d57fc6b8d0a78 Mon Sep 17 00:00:00 2001 From: Sauceke Date: Thu, 23 Oct 2025 13:14:30 +0400 Subject: [PATCH 6/9] [Installer] Auto-select title on text input of path --- src/Installer/InstallScript.iss | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Installer/InstallScript.iss b/src/Installer/InstallScript.iss index e7f4938..e3e28b4 100644 --- a/src/Installer/InstallScript.iss +++ b/src/Installer/InstallScript.iss @@ -299,6 +299,11 @@ begin end; end; +procedure OnPathChanged(Sender: TObject); +begin + TitleComboBox.ItemIndex := GuessPluginIndex(PathEdit.Text); +end; + procedure OnBrowseClick(Sender: TObject); var Path: String; @@ -309,7 +314,7 @@ begin if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), Path, False) then begin PathEdit.Text := Path; - TitleComboBox.ItemIndex := GuessPluginIndex(Path); + OnPathChanged(Sender); end; end; @@ -342,6 +347,7 @@ begin PathEdit.Parent := GameListPage.Surface; PathEdit.Left := 0; PathEdit.Top := 0; + PathEdit.OnChange := @OnPathChanged; BrowseBtn := TButton.Create(WizardForm); BrowseBtn.Parent := GameListPage.Surface; BrowseBtn.Left := GameListPage.Surface.Width - BrowseBtn.Width; From e7b4afb2c111677843e41dbe900b92adcccebfef Mon Sep 17 00:00:00 2001 From: Sauceke Date: Thu, 23 Oct 2025 14:49:30 +0400 Subject: [PATCH 7/9] [Installer] UI touch-up --- src/Installer/EN.isl | 3 ++- src/Installer/InstallScript.iss | 9 ++++++++- src/Installer/JP.isl | 7 ++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Installer/EN.isl b/src/Installer/EN.isl index 47f8da1..06a7ad6 100644 --- a/src/Installer/EN.isl +++ b/src/Installer/EN.isl @@ -8,4 +8,5 @@ MissingTitle=Game not recognized, please select it manually from the dropdown. ConflictingPaths=Another path is already set for %1. Overwrite it? ConflictingTitles=This path is already set for %1. Overwrite it? AddBtn=Add -RemoveBtn=Remove \ No newline at end of file +RemoveBtn=Remove +PathListLabel=LoveMachine will be installed to the following locations: diff --git a/src/Installer/InstallScript.iss b/src/Installer/InstallScript.iss index e3e28b4..e482921 100644 --- a/src/Installer/InstallScript.iss +++ b/src/Installer/InstallScript.iss @@ -339,6 +339,8 @@ var BrowseBtn: TButton; AddBtn: TButton; RemoveBtn: TButton; + AddLabel: TLabel; + ListLabel: TLabel; begin GameListPage := CreateCustomPage(wpSelectDir, CustomMessage('GameListTitle'), @@ -369,10 +371,15 @@ begin AddBtn.Height := BrowseBtn.Height; AddBtn.Caption := CustomMessage('AddBtn'); AddBtn.OnClick := @OnAddClick; + ListLabel := TLabel.Create(WizardForm); + ListLabel.Parent := GameListPage.Surface; + ListLabel.Left := 0; + ListLabel.Top := AddBtn.Top + AddBtn.Height + Spacing; + ListLabel.Caption := CustomMessage('PathListLabel'); PathList := TListBox.Create(WizardForm); PathList.Parent := GameListPage.Surface; PathList.Left := 0; - PathList.Top := AddBtn.Top + AddBtn.Height + Spacing; + PathList.Top := ListLabel.Top + ListLabel.Height; PathList.Width := GameListPage.Surface.Width; PathList.Height := GameListPage.Surface.Height - BrowseBtn.Height - PathList.Top - Spacing; PathList.MultiSelect := False; diff --git a/src/Installer/JP.isl b/src/Installer/JP.isl index 03c11dd..6b164b2 100644 --- a/src/Installer/JP.isl +++ b/src/Installer/JP.isl @@ -1,11 +1,12 @@ [CustomMessages] InstallIntiface=LoveMachineを使用するにはIntiface Centralをインストールする必要があります。今インストールしますか? GameListTitle=インストール先 -GameListDesc=ゲームを追加するには、ゲームフォルダとタイトルを選択して「追加」ボタンをクリックします。 +GameListDesc=ゲームを追加するには、ゲームフォルダとタイトルを選択してから「追加」ボタンをクリックしてください。 NotAGameDir=「%1」はUnityゲームフォルダじゃないみたいです。ゲームデータを含むフォルダを選択してください。 -TitlePlaceholder=ゲームタイトルを選択... +TitlePlaceholder=[ゲームタイトル] MissingTitle=ゲームを認識できません。ドロップダウンから手で選択してください。 ConflictingPaths=「%1」のフォルダは既に選択されています。上書きしますか? ConflictingTitles=このフォルダは既に「%1」に関連付けられています。上書きしますか? AddBtn=追加 -RemoveBtn=削除 \ No newline at end of file +RemoveBtn=削除 +PathListLabel=LoveMachineは以下の場所にインストールされます: From 179a5b15f0d37ba0e1a0a92d8a979a18300fee51 Mon Sep 17 00:00:00 2001 From: Sauceke Date: Thu, 23 Oct 2025 20:20:23 +0400 Subject: [PATCH 8/9] [Installer] More foolproofing --- src/Installer/EN.isl | 8 +++++--- src/Installer/InstallScript.iss | 17 +++++++++++++++++ src/Installer/JP.isl | 10 ++++++---- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/Installer/EN.isl b/src/Installer/EN.isl index 06a7ad6..f24795a 100644 --- a/src/Installer/EN.isl +++ b/src/Installer/EN.isl @@ -1,12 +1,14 @@ [CustomMessages] -InstallIntiface=LoveMachine requires Intiface Central to be installed. Install it now? GameListTitle=Select Destinations GameListDesc=To add a game, select the game folder and the title, then click Add. +AddBtn=Add +RemoveBtn=Remove +InstallIntiface=LoveMachine requires Intiface Central to work. Install it now? NotAGameDir=Path %1 does not appear to be a Unity game directory. Please select the directory containing the game data. TitlePlaceholder=Select game title... MissingTitle=Game not recognized, please select it manually from the dropdown. ConflictingPaths=Another path is already set for %1. Overwrite it? ConflictingTitles=This path is already set for %1. Overwrite it? -AddBtn=Add -RemoveBtn=Remove PathListLabel=LoveMachine will be installed to the following locations: +EmptyGameList=You must add at least one game to the list. +GamePending=A game will not be modded unless you add it to the list. Proceed anyway? diff --git a/src/Installer/InstallScript.iss b/src/Installer/InstallScript.iss index e482921..51c2185 100644 --- a/src/Installer/InstallScript.iss +++ b/src/Installer/InstallScript.iss @@ -333,6 +333,22 @@ begin RemoveGameDir(PathList.Items[PathList.ItemIndex]); end; +function OnGameListPageNextButtonClick(Sender: TWizardPage): Boolean; +begin + if PathList.Items.Count = 0 then + begin + Warn(CustomMessage('EmptyGameList'), True); + Result := False; + exit; + end; + if (PathEdit.Text <> '') and not Ask(CustomMessage('GamePending'), True) then + begin + Result := False; + exit; + end; + Result := True; +end; + procedure AddGameListPage; var GameListPage: TWizardPage; @@ -345,6 +361,7 @@ begin GameListPage := CreateCustomPage(wpSelectDir, CustomMessage('GameListTitle'), CustomMessage('GameListDesc')); + GameListPage.OnNextButtonClick := @OnGameListPageNextButtonClick; PathEdit := TEdit.Create(WizardForm); PathEdit.Parent := GameListPage.Surface; PathEdit.Left := 0; diff --git a/src/Installer/JP.isl b/src/Installer/JP.isl index 6b164b2..dd1f095 100644 --- a/src/Installer/JP.isl +++ b/src/Installer/JP.isl @@ -1,12 +1,14 @@ [CustomMessages] -InstallIntiface=LoveMachineを使用するにはIntiface Centralをインストールする必要があります。今インストールしますか? GameListTitle=インストール先 GameListDesc=ゲームを追加するには、ゲームフォルダとタイトルを選択してから「追加」ボタンをクリックしてください。 +AddBtn=追加 +RemoveBtn=削除 +InstallIntiface=LoveMachineを使用するにはIntiface Centralをインストールする必要があります。今インストールしますか? NotAGameDir=「%1」はUnityゲームフォルダじゃないみたいです。ゲームデータを含むフォルダを選択してください。 TitlePlaceholder=[ゲームタイトル] MissingTitle=ゲームを認識できません。ドロップダウンから手で選択してください。 -ConflictingPaths=「%1」のフォルダは既に選択されています。上書きしますか? +ConflictingPaths=「%1」のフォルダは既にリストに入っています。上書きしますか? ConflictingTitles=このフォルダは既に「%1」に関連付けられています。上書きしますか? -AddBtn=追加 -RemoveBtn=削除 PathListLabel=LoveMachineは以下の場所にインストールされます: +EmptyGameList=少なくとも1つのゲームをリストに追加する必要があります。 +GamePending=ゲームをリストに入れないとモッドされません。それでも続行しますか? From 5386d871c84a065809562bd3f1ec2957b3e1acf1 Mon Sep 17 00:00:00 2001 From: Sauceke Date: Thu, 23 Oct 2025 21:48:48 +0400 Subject: [PATCH 9/9] [Installer] Dot all the i's --- src/Installer/InstallScript.iss | 50 ++++++++++++++------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/src/Installer/InstallScript.iss b/src/Installer/InstallScript.iss index 51c2185..7f3e72b 100644 --- a/src/Installer/InstallScript.iss +++ b/src/Installer/InstallScript.iss @@ -132,9 +132,11 @@ end; function GetGameName(Index: Integer): String; begin Result := GetGameNameEN(Index); - if ActiveLanguage = 'jp' then Result := GetGameNameJP(Index); + if ActiveLanguage = 'jp' then + Result := GetGameNameJP(Index); // this shouldn't happen, but whatever - if Result = '' then Result := GetPluginId(Index); + if Result = '' then + Result := GetPluginId(Index); end; function GetGameArchitecture(Index: Integer): String; @@ -195,10 +197,10 @@ begin Result := GetDir(IntToStr(Index)) <> ''; end; -function ShouldInstallIntiface(): Boolean; +function IsIntifaceInstalled(): Boolean; begin - Result := (not DirExists(AddBackslash(ExpandConstant('{commonpf32}')) + 'IntifaceCentral')) - and (not DirExists(AddBackslash(ExpandConstant('{userappdata}')) + 'IntifaceCentral')); + Result := DirExists(AddBackslash(ExpandConstant('{commonpf32}')) + 'IntifaceCentral') + or DirExists(AddBackslash(ExpandConstant('{userappdata}')) + 'IntifaceCentral'); end; function IsBuildType(Index: Integer; Architecture: String): Boolean; @@ -226,12 +228,10 @@ function ValidateGameDir(Path: String; Interactive: Boolean): Boolean; var FindRec: TFindRec; begin - Result := True; - if not FindFirst(AddBackslash(Path) + '*_Data', FindRec) then - begin + Result := FindFirst(AddBackslash(Path) + '*_Data', FindRec); + if not Result then Warn(FmtMessage(CustomMessage('NotAGameDir'), [Path]), Interactive); - Result := False; - end; + FindClose(FindRec); end; procedure RemoveGameDir(GameDir: String); @@ -252,9 +252,7 @@ var begin Result := False; if not ValidateGameDir(GameDir, Interactive) then - begin exit; - end; if PluginIndex < 0 then begin Warn(CustomMessage('MissingTitle'), Interactive); @@ -289,13 +287,8 @@ begin for Index := 0 to PluginCount - 1 do begin TitleComboBox.Items.Add(GetGameName(Index)); - end; - for Index := 0 to PluginCount - 1 do - begin - GameDir := - GetPreviousData(GetPreviousDataKey(Index), GuessGamePath(Index)); - if GameDir <> '' then - AddGameDir(GameDir, Index, False); + GameDir := GetPreviousData(GetPreviousDataKey(Index), GuessGamePath(Index)); + AddGameDir(GameDir, Index, False); end; end; @@ -313,6 +306,7 @@ begin Path := ExpandConstant('{sd}'); if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), Path, False) then begin + ValidateGameDir(Path, True); // allow bad path for easier correction PathEdit.Text := Path; OnPathChanged(Sender); end; @@ -413,10 +407,12 @@ procedure CheckIntiface; var ErrorCode: Integer; begin - if ShouldInstallIntiface() then - if Ask(CustomMessage('InstallIntiface'), True) then - if not ShellExec('open', 'https://intiface.com/central/', '', '', SW_SHOW, ewNoWait, ErrorCode) then - MsgBox(SysErrorMessage(ErrorCode), mbError, MB_OK); + if IsIntifaceInstalled() then + exit; + if not Ask(CustomMessage('InstallIntiface'), True) then + exit; + if not ShellExec('open', 'https://intiface.com/central/', '', '', SW_SHOW, ewNoWait, ErrorCode) then + Warn(SysErrorMessage(ErrorCode), True); end; procedure InitializeWizard; @@ -429,14 +425,10 @@ end; procedure RegisterPreviousData(PreviousDataKey: Integer); var Index: Integer; - Page: Integer; - IndexInPage: Integer; - DirPath: String; begin for Index := 0 to PluginCount - 1 do begin - DirPath := GameDirs[Index]; - if DirExists(DirPath) then - SetPreviousData(PreviousDataKey, GetPreviousDataKey(Index), DirPath); + if DirExists(GameDirs[Index]) then + SetPreviousData(PreviousDataKey, GetPreviousDataKey(Index), GameDirs[Index]); end; end;