;This is an INNO Setup script
;You should download INNO Setup and INNO Script Studio v2 to modify and compile it
#define BWAPI_VERSION "4.4.0"
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl"
Name: "catalan"; MessagesFile: "compiler:Languages\Catalan.isl"
Name: "corsican"; MessagesFile: "compiler:Languages\Corsican.isl"
Name: "czech"; MessagesFile: "compiler:Languages\Czech.isl"
Name: "danish"; MessagesFile: "compiler:Languages\Danish.isl"
Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl"
Name: "finnish"; MessagesFile: "compiler:Languages\Finnish.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
Name: "greek"; MessagesFile: "compiler:Languages\Greek.isl"
Name: "hebrew"; MessagesFile: "compiler:Languages\Hebrew.isl"
Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl"
Name: "italian"; MessagesFile: "compiler:Languages\Italian.isl"
Name: "japanese"; MessagesFile: "compiler:Languages\Japanese.isl"
Name: "norwegian"; MessagesFile: "compiler:Languages\Norwegian.isl"
Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl"
Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "serbiancyrillic"; MessagesFile: "compiler:Languages\SerbianCyrillic.isl"
Name: "serbianlatin"; MessagesFile: "compiler:Languages\SerbianLatin.isl"
Name: "slovenian"; MessagesFile: "compiler:Languages\Slovenian.isl"
Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl"
Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl"
[Files]
Source: "..\Release_Binary\Starcraft\SNP_DirectIP.snp"; DestDir: "{code:BroodwarPath}\"; Flags: ignoreversion; Components: Binaries\BWAPI; Check: GetBroodwarPath
Source: "..\Release_Binary\Starcraft\SNP_DirectIP.snp"; DestDir: "{app}\Starcraft\"; Flags: ignoreversion; Components: Binaries\BWAPI
Source: "..\Release_Binary\Starcraft\bwapi-data\BWAPI.dll"; DestDir: "{code:BroodwarPath}\bwapi-data"; Flags: ignoreversion; Components: Binaries\BWAPI; Check: GetBroodwarPath
Source: "..\Release_Binary\Starcraft\bwapi-data\BWAPI.dll"; DestDir: "{app}\Starcraft\bwapi-data"; Flags: ignoreversion; Components: Binaries\BWAPI
Source: "..\Release_Binary\Starcraft\bwapi-data\bwapi.ini"; DestDir: "{code:BroodwarPath}\bwapi-data\"; Flags: ignoreversion; Components: Binaries\BWAPI; Check: GetBroodwarPath
Source: "..\Release_Binary\Starcraft\bwapi-data\bwapi.ini"; DestDir: "{app}\Starcraft\bwapi-data\"; Flags: ignoreversion; Components: Binaries\BWAPI
Source: "..\Release_Binary\Starcraft\bwapi-data\BWAPId.dll"; DestDir: "{code:BroodwarPath}\bwapi-data\"; Flags: ignoreversion; Components: Binaries\BWAPI; Check: GetBroodwarPath
Source: "..\Release_Binary\Starcraft\bwapi-data\BWAPId.dll"; DestDir: "{app}\Starcraft\bwapi-data\"; Flags: ignoreversion; Components: Binaries\BWAPI
Source: "..\Release_Binary\Starcraft\bwapi-data\data\Broodwar.map"; DestDir: "{code:BroodwarPath}\bwapi-data\data\"; Flags: ignoreversion; Components: Binaries\BWAPI; Check: GetBroodwarPath
Source: "..\Release_Binary\Starcraft\bwapi-data\data\Broodwar.map"; DestDir: "{app}\Starcraft\bwapi-data\data\"; Flags: ignoreversion; Components: Binaries\BWAPI
Source: "..\LICENSE"; DestDir: "{app}"; DestName: "LICENSE.txt"; Flags: ignoreversion
Source: "..\README.md"; DestDir: "{app}"; DestName: "README.txt"; Flags: ignoreversion isreadme
Source: "..\Release_Binary\vc_redist.x86.exe"; DestDir: "{app}"; Flags: ignoreversion deleteafterinstall
Source: "..\Release_Binary\include\*"; DestDir: "{app}\include\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Headers
Source: "..\Release_Binary\Chaoslauncher\*"; DestDir: "{app}\Chaoslauncher\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Chaoslauncher
Source: "..\Release_Binary\MPQdraft\*"; DestDir: "{app}\MPQDraft\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: MPQDraft
Source: "..\Release_Binary\AIModuleLoader\*"; DestDir: "{app}\AIModuleLoader\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Examples
Source: "..\Release_Binary\ExampleAIClient\*"; DestDir: "{app}\ExampleAIClient\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Examples
Source: "..\Release_Binary\ExampleAIModule\*"; DestDir: "{app}\ExampleAIModule\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Examples
Source: "..\Release_Binary\ExampleTournamentModule\*"; DestDir: "{app}\ExampleTournamentModule\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Examples
Source: "..\Release_Binary\ExampleProjects.sln"; DestDir: "{app}"; Flags: ignoreversion; Components: Library\Examples
Source: "..\Release_Binary\documentation\*"; DestDir: "{app}\documentation\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Documentation
Source: "..\Release_Binary\BWAPILIB\*"; DestDir: "{app}\BWAPILIB\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Headers
Source: "..\Release_Binary\BWAPIClient\*"; DestDir: "{app}\BWAPIClient\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Headers
Source: "..\Release_Binary\Shared\*"; DestDir: "{app}\Shared\"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Library\Headers
[Setup]
AppName=BWAPI
AppId={{5025BB16-9672-4C23-979D-2DC1B276CC5E}
LicenseFile=..\LICENSE
RestartIfNeededByRun=False
AppPublisherURL=http://bwapi.github.io
AppSupportURL=http://bwapi.github.io
AppUpdatesURL=http://bwapi.github.io
VersionInfoDescription=Brood War Application Programming Interface
VersionInfoProductName=BWAPI
MinVersion=0,5.01.2600
DefaultDirName={%USERPROFILE}\BWAPI
UsePreviousSetupType=False
UsePreviousTasks=False
UsePreviousLanguage=False
AlwaysShowGroupOnReadyPage=True
AlwaysShowDirOnReadyPage=True
UsePreviousGroup=False
Uninstallable=no
FlatComponentsList=False
WizardSmallImageFile=instSmall.bmp
SetupIconFile=instIcon.ico
WizardImageFile=instLarge.bmp
DisableProgramGroupPage=yes
AppVersion={#BWAPI_VERSION}
ShowLanguageDialog=no
AlwaysShowComponentsList=False
ShowComponentSizes=False
PrivilegesRequired=poweruser
LanguageDetectionMethod=locale
VersionInfoVersion={#BWAPI_VERSION}
VersionInfoTextVersion={#BWAPI_VERSION}
VersionInfoProductVersion={#BWAPI_VERSION}
VersionInfoProductTextVersion={#BWAPI_VERSION}
OutputBaseFilename=BWAPI_Setup
InternalCompressLevel=ultra
SolidCompression=True
Compression=lzma2/ultra
DisableReadyPage=True
[Components]
Name: "Binaries"; Description: "Binaries"; Types: custom full
Name: "Binaries\BWAPI"; Description: "BWAPI Binaries (Requires Starcraft: Broodwar)"; Types: full custom; Check: GetBroodwarPath
Name: "Binaries\Gateways"; Description: "The Abyss Battle.net Gateway"; Types: custom full
Name: "Binaries\vcredist"; Description: "Microsoft Visual C++ Redistributable for Visual Studio 2017 (x86) - 14.16.27027.1"; Types: custom full
Name: "Library"; Description: "Interface"; Types: custom full
Name: "Library\Documentation"; Description: "Documentation"; Types: custom full
Name: "Library\Examples"; Description: "Example Projects"; Types: custom full
Name: "Library\Headers"; Description: "Library & Header Files"; Types: custom full
Name: "Chaoslauncher"; Description: "Chaoslauncher (Plugin Loader) & Plugins"; Types: full custom
Name: "MPQDraft"; Description: "MPQDraft (Mod Manager & Plugin Loader)"; Types: custom full
[Run]
Filename: "{app}\Chaoslauncher\Chaoslauncher.exe"; WorkingDir: "{app}\Chaoslauncher\"; Flags: nowait postinstall skipifdoesntexist; Description: "Run Chaoslauncher"; Components: Chaoslauncher
Filename: "{app}\MPQdraft\MPQDraft.exe"; WorkingDir: "{app}\MPQdraft\"; Flags: nowait postinstall unchecked skipifdoesntexist; Description: "Run MPQDraft"; Components: MPQDraft
Filename: "{app}\vc_redist.x86.exe"; Parameters: "-quiet"; WorkingDir: "{app}"; Description: "Microsoft Visual C++ Redistributable for Visual Studio 2017 (x86)"; Components: Binaries\vcredist
[ThirdParty]
UseRelativePaths=True
[Types]
Name: "full"; Description: "Full Installation"
Name: "custom"; Description: "Custom Installation"; Flags: iscustom
[Registry]
Root: "HKCU32"; Subkey: "Software\Battle.net\Configuration"; ValueType: multisz; ValueName: "Battle.net gateways"; ValueData: "{code:InstallGateway|sc.theabyss.ru;+7;The Abyss (ICCUP);}"; Components: Binaries\Gateways
[Code]
var sBroodwarPath : String;
// Appends one string to another
procedure StrCat(var dest: String; const src: String);
begin
Insert(src, dest, Length(dest)+1);
end;
// A function that checks both HKCU and HKLM for 32-bit queries
function StormRegQueryValue(const CompanyName, ProductName, ValueName: String; var ResultStr: String): Boolean;
var
sSubkeyName : String;
begin
// Workaround: Determine the correct 32-bit subkey name because of INNO setup bug
sSubkeyName := 'SOFTWARE\'
StrCat(sSubkeyName, CompanyName);
StrCat(sSubkeyName, '\');
StrCat(sSubkeyName, ProductName);
Result := True;
if ( not RegQueryStringValue( HKCU, sSubkeyName, ValueName, ResultStr ) ) then
Result := RegQueryStringValue( HKLM, sSubkeyName, ValueName, ResultStr );
end;
// Ask the user to find the Starcraft: Broodwar directory
function PromptBroodwarPath() : Boolean;
var
sSubkey : String;
begin
Result := False;
if ( MsgBox('Setup was unable to locate the installation directory of Starcraft: Broodwar. This indicates that the game was not installed correctly. '#13#10#13#10'Important components of BWAPI will not function if the location is not correct. Do you wish to locate the Starcraft: Broodwar directory?', mbConfirmation, MB_YESNO) = IDYES ) then
begin
if ( BrowseForFolder('Please locate the Starcraft: Broodwar installation directory.', sBroodwarPath, False) ) then
begin
// Determine subkey due to a bug in INNO setup
sSubkey := 'SOFTWARE\Blizzard Entertainment\Starcraft';
// Write the InstallPath, first try HKLM (because Chaoslaunch complains), then HKCU
Result := True;
if ( not RegWriteStringValue( HKLM, sSubkey, 'InstallPath', sBroodwarPath) ) then
Result := RegWriteStringValue( HKCU, sSubkey, 'InstallPath', sBroodwarPath);
end;
end;
end;
// Get the location of the Starcraft folder.
function GetBroodwarPath(): Boolean;
begin
sBroodwarPath := '';
Result := True;
// Search for path
if ( not StormRegQueryValue('Blizzard Entertainment', 'Starcraft', 'InstallPath', sBroodwarPath) ) then
begin
// Ask user for the install path if it wasn't found
if ( not PromptBroodwarPath() ) then
begin
MsgBox('Setup was unable to properly locate and/or store the location of the Starcraft: Broodwar installation directory. Key components of BWAPI may not be installed.', mbError, MB_OK);
Result := False;
end;
end;
end;
// Returns the path
function BroodwarPath(Param: String) : String;
begin
Result := sBroodwarPath;
end;
// Returns the Nth string (0-based index) given a null-terminated set of strings
function GetStringAt(S: String; N: Integer) : String;
var
idx : Integer;
sCurrent : String;
begin
// init
idx := 0;
sCurrent := Copy(S, 1, Length(S));
// algo
while ( N > 0 ) do
begin
N := N - 1;
idx := Pos(#0,sCurrent);
idx := idx + 1;
sCurrent := Copy(sCurrent, idx, Length(sCurrent));
end
idx := Pos(#0,sCurrent);
Result := Copy(sCurrent, 1, idx);
end;
// Install the ICCUP gateway
function InstallGateway(Param: String) : String;
var
sDefaultGateways, sGateways : String;
sTmp : String;
idx : Integer;
begin
// Parse parameters
StringChangeEx(Param, ';', #0, True);
// Assign defaults
sDefaultGateways := '1000'#0'01'#0'uswest.battle.net'#0'8'#0'U.S. West'#0'useast.battle.net'#0'6'#0'U.S. East'#0'asia.battle.net'#0'-9'#0'Asia'#0'europe.battle.net'#0'-1'#0'Europe'#0;
sGateways := sDefaultGateways;
// Retrieve the existing gateways string (if any)
RegQueryMultiStringValue( HKEY_CURRENT_USER_32, 'SOFTWARE\Battle.net\Configuration', 'Battle.net gateways', sGateways );
// Check validity of first component
sTmp := GetStringAt(sGateways, 0);
if ( Length(sTmp) = 0 ) then // (validity not complete, but should be good)
sGateways := sDefaultGateways;
// Check validity of second component
sTmp := GetStringAt(sGateways, 1);
if ( Length(sTmp) = 0 ) then // (validity not complete, but should be good)
sGateways := sDefaultGateways;
// Search for existing entry
idx := 2;
repeat
sTmp := GetStringAt(sGateways, idx);
idx := idx + 3;
//MsgBox(sTmp, mbInformation, MB_OK);
until (CompareText(Trim(sTmp), Trim(GetStringAt(Param,0))) = 0) OR (Length(sTmp) = 0);
// If desired server was not found
if ( Length(sTmp) = 0 ) then
begin
// Append it to the existing gateways
StrCat(sGateways, Param);
end
Result := sGateways;
end;