1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00
Files
OpenRCT2/distribution/windows/install.nsi
2025-07-23 06:47:29 -03:00

583 lines
18 KiB
NSIS

Unicode True
!define APPNAME "OpenRCT2"
!define APPVERSION "${APPV_MAIN}${APPV_EXTRA}"
!define APPVERSIONINTERNAL "${APPV_MAIN}.0"
!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}"
!define APPURLLINK "https://openrct2.io"
!define OPENRCT2_EXE "openrct2.exe"
!define OPENRCT2_COM "openrct2.com"
!if "${PLATFORM}" == "Win32"
!define APPBITS 32
!define APPARCH "win32"
InstallDir "$PROGRAMFILES32\OpenRCT2\"
!else
!define APPBITS 64
!define APPARCH "win64"
InstallDir "$PROGRAMFILES64\OpenRCT2\"
!endif
; Define root variable relative to installer
!define PATH_ROOT "..\..\"
!define BINARY_DIR "${PATH_ROOT}bin"
!define MUI_ICON "${PATH_ROOT}resources\logo\icon.ico"
!define MUI_UNICON "${PATH_ROOT}resources\logo\icon.ico"
!define MUI_WELCOMEFINISHPAGE_BITMAP "welcome.bmp"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "top.bmp"
BrandingText "$(lsBrandingText)"
SetCompressor LZMA
; Version Info
VIProductVersion "${APPVERSIONINTERNAL}"
VIAddVersionKey "ProductVersion" "${APPVERSION}"
VIAddVersionKey "InternalName" "InstOpenRCT2-${APPARCH}"
VIAddVersionKey "FileVersion" "${APPVERSION}-${APPARCH}"
VIAddVersionKey "LegalCopyright" " "
; Main Install settings
Name "${APPNAMEANDVERSION}"
; NOTE: Keep trailing backslash!
InstallDirRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Install Folder"
!ifndef OUTFILE
!define OUTFILE "openrct2-install.exe"
!endif
OutFile "${OUTFILE}"
CRCCheck force
ShowInstDetails show
ShowUninstDetails show
RequestExecutionLevel user
Var SHORTCUTS
; Modern interface settings
!include "MUI2.nsh"
!include "InstallOptions.nsh"
!include "WinVer.nsh"
!include "x64.nsh"
!include "UAC.nsh"
!define MUI_ABORTWARNING
!define MUI_WELCOMEPAGE_TITLE_3LINES
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "..\..\licence.txt"
!define MUI_COMPONENTSPAGE_SMALLDESC
!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE DoNotInstallInRCT2Folder
!insertmacro MUI_PAGE_DIRECTORY
ManifestDPIAware true
;Start Menu Folder Page Configuration
!define MUI_STARTMENUPAGE_DEFAULTFOLDER $SHORTCUTS
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKEY_LOCAL_MACHINE"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Shortcut Folder"
!insertmacro MUI_PAGE_STARTMENU "OpenRCT2" $SHORTCUTS
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_TITLE_3LINES
!define MUI_FINISHPAGE_RUN_TEXT "$(lsRunNow)"
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
!define MUI_FINISHPAGE_LINK "$(lsFinishPageLink)"
!define MUI_FINISHPAGE_LINK_LOCATION "${APPURLLINK}"
!define MUI_FINISHPAGE_NOREBOOTSUPPORT
!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\readme.txt"
!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
!define MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT DisableBack
!insertmacro MUI_PAGE_FINISH
!define MUI_PAGE_HEADER_TEXT "$(lsUninstall)"
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
; Set languages (first is default language). Other languages are sorted by ISO code.
; Only specify languages for which we actually have translations, because otherwise strings will show up blank.
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Arabic"
!insertmacro MUI_LANGUAGE "Catalan"
!insertmacro MUI_LANGUAGE "Czech"
;!insertmacro MUI_LANGUAGE "Danish"
!insertmacro MUI_LANGUAGE "German"
;!insertmacro MUI_LANGUAGE "Esperanto"
!insertmacro MUI_LANGUAGE "Spanish"
!insertmacro MUI_LANGUAGE "Finnish"
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "Galician"
!insertmacro MUI_LANGUAGE "Hungarian"
!insertmacro MUI_LANGUAGE "Italian"
;!insertmacro MUI_LANGUAGE "Japanese"
!insertmacro MUI_LANGUAGE "Korean"
;!insertmacro MUI_LANGUAGE "Norwegian"
!insertmacro MUI_LANGUAGE "Dutch"
;!insertmacro MUI_LANGUAGE "Polish"
!insertmacro MUI_LANGUAGE "PortugueseBR"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Swedish"
;!insertmacro MUI_LANGUAGE "Turkish"
;!insertmacro MUI_LANGUAGE "Ukrainian"
;!insertmacro MUI_LANGUAGE "Vietnamese"
!insertmacro MUI_LANGUAGE "SimpChinese"
;!insertmacro MUI_LANGUAGE "TradChinese"
!insertmacro MUI_RESERVEFILE_LANGDLL
!include "language\install_en.nsi"
!include "language\install_ar.nsi"
!include "language\install_ca.nsi"
!include "language\install_cs.nsi"
!include "language\install_de.nsi"
!include "language\install_es.nsi"
!include "language\install_fi.nsi"
!include "language\install_fr.nsi"
!include "language\install_gl.nsi"
!include "language\install_hu.nsi"
!include "language\install_it.nsi"
!include "language\install_ko.nsi"
!include "language\install_nl.nsi"
!include "language\install_pt.nsi"
!include "language\install_ru.nsi"
!include "language\install_sv.nsi"
!include "language\install_zh_cn.nsi"
!macro Init thing
uac_tryagain:
!insertmacro UAC_RunElevated
${Switch} $0
${Case} 0
${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done
${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on
${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user
MessageBox mb_YesNo|mb_IconExclamation|mb_TopMost|mb_SetForeground "$(lsUACRequiresElevation)" /SD IDNO IDYES uac_tryagain IDNO 0
${EndIf}
;fall-through and die
${Case} 1223
MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(lsUACError1223)"
Quit
${Case} 1062
MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(lsUACError1062)"
Quit
${Default}
MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "$(lsUACErrorDefault)"
Quit
${EndSwitch}
SetShellVarContext all
!macroend
Function PageFinishRun
!insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\${OPENRCT2_EXE}" "" "" ""
FunctionEnd
;--------------------------------------------------------------
; (Core) OpenRCT2 install section. Copies all internal game data
Section "!OpenRCT2" Section1
; Make sure to be upgraded OpenRCT2 is not running
Call CheckOpenRCT2Running
; Overwrite files by default, but don't complain on failure
SetOverwrite try
SetShellVarContext all
; Copy data files. Clear out the old dir first, to ensure upgrades do not result in old objects sticking around.
RMDir /r "$INSTDIR\data"
SetOutPath "$INSTDIR\data\"
File /r ${PATH_ROOT}bin\data\*
; Copy the rest of the stuff
SetOutPath "$INSTDIR\"
; Copy text files
File ..\changelog.txt
Push "$INSTDIR\changelog.txt"
Call unix2dos
File ..\..\licence.txt
Push "$INSTDIR\licence.txt"
Call unix2dos
File ..\readme.txt
Push "$INSTDIR\readme.txt"
Call unix2dos
File ..\..\contributors.md
Push "$INSTDIR\contributors.md"
Call unix2dos
File ..\..\PRIVACY.md
Push "$INSTDIR\PRIVACY.md"
Call unix2dos
File ..\scripting.md
Push "$INSTDIR\scripting.md"
Call unix2dos
File ..\openrct2.d.ts
Push "$INSTDIR\openrct2.d.ts"
Call unix2dos
; Copy executable
File /oname=${OPENRCT2_EXE} ${BINARY_DIR}\${OPENRCT2_EXE}
File /oname=${OPENRCT2_COM} ${BINARY_DIR}\${OPENRCT2_COM}
; Create the Registry Entries
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Comments" "Visit ${APPURLLINK}"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "DisplayIcon" "$INSTDIR\${OPENRCT2_EXE},0"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "DisplayName" "OpenRCT2 ${APPVERSION}"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "DisplayVersion" "${APPVERSION}"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "HelpLink" "${APPURLLINK}"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Install Folder" "$INSTDIR"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Publisher" "OpenRCT2"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Shortcut Folder" "$SHORTCUTS"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "UninstallString" "$INSTDIR\uninstall.exe"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "URLInfoAbout" "${APPURLLINK}"
; This key sets the Version DWORD that new installers will check against
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Version" "${APPVERSIONINTERNAL}"
!insertmacro MUI_STARTMENU_WRITE_BEGIN "OpenRCT2"
CreateShortCut "$DESKTOP\OpenRCT2.lnk" "$INSTDIR\${OPENRCT2_EXE}"
CreateDirectory "$SMPROGRAMS\$SHORTCUTS"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\OpenRCT2.lnk" "$INSTDIR\${OPENRCT2_EXE}"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\OpenRCT2-verbose.lnk" "%WINDIR%\System32\cmd.exe" '/C "$INSTDIR\${OPENRCT2_COM}" --verbose'
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Uninstall.lnk" "$INSTDIR\uninstall.exe"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Readme.lnk" "$INSTDIR\Readme.txt"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Changelog.lnk" "$INSTDIR\Changelog.txt"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Contributors.lnk" "$INSTDIR\contributors.md"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Privacy Policy.lnk" "$INSTDIR\PRIVACY.md"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
;-------------------------------------------
; Install the uninstaller (option is hidden)
Section -FinishSection
WriteUninstaller "$INSTDIR\uninstall.exe"
SectionEnd
; Modern install component descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${Section1} "$(lsComponentDescription)"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;-----------------------------------------------
; Uninstall section, deletes all installed files
Section "Uninstall"
SetShellVarContext all
; Remove from registry...
!insertmacro MUI_STARTMENU_GETFOLDER "OpenRCT2" $SHORTCUTS
ReadRegStr $SHORTCUTS HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Shortcut Folder"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2"
; Delete self
Delete "$INSTDIR\uninstall.exe"
; Delete Shortcuts
Delete "$DESKTOP\OpenRCT2.lnk"
Delete "$SMPROGRAMS\$SHORTCUTS\OpenRCT2.lnk"
Delete "$SMPROGRAMS\$SHORTCUTS\OpenRCT2-verbose.lnk"
Delete "$SMPROGRAMS\$SHORTCUTS\Uninstall.lnk"
Delete "$SMPROGRAMS\$SHORTCUTS\Readme.lnk"
Delete "$SMPROGRAMS\$SHORTCUTS\Changelog.lnk"
Delete "$SMPROGRAMS\$SHORTCUTS\Contributors.lnk"
Delete "$SMPROGRAMS\$SHORTCUTS\Privacy Policy.lnk"
; Clean up OpenRCT2 dir
Delete "$INSTDIR\changelog.txt"
Delete "$INSTDIR\licence.txt"
Delete "$INSTDIR\readme.txt"
Delete "$INSTDIR\contributors.md"
Delete "$INSTDIR\PRIVACY.md"
Delete "$INSTDIR\scripting.md"
Delete "$INSTDIR\openrct2.d.ts"
Delete "$INSTDIR\${OPENRCT2_EXE}"
Delete "$INSTDIR\${OPENRCT2_COM}"
Delete "$INSTDIR\INSTALL.LOG"
; Data files
RMDir /r "$INSTDIR\data"
; Remove remaining directories
RMDir "$SMPROGRAMS\$SHORTCUTS"
RMDir "$INSTDIR"
SectionEnd
;-------------------------------------------------------------------------------
; Determine windows version, returns "win9x" if Win9x/Me/2000/XP SP2- or "winnt" for the rest on the stack
Function GetWindowsVersion
ClearErrors
StrCpy $R0 "win9x"
${If} ${RunningX64}
goto WinNT
${EndIf}
${If} ${IsNT}
${If} ${IsWinXP}
${AndIf} ${AtLeastServicePack} 3
${OrIf} ${AtLeastWin2003}
GoTo WinNT
${EndIf}
${EndIf}
GoTo Done
WinNT:
StrCpy $R0 "winnt"
Done:
Push $R0
FunctionEnd
;-------------------------------------------------------------------------------
; Check whether we're not running an installer for 64 bits on 32 bits and vice versa
Function CheckProcessorArchitecture
ClearErrors
${If} ${RunningX64}
IntCmp ${APPBITS} 64 Done 0
MessageBox MB_YESNO|MB_ICONINFORMATION "$(ls32bitVersionOn64bitOS)" IDYES Done IDNO Abort
${Else}
IntCmp ${APPBITS} 64 0 Done
MessageBox MB_YESNO|MB_ICONSTOP "$(ls64bitVersionOn32bitOS)" IDYES Done IDNO Abort
${EndIf}
GoTo Done
Abort:
Quit
Done:
FunctionEnd
;-------------------------------------------------------------------------------
; Check whether we're not running an installer for NT on 9x and vice versa
Function CheckWindowsVersion
Call GetWindowsVersion
Pop $R0
StrCmp $R0 "win9x" 0 WinNT
ClearErrors
StrCmp ${APPARCH} "win9x" Done 0
MessageBox MB_YESNO|MB_ICONSTOP "$(lsNewWindowsVersionOnOldWindows)" IDYES Done IDNO Abort
GoTo Done
WinNT:
ClearErrors
StrCmp ${APPARCH} "win9x" 0 Done
MessageBox MB_YESNO|MB_ICONEXCLAMATION "$(lsOldWindowsVersionOnNewWindows)" IDYES Done IDNO Abort
Abort:
Quit
Done:
FunctionEnd
;-------------------------------------------------------------------------------
; Check whether OpenRCT2 is running
Function CheckOpenRCT2Running
IfFileExists "$INSTDIR\${OPENRCT2_EXE}" 0 Done
Retry:
FindProcDLL::FindProc "${OPENRCT2_EXE}"
Pop $R0
IntCmp $R0 1 0 Done
ClearErrors
Delete "$INSTDIR\${OPENRCT2_EXE}"
IfErrors 0 Done
ClearErrors
MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "$(lsOpenRCT2IsRunning)" IDRETRY Retry
Abort
Done:
FunctionEnd
;-------------------------------------------------------------------------------
; strips all CRs
; and then converts all LFs into CRLFs
; (this is roughly equivalent to "cat file | dos2unix | unix2dos")
;
; usage:
; Push "infile"
; Call unix2dos
;
; beware that this function destroys $0 $1 $2
Function unix2dos
ClearErrors
Pop $2
Rename $2 $2.U2D
FileOpen $1 $2 w
FileOpen $0 $2.U2D r
Push $2 ; save name for deleting
IfErrors unix2dos_done
; $0 = file input (opened for reading)
; $1 = file output (opened for writing)
unix2dos_loop:
; read a byte (stored in $2)
FileReadByte $0 $2
IfErrors unix2dos_done ; EOL
; skip CR
StrCmp $2 13 unix2dos_loop
; if LF write an extra CR
StrCmp $2 10 unix2dos_cr unix2dos_write
unix2dos_cr:
FileWriteByte $1 13
unix2dos_write:
; write byte
FileWriteByte $1 $2
; read next byte
Goto unix2dos_loop
unix2dos_done:
; close files
FileClose $0
FileClose $1
; delete original
Pop $0
Delete $0.U2D
FunctionEnd
;-----------------------------------------------------------------------------------
; Properly compare 2 versions
; syntax:
; ${VersionCompare} "[Version1]" "[Version2]" $var
; output:
; $var=0 Versions are equal
; $var=1 Version1 is newer
; $var=2 Version2 is newer
Function VersionCompare
!define VersionCompare `!insertmacro VersionCompareCall`
!macro VersionCompareCall _VER1 _VER2 _RESULT
Push `${_VER1}`
Push `${_VER2}`
Call VersionCompare
Pop ${_RESULT}
!macroend
Exch $1
Exch
Exch $0
Exch
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
begin:
StrCpy $2 -1
IntOp $2 $2 + 1
StrCpy $3 $0 1 $2
StrCmp $3 '' +2
StrCmp $3 '.' 0 -3
StrCpy $4 $0 $2
IntOp $2 $2 + 1
StrCpy $0 $0 '' $2
StrCpy $2 -1
IntOp $2 $2 + 1
StrCpy $3 $1 1 $2
StrCmp $3 '' +2
StrCmp $3 '.' 0 -3
StrCpy $5 $1 $2
IntOp $2 $2 + 1
StrCpy $1 $1 '' $2
StrCmp $4$5 '' equal
StrCpy $6 -1
IntOp $6 $6 + 1
StrCpy $3 $4 1 $6
StrCmp $3 '0' -2
StrCmp $3 '' 0 +2
StrCpy $4 0
StrCpy $7 -1
IntOp $7 $7 + 1
StrCpy $3 $5 1 $7
StrCmp $3 '0' -2
StrCmp $3 '' 0 +2
StrCpy $5 0
StrCmp $4 0 0 +2
StrCmp $5 0 begin newer2
StrCmp $5 0 newer1
IntCmp $6 $7 0 newer1 newer2
StrCpy $4 '1$4'
StrCpy $5 '1$5'
IntCmp $4 $5 begin newer2 newer1
equal:
StrCpy $0 0
goto end
newer1:
StrCpy $0 1
goto end
newer2:
StrCpy $0 2
end:
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
FunctionEnd
Var OLDVERSION
Var UninstallString
;-----------------------------------------------------------------------------------
; NSIS Initialize function, determine if we are going to install/upgrade or uninstall
Function .onInit
!insertmacro Init "installer"
StrCpy $SHORTCUTS "OpenRCT2"
SectionSetFlags 0 17
ShowWelcomeMessage:
IfSilent FinishCallback
ReadRegStr $R8 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Version"
IfErrors FinishCallback
WelcomeToSetup:
; An older version was found. Let's let the user know there's an upgrade that will take place.
ReadRegStr $OLDVERSION HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "DisplayVersion"
; Gets the older version then displays it in a message box
MessageBox MB_OK|MB_ICONINFORMATION "$(lsUpgradeNotice)"
Goto FinishCallback
FinishCallback:
ClearErrors
; Call CheckProcessorArchitecture
; Call CheckWindowsVersion
FunctionEnd
Function un.onInit
!insertmacro Init "uninstaller"
FunctionEnd
Function DoNotInstallInRCT2Folder
IfFileExists "$INSTDIR\Data\g1.dat" datag1exists datag1notexists
datag1exists:
MessageBox MB_OK|MB_ICONSTOP "$(lsCannotInstallToRCT2Dir)"
Abort
datag1notexists:
IfFileExists "$INSTDIR\Assets\g1.dat" assetsg1exists assetsg1notexists
assetsg1exists:
MessageBox MB_OK|MB_ICONSTOP "$(lsCannotInstallToRCTClassicDir)"
Abort
assetsg1notexists:
FunctionEnd
; eof