Files
assaultcube-/source/vcpp/buildEnv/ac.nsi
T

554 lines
16 KiB
NSIS

!include MUI.nsh
!include Sections.nsh
!include FileFunc.nsh
## TOOLS
# Open Browser Window
!macro openLink un
# Uses $0
Function ${un}openLinkNewWindow
Push $3
Push $2
Push $1
Push $0
ReadRegStr $0 HKCR "http\shell\open\command" ""
# Get browser path
DetailPrint $0
StrCpy $2 '"'
StrCpy $1 $0 1
StrCmp $1 $2 +2 # if path is not enclosed in " look for space as final char
StrCpy $2 ' '
StrCpy $3 1
loop:
StrCpy $1 $0 1 $3
DetailPrint $1
StrCmp $1 $2 found
StrCmp $1 "" found
IntOp $3 $3 + 1
Goto loop
found:
StrCpy $1 $0 $3
StrCmp $2 " " +2
StrCpy $1 '$1"'
Pop $0
Exec '$1 $0'
Pop $1
Pop $2
Pop $3
FunctionEnd
!macroend
!insertmacro openLink ""
!insertmacro openLink "un."
; CONFIGURATION
; general
SetCompressor /SOLID lzma
!define CURPATH ".\" ; must include the installer graphics and the AC_NEWVERSIONDIR directory
!define AC_FULLVERSIONINT "1.3.0.0"
!define AC_FULLVERSION "v${AC_FULLVERSIONINT}"
!define AC_SHORTNAME "AssaultCube ${AC_FULLVERSIONINT}"
!define AC_FULLNAME "AssaultCube ${AC_FULLVERSIONINT}"
!define AC_URLPROTOCOL "assaultcube"
!define AC_MAJORVERSIONINT 1
!define AC_MINORVERSIONINT 3
!define AC_NEWVERSIONDIR "AC" ; directory with prepared new AC version
; path to profile folder in "MYDOCUMENTS" directory, should be the same as in assaultcube.bat
!define AC_PROFILEPATH "My Games\AssaultCube\v${AC_MAJORVERSIONINT}.${AC_MINORVERSIONINT}"
Name "${AC_SHORTNAME}"
VAR StartMenuFolder
!define AC_STARTMENUFOLDER "$SMPROGRAMS\$StartMenuFolder"
OutFile "AssaultCube_v1.3.0.0_LockdownEdition.exe"
InstallDir "$PROGRAMFILES\${AC_SHORTNAME}"
InstallDirRegKey HKLM "Software\${AC_SHORTNAME}" ""
!define ARP "Software\Microsoft\Windows\CurrentVersion\Uninstall\${AC_SHORTNAME}"
RequestExecutionLevel admin ; require admin in Vista/7
; Variables
Var EstimatedSize
Var Day
Var Month
Var Year
Var DoW
Var Hour
Var Minute
Var Second
Function LeaveDirectory
IfFileExists $INSTDIR\assaultcube.bat 0 true
MessageBox MB_YESNO|MB_ICONQUESTION \
"The folder $INSTDIR already exists. \
$\nThe previous AssaultCube version in this folder will be uninstalled if you install the new version here. \
$\n$\nDo you want to continue? Click 'No' to install AssaultCube in a different folder." \
IDYES true IDNO false
true:
ClearErrors
ExecWait '$INSTDIR\Uninstall.exe /S _?=$INSTDIR' ; wait until previous AC installation will be uninstalled
Goto next
false:
Abort
next:
FunctionEnd
; Interface Configuration
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "${CURPATH}\header.bmp" ; optional
; icon
XPStyle on
Icon "${CURPATH}\icon.ico"
UninstallIcon "${CURPATH}\icon.ico"
!define MUI_ICON "${CURPATH}\icon.ico"
!define MUI_UNICON "${CURPATH}\icon.ico"
; Pages
Page custom WelcomePage
!insertmacro MUI_PAGE_LICENSE "${CURPATH}\mui_page_license.txt"
!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE LeaveDirectory
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${AC_SHORTNAME}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "start_menu"
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
!insertmacro MUI_PAGE_INSTFILES
Page custom FinishPage
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
; Custom Welcome Page
!define WS_CHILD 0x40000000
!define WS_VISIBLE 0x10000000
!define WS_DISABLED 0x08000000
!define WS_CLIPSIBLINGS 0x04000000
!define WS_MAXIMIZE 0x01000000
!define WS_VSCROLL 0x00200000
!define WS_HSCROLL 0x00100000
!define WS_GROUP 0x00020000
!define WS_TABSTOP 0x00010000
!define ES_LEFT 0x00000000
!define ES_CENTER 0x00000001
!define ES_RIGHT 0x00000002
!define ES_MULTILINE 0x00000004
!define ES_UPPERCASE 0x00000008
!define ES_LOWERCASE 0x00000010
!define ES_PASSWORD 0x00000020
!define ES_AUTOVSCROLL 0x00000040
!define ES_AUTOHSCROLL 0x00000080
!define ES_NOHIDESEL 0x00000100
!define ES_OEMCONVERT 0x00000400
!define ES_READONLY 0x00000800
!define ES_WANTRETURN 0x00001000
!define ES_NUMBER 0x00002000
!define SS_LEFT 0x00000000
!define SS_CENTER 0x00000001
!define SS_RIGHT 0x00000002
!define SS_ICON 0x00000003
!define SS_BLACKRECT 0x00000004
!define SS_GRAYRECT 0x00000005
!define SS_WHITERECT 0x00000006
!define SS_BLACKFRAME 0x00000007
!define SS_GRAYFRAME 0x00000008
!define SS_WHITEFRAME 0x00000009
!define SS_USERITEM 0x0000000A
!define SS_SIMPLE 0x0000000B
!define SS_LEFTNOWORDWRAP 0x0000000C
!define SS_OWNERDRAW 0x0000000D
!define SS_BITMAP 0x0000000E
!define SS_ENHMETAFILE 0x0000000F
!define SS_ETCHEDHORZ 0x00000010
!define SS_ETCHEDVERT 0x00000011
!define SS_ETCHEDFRAME 0x00000012
!define SS_TYPEMASK 0x0000001F
!define SS_REALSIZECONTROL 0x00000040
!define SS_NOPREFIX 0x00000080
!define SS_NOTIFY 0x00000100
!define SS_CENTERIMAGE 0x00000200
!define SS_RIGHTJUST 0x00000400
!define SS_REALSIZEIMAGE 0x00000800
!define SS_SUNKEN 0x00001000
!define SS_EDITCONTROL 0x00002000
!define SS_ENDELLIPSIS 0x00004000
!define SS_PATHELLIPSIS 0x00008000
!define SS_WORDELLIPSIS 0x0000C000
!define SS_ELLIPSISMASK 0x0000C000
!define BS_PUSHBUTTON 0x00000000
!define BS_DEFPUSHBUTTON 0x00000001
!define BS_CHECKBOX 0x00000002
!define BS_AUTOCHECKBOX 0x00000003
!define BS_RADIOBUTTON 0x00000004
!define BS_3STATE 0x00000005
!define BS_AUTO3STATE 0x00000006
!define BS_GROUPBOX 0x00000007
!define BS_USERBUTTON 0x00000008
!define BS_AUTORADIOBUTTON 0x00000009
!define BS_PUSHBOX 0x0000000A
!define BS_OWNERDRAW 0x0000000B
!define BS_TYPEMASK 0x0000000F
!define BS_LEFTTEXT 0x00000020
!define BS_TEXT 0x00000000
!define BS_ICON 0x00000040
!define BS_BITMAP 0x00000080
!define BS_LEFT 0x00000100
!define BS_RIGHT 0x00000200
!define BS_CENTER 0x00000300
!define BS_TOP 0x00000400
!define BS_BOTTOM 0x00000800
!define BS_VCENTER 0x00000C00
!define BS_PUSHLIKE 0x00001000
!define BS_MULTILINE 0x00002000
!define BS_NOTIFY 0x00004000
!define BS_FLAT 0x00008000
!define BS_RIGHTBUTTON ${BS_LEFTTEXT}
!define LR_DEFAULTCOLOR 0x0000
!define LR_MONOCHROME 0x0001
!define LR_COLOR 0x0002
!define LR_COPYRETURNORG 0x0004
!define LR_COPYDELETEORG 0x0008
!define LR_LOADFROMFILE 0x0010
!define LR_LOADTRANSPARENT 0x0020
!define LR_DEFAULTSIZE 0x0040
!define LR_VGACOLOR 0x0080
!define LR_LOADMAP3DCOLORS 0x1000
!define LR_CREATEDIBSECTION 0x2000
!define LR_COPYFROMRESOURCE 0x4000
!define LR_SHARED 0x8000
!define IMAGE_BITMAP 0
!define IMAGE_ICON 1
!define IMAGE_CURSOR 2
!define IMAGE_ENHMETAFILE 3
Var DIALOG
Var HEADLINE
Var TEXT
Var IMAGECTL
Var IMAGE
; Version Info
VIProductVersion "${AC_FULLVERSIONINT}"
VIAddVersionKey "ProductName" "${AC_SHORTNAME}"
VIAddVersionKey "CompanyName" "Rabid Viper Productions"
VIAddVersionKey "LegalCopyright" "Copyright © Rabid Viper Productions"
VIAddVersionKey "FileDescription" "AssaultCube is a FREE, multiplayer, first-person shooter game, based on the CUBE engine."
VIAddVersionKey "FileVersion" "${AC_FULLVERSIONINT}"
VIAddVersionKey "ProductVersion" "${AC_FULLVERSIONINT}"
Function .onInit
InitPluginsDir
File /oname=$TEMP\welcome.bmp "${CURPATH}\welcome.bmp"
FunctionEnd
Function .onInstSuccess
IfSilent skipopenlink
StrCpy $0 "http://assault.cubers.net/releasenotes/v${AC_MAJORVERSIONINT}.${AC_MINORVERSIONINT}/"
Call openLinkNewWindow
skipopenlink:
FunctionEnd
Function un.onUninstSuccess
IfSilent skipopenlink
StrCpy $0 "http://assault.cubers.net/uninstallnotes/v${AC_MAJORVERSIONINT}.${AC_MINORVERSIONINT}/"
Call un.openLinkNewWindow
skipopenlink:
FunctionEnd
Function HideControls
LockWindow on
GetDlgItem $0 $HWNDPARENT 1028
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1256
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1035
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1037
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1038
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1039
ShowWindow $0 ${SW_HIDE}
GetDlgItem $0 $HWNDPARENT 1045
ShowWindow $0 ${SW_NORMAL}
LockWindow off
FunctionEnd
Function ShowControls
LockWindow on
GetDlgItem $0 $HWNDPARENT 1028
ShowWindow $0 ${SW_NORMAL}
GetDlgItem $0 $HWNDPARENT 1256
ShowWindow $0 ${SW_NORMAL}
GetDlgItem $0 $HWNDPARENT 1035
ShowWindow $0 ${SW_NORMAL}
GetDlgItem $0 $HWNDPARENT 1037
ShowWindow $0 ${SW_NORMAL}
GetDlgItem $0 $HWNDPARENT 1038
ShowWindow $0 ${SW_NORMAL}
GetDlgItem $0 $HWNDPARENT 1039
ShowWindow $0 ${SW_NORMAL}
GetDlgItem $0 $HWNDPARENT 1045
ShowWindow $0 ${SW_HIDE}
LockWindow off
FunctionEnd
Function WelcomePage
nsDialogs::Create /NOUNLOAD 1044
Pop $DIALOG
nsDialogs::CreateControl /NOUNLOAD STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 0 0 109u 193u ""
Pop $IMAGECTL
StrCpy $0 $TEMP\welcome.bmp
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE
nsDialogs::CreateControl /NOUNLOAD STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 10u -130u 20u "Welcome to the AssaultCube Setup Wizard"
Pop $HEADLINE
SendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0
nsDialogs::CreateControl /NOUNLOAD STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 32u -130u -32u "This wizard will guide you through the installation of AssaultCube ${AC_FULLVERSIONINT}.$\r$\n$\r$\nClick Next to continue."
Pop $TEXT
SetCtlColors $DIALOG "" 0xffffff
SetCtlColors $HEADLINE "" 0xffffff
SetCtlColors $TEXT "" 0xffffff
Call HideControls
nsDialogs::Show
Call ShowControls
System::Call gdi32::DeleteObject(i$IMAGE)
# MessageBox MB_OK "This is a TEST BUILD, do NOT redistribute this file! This is NOT a final release!"
FunctionEnd
Function FinishPage
nsDialogs::Create /NOUNLOAD 1044
Pop $DIALOG
nsDialogs::CreateControl /NOUNLOAD STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 0 0 109u 193u ""
Pop $IMAGECTL
StrCpy $0 $TEMP\welcome.bmp
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE
nsDialogs::CreateControl /NOUNLOAD STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 10u -130u 20u "Completing the AssaultCube Setup Wizard"
Pop $HEADLINE
SendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0
nsDialogs::CreateControl /NOUNLOAD STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 32u -130u -32u "AssaultCube has been installed on your computer.$\r$\n$\r$\nClick Finish to close this wizard."
Pop $TEXT
SetCtlColors $DIALOG "" 0xffffff
SetCtlColors $HEADLINE "" 0xffffff
SetCtlColors $TEXT "" 0xffffff
Call HideControls
nsDialogs::Show
Call ShowControls
System::Call gdi32::DeleteObject(i$IMAGE)
FunctionEnd
; Installer Sections
Section "AssaultCube ${AC_FULLVERSIONINT}" AC
SectionIn RO
SetOutPath "$INSTDIR"
File /r "${AC_NEWVERSIONDIR}\*.*"
WriteRegStr HKLM "Software\${AC_SHORTNAME}" "" $INSTDIR
WriteRegStr HKLM "Software\${AC_SHORTNAME}" "version" ${AC_FULLVERSIONINT}
; Determine installed size (will include all files, even user placed in $INSTDIR!)
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
IntFmt $EstimatedSize "0x%08X" $0
${GetTime} "" "LS" $Day $Month $Year $DoW $Hour $Minute $Second
; Create uninstaller
WriteRegStr HKLM "${ARP}" "DisplayName" "${AC_FULLNAME}"
WriteRegStr HKLM "${ARP}" "Publisher" "Rabid Viper Productions"
WriteRegStr HKLM "${ARP}" "InstallDate" "$Year$Month$Day"
WriteRegStr HKLM "${ARP}" "InstallLocation" "$INSTDIR"
WriteRegStr HKLM "${ARP}" "UninstallString" "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM "${ARP}" "DisplayIcon" "$INSTDIR\docs\images\favicon.ico"
WriteRegStr HKLM "${ARP}" "HelpLink" "$INSTDIR\README.html"
WriteRegStr HKLM "${ARP}" "URLInfoAbout" "http://assault.cubers.net"
WriteRegStr HKLM "${ARP}" "URLUpdateInfo" "http://assault.cubers.net/download.html"
WriteRegStr HKLM "${ARP}" "DisplayVersion" "${AC_FULLVERSIONINT}"
WriteRegDWORD HKLM "${ARP}" "EstimatedSize" "$EstimatedSize"
WriteRegDWORD HKLM "${ARP}" "VersionMajor" ${AC_MAJORVERSIONINT}
WriteRegDWORD HKLM "${ARP}" "VersionMinor" ${AC_MINORVERSIONINT}
WriteRegDWORD HKLM "${ARP}" "NoModify" 1
WriteRegDWORD HKLM "${ARP}" "NoRepair" 1
WriteUninstaller "$INSTDIR\Uninstall.exe"
; create shortcuts
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetShellVarContext current
StrCpy $0 $DOCUMENTS
SetShellVarContext all
CreateDirectory "${AC_STARTMENUFOLDER}"
CreateShortCut "${AC_STARTMENUFOLDER}\${AC_SHORTNAME}.lnk" "$INSTDIR\assaultcube.bat" "" "$INSTDIR\docs\images\favicon.ico" 0 SW_SHOWMINIMIZED
CreateShortCut "${AC_STARTMENUFOLDER}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\docs\images\favicon.ico" 0
CreateShortCut "${AC_STARTMENUFOLDER}\README.lnk" "$INSTDIR\README.html" "" "" 0
CreateShortCut "${AC_STARTMENUFOLDER}\Profile folder.lnk" "$0\${AC_PROFILEPATH}"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
Section "OpenAL 1.1 redistributable" OAL
SectionIn RO
ExecWait '"$INSTDIR\bin_win32\oalinst.exe" -s'
SectionEnd
Section "Desktop Shortcuts" DESKSHORTCUTS
SetShellVarContext all
CreateShortCut "$DESKTOP\${AC_SHORTNAME}.lnk" "$INSTDIR\assaultcube.bat" "" "$INSTDIR\docs\images\favicon.ico" 0 SW_SHOWMINIMIZED
SectionEnd
Section "Register URL protocol" REGISTERURL
WriteRegStr HKCR "${AC_URLPROTOCOL}" "" "${AC_SHORTNAME}"
WriteRegStr HKCR "${AC_URLPROTOCOL}" "URL Protocol" ""
WriteRegStr HKCR "${AC_URLPROTOCOL}\DefaultIcon" "" '"$INSTDIR\bin_win32\ac_client.exe"'
WriteRegStr HKCR "${AC_URLPROTOCOL}\shell\open\command" "" '"cmd.exe" /C cd "$INSTDIR" & "assaultcube.bat" "%1"'
SectionEnd
Section "Uninstall"
SetShellVarContext all
; delete installation directory
; RMDir /r "$INSTDIR" is not safe
RMDir /r "$INSTDIR\bin_win32"
RMDir /r "$INSTDIR\bin_win64"
RMDir /r "$INSTDIR\bot"
RMDir /r "$INSTDIR\config"
Delete "$INSTDIR\demos\tutorial_demo.dmo"
RMDir "$INSTDIR\demos"
RMDir /r "$INSTDIR\docs"
Delete "$INSTDIR\mods\ac_mods_README.html"
Delete "$INSTDIR\mods\protox_hq_reskin.zip"
RMDir "$INSTDIR\mods"
RMDir /r "$INSTDIR\packages"
RMDir "$INSTDIR\screenshots"
RMDir /r "$INSTDIR\scripts"
Delete "$INSTDIR\assaultcube*.bat"
Delete "$INSTDIR\changelog.txt"
Delete "$INSTDIR\README*"
Delete "$INSTDIR\server*.bat"
Delete "$INSTDIR\Uninstall.exe"
RMDir "$INSTDIR"
; delete shortcuts
Delete "$DESKTOP\${AC_SHORTNAME}.lnk"
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
Delete "${AC_STARTMENUFOLDER}\${AC_SHORTNAME}.lnk"
Delete "${AC_STARTMENUFOLDER}\Uninstall.lnk"
Delete "${AC_STARTMENUFOLDER}\README.lnk"
Delete "${AC_STARTMENUFOLDER}\Profile folder.lnk"
RMDir "${AC_STARTMENUFOLDER}"
; delete reg keys
DeleteRegKey HKLM "${ARP}"
DeleteRegKey HKLM "SOFTWARE\${AC_SHORTNAME}"
DeleteRegKey HKCR "${AC_URLPROTOCOL}"
SectionEnd
; set descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${AC} "Installs the required AssaultCube core files"
!insertmacro MUI_DESCRIPTION_TEXT ${OAL} "Installs a sound library for 3D audio"
!insertmacro MUI_DESCRIPTION_TEXT ${DESKSHORTCUTS} "Creates shortcuts on your Desktop"
!insertmacro MUI_DESCRIPTION_TEXT ${REGISTERURL} "Registers the ${AC_URLPROTOCOL}:// protocol"
!insertmacro MUI_FUNCTION_DESCRIPTION_END