--- /dev/null
+#!/bin/bash
+
+#
+# Yoink
+# Run this script to create a win32 installer.
+# This was blatantly yoinked and adapted from the Wormux Project.
+#
+
+# Programs
+MAKENSIS="@MAKENSIS@"
+STRIP="@STRIP@"
+
+# Anchor paths
+ROOT_DIR="$PWD"
+
+# Stuff
+COMPRESSION="/solid lzma"
+DEST="tmp-yoink-win32"
+SCRIPT="$DEST/yoink.nsi"
+
+# DLL dependencies
+DLLS="SDL SDL_image zlib1 libpng12-0 OpenAL32 libalut-0 libvorbis-0 libogg-0"
+DLLS="$DLLS libvorbisfile-3"
+
+# Prepare
+${STRIP:-strip} "$ROOT_DIR/src/yoink.exe"
+rm -rf "$DEST"
+mkdir -p "$DEST"
+
+
+#
+# Set installer definitions and strings.
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+HKLM_PATH='SOFTWARE\Games\Yoink'
+UNINSTALL_KEY='SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Yoink'
+APP_PATHS_KEY='SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\yoink.exe'
+START_RUN_KEY='SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
+
+
+PROMPT1="Not enough rights to install, aborting. :-("
+PROMPT2="Unable to uninstall the currently installed version of Yoink. The new version will be installed without removing the currently installed version."
+
+SEC_INSTALL="Install Yoink!"
+SEC_INSTALL_DESC="Installs Yoink to your computer."
+SEC_UNINSTALL="Uninstall previous version."
+SEC_SHORTCUTS="Install Shortcuts."
+SEC_SHORTCUTS_DESC="Install shortcuts at various locations."
+SEC_SHORTCUT1="Place a shortcut on the desktop."
+SEC_SHORTCUT2="Place a shortcut in the start menu."
+SEC_SHORTCUT3="Place an uninstall shortcut in the start menu."
+
+WEBSITE_LINK="Visit the Yoink website"
+
+
+#
+# Begin output of installer script.
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+cat > "$SCRIPT" <<EOF
+; based on MUI Welcome/Finish Page Example Script written by Joost Verburg
+!include "MUI2.nsh"
+!include "Sections.nsh"
+!include "LogicLib.nsh"
+!include "FileFunc.nsh"
+
+!insertmacro GetParent
+
+Name "Yoink"
+VIProductVersion "@PVERSION@"
+VIAddVersionKey "FileDescription" "Yoink Setup"
+VIAddVersionKey "ProductName" "Yoink"
+VIAddVersionKey "FileVersion" "@VERSION@"
+VIAddVersionKey "ProductVersion" "@VERSION@"
+VIAddVersionKey "LegalCopyright" "Copyright 2009 Charles McGarvey et al."
+
+;General
+OutFile "$ROOT_DIR/yoinksetup-@VERSION@.exe"
+SetCompressor $COMPRESSION
+ShowInstDetails show
+ShowUninstDetails show
+SetDateSave on
+RequestExecutionLevel highest
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Modern UI Configuration ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+!define MUI_ICON "$ROOT_DIR/src/yoink.ico"
+!define MUI_UNICON "$ROOT_DIR/src/yoink.ico"
+; Language
+!define MUI_LANGDLL_ALWAYSSHOW
+!define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
+!define MUI_LANGDLL_REGISTRY_KEY "$HKLM_PATH"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
+; Misc stuff
+!define MUI_COMPONENTSPAGE_SMALLDESC
+!define MUI_ABORTWARNING
+; Do not close dialogs, allow to check installation result
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+!define MUI_UNFINISHPAGE_NOAUTOCLOSE
+;Finish Page config
+!define MUI_FINISHPAGE_RUN "\$INSTDIR\\yoink.exe"
+!define MUI_FINISHPAGE_RUN_NOTCHECKED
+!define MUI_FINISHPAGE_LINK "$WEBSITE_LINK"
+!define MUI_FINISHPAGE_LINK_LOCATION "http://www.dogcows.com/"
+
+;--------------------------------
+;Pages
+; Install
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+; Uninstall
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+
+;--------------------------------
+;Languages
+!insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Reserve Files
+;If you are using solid compression, files that are required before
+;the actual installation should be stored first in the data block,
+;because this will make your installer start faster.
+
+!insertmacro MUI_RESERVEFILE_LANGDLL
+
+;--------------------------------
+;Folder-selection page
+InstallDir "\$PROGRAMFILES\\Yoink"
+; Registry key to check for directory (so if you install again, it will
+; overwrite the old one automatically)
+InstallDirRegKey HKLM "$HKLM_PATH" "Path"
+AutoCloseWindow false
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Start Install Sections ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;-----------------------------------------
+;Create folder only if it doesnt exist yet
+!macro CreateDirectoryOnce FOLDER
+ IfFileExists "\${FOLDER}\\*.*" +1
+ CreateDirectory "\${FOLDER}"
+!macroend
+
+;--------------------------------
+;Check (un)install rights
+!macro CheckUserInstallRightsMacro UN
+Function \${UN}CheckUserInstallRights
+ Push \$0
+ Push \$1
+ ClearErrors
+ UserInfo::GetName
+ IfErrors Win9x
+ Pop \$0
+ UserInfo::GetAccountType
+ Pop \$1
+
+ StrCmp \$1 "Admin" 0 +3
+ StrCpy \$1 "HKLM"
+ Goto done
+ StrCmp \$1 "Power" 0 +3
+ StrCpy \$1 "HKLM"
+ Goto done
+ StrCmp \$1 "User" 0 +3
+ StrCpy \$1 "HKCU"
+ Goto done
+ StrCmp \$1 "Guest" 0 +3
+ StrCpy \$1 "NONE"
+ Goto done
+ ; Unknown error
+ StrCpy \$1 "NONE"
+ Goto done
+
+ Win9x:
+ StrCpy \$1 "HKLM"
+
+ done:
+ Exch \$1
+ Exch
+ Pop \$0
+FunctionEnd
+!macroend
+!insertmacro CheckUserInstallRightsMacro ""
+!insertmacro CheckUserInstallRightsMacro "un."
+
+;--------------------------------
+; Uninstall any old version of Yoink
+
+; Section hidden because automatically selected by the installer
+Section "$SEC_UNINSTALL" SecUninstallOldYoink
+ ; Check install rights..
+ StrCpy \$R3 $HKLM_PATH
+ StrCpy \$R4 $UNINSTALL_KEY
+ StrCpy \$R5 "uninstall.exe"
+ Call CheckUserInstallRights
+ Pop \$R0
+ ; "NONE" case already handled at start
+ StrCmp \$R0 "HKCU" _hkcu
+ ReadRegStr \$R1 HKLM \$R3 ""
+ ReadRegStr \$R2 HKLM "\$R4" "UninstallString"
+ Goto try_uninstall
+
+ _hkcu:
+ ReadRegStr \$R1 HKCU \$R3 ""
+ ReadRegStr \$R2 HKCU "\$R4" "UninstallString"
+
+ ; If a previous version exists, remove it
+ try_uninstall:
+ ; If first string is unavailable, Yoink was probably not installed
+ StrCmp \$R1 "" done
+ ; Check if we have uninstall string..
+ IfFileExists \$R2 0 no_file
+ ; Have uninstall string, go ahead and uninstall.
+ SetOverwrite on
+ ; Need to copy uninstaller outside of the install dir
+ ClearErrors
+ CopyFiles /SILENT \$R2 "\$TEMP\\\$R5"
+ SetOverwrite off
+ IfErrors uninstall_problem
+ ; Ready to uninstall..
+ ClearErrors
+ ExecWait '"\$TEMP\\\$R5" /S _?=\$R1'
+ IfErrors exec_error
+ Delete "\$TEMP\\\$R5"
+ Goto done
+
+ exec_error:
+ Delete "\$TEMP\\\$R5"
+ Goto uninstall_problem
+
+ no_file:
+ MessageBox MB_OK "No uninstaller exe found" /SD IDOK IDOK done
+
+ uninstall_problem:
+ ; We cant uninstall. Either the user must manually uninstall or
+ ; we ignore and reinstall over it.
+ MessageBox MB_OKCANCEL "$PROMPT2" /SD IDOK IDCANCEL done
+ Quit
+
+ done:
+SectionEnd
+
+;--------------------------------
+; Installer Sections
+
+Section "$SEC_INSTALL" SecInstallYoink
+ ; Create install and config folders
+ CreateDirectory "\$INSTDIR"
+ ; Set output path to the installation directory.
+ SetOutPath "\$INSTDIR"
+ File "$ROOT_DIR/src/yoink.ico"
+ ; Executing in tmpdir, looking for file in folder below
+ File "$ROOT_DIR/src/yoink.exe"
+ ; data
+ File /r /x Makefile* /x *.desktop "$ROOT_DIR/data"
+ ; uninstall
+ WriteUninstaller "uninstall.exe"
+EOF
+
+
+#
+# Add DLL's to installer
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+for dll in $DLLS
+do
+ cat >> "$SCRIPT" <<EOF
+File "@prefix@/bin/$dll.dll"
+EOF
+done
+
+
+#
+# Continue writing the installer
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+cat >> "$SCRIPT" <<EOF
+ Call CheckUserInstallRights
+ Pop \$R0
+ ; "NONE" case already handled at start
+ StrCmp \$R0 "HKCU" _hkcu
+ WriteRegStr HKLM "$APP_PATHS_KEY" "" "\$INSTDIR\\yoink.exe"
+ WriteRegStr HKLM "$HKLM_PATH" "" "\$INSTDIR"
+ WriteRegStr HKLM "$HKLM_PATH" "Version" "@VERSION@"
+ WriteRegStr HKLM "$UNINSTALL_KEY" "DisplayName" "Yoink"
+ WriteRegStr HKLM "$UNINSTALL_KEY" "DisplayVersion" "@VERSION@"
+ WriteRegStr HKLM "$UNINSTALL_KEY" "UninstallString" "\$INSTDIR\\uninstall.exe"
+ ;Write language to the registry (for the uninstaller)
+ WriteRegStr HKLM "$HKLM_PATH" "Installer Language" \$LANGUAGE
+ ; Sets scope of the desktop and Start Menu entries for all users.
+ SetShellVarContext "all"
+ Goto _next
+
+ _hkcu:
+ WriteRegStr HKCU "$HKLM_PATH" "" "\$INSTDIR"
+ WriteRegStr HKCU "$HKLM_PATH" "Version" "@VERSION@"
+ WriteRegStr HKCU "$UNINSTALL_KEY" "DisplayName" "Yoink"
+ WriteRegStr HKCU "$UNINSTALL_KEY" "DisplayVersion" "@VERSION@"
+ WriteRegStr HKCU "$UNINSTALL_KEY" "UninstallString" "\$INSTDIR\\uninstall.exe"
+ ;Write language to the registry (for the uninstaller)
+ WriteRegStr HKCU "$HKLM_PATH" "Installer Language" \$LANGUAGE
+ ;SetShellVarContext "current"
+
+ _next:
+SectionEnd ; Installer section
+
+;--------------------------------
+;Shortcuts
+SectionGroup /e "$SEC_SHORTCUTS" SecShortcuts
+
+ ; Desktop shortcut
+Section /o "$SEC_SHORTCUT1" SecDesktopShortcut
+SetOverwrite on
+CreateShortCut "\$DESKTOP\\Yoink.lnk" "\$INSTDIR\\yoink.exe" \
+ "" "\$INSTDIR\\yoink.exe" 0
+SetOverwrite off
+SectionEnd
+
+ ; Yoink shortcut in start menu
+Section "$SEC_SHORTCUT2" SecStartMenuShortcut
+SetOverwrite on
+!insertmacro CreateDirectoryOnce "\$SMPROGRAMS\\Yoink"
+CreateShortCut "\$SMPROGRAMS\\Yoink\\Play Yoink!.lnk" \
+ "\$INSTDIR\\yoink.exe" "" "\$INSTDIR\\yoink.exe" 0
+SetOverwrite off
+SectionEnd
+
+ ; Yoink uninstall shortcut in start menu
+ ; Might be forced if user has no install rights,
+ ; because it would be complex otherwise:
+ ; - No uninstall available in Windows "Program uninstall"
+ ; - Folder lost in APPDATA, which can be hidden, etc
+Section "$SEC_SHORTCUT3" SecUninstallShortcut
+SetOverwrite on
+!insertmacro CreateDirectoryOnce "\$SMPROGRAMS\\Yoink"
+CreateShortCut "\$SMPROGRAMS\\Yoink\\Uninstall.lnk" \
+ "\$INSTDIR\\uninstall.exe" "" "\$INSTDIR\\uninstall.exe" 0
+SetOverwrite off
+SectionEnd
+
+SectionGroupEnd
+
+
+;--------------------------------
+;Descriptions
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+!insertmacro MUI_DESCRIPTION_TEXT \${SecInstallYoink} "$SEC_INSTALL_DESC"
+!insertmacro MUI_DESCRIPTION_TEXT \${SecShortcuts} "$SEC_SHORTCUTS_DESC"
+!insertmacro MUI_DESCRIPTION_TEXT \${SecDesktopShortcut} "$SEC_SHORTCUT1"
+!insertmacro MUI_DESCRIPTION_TEXT \${SecStartMenuShortcut} "$SEC_SHORTCUT2"
+!insertmacro MUI_DESCRIPTION_TEXT \${SecUninstallShortcut} "$SEC_SHORTCUT3"
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+ ; Set install path according to user rights
+ Call un.CheckUserInstallRights
+ Pop \$R0
+ StrCmp \$R0 "HKLM" _hklm
+
+ ; Also used as fallback by HKLM case
+ _hkcu:
+ ReadRegStr \$R0 HKCU "$HKLM_PATH" ""
+ StrCmp \$R0 "\$INSTDIR" 0 _next
+ ; HKCU install path matches our INSTDIR so uninstall
+ DeleteRegKey HKCU "$HKLM_PATH"
+ DeleteRegKey HKCU "$UNINSTALL_KEY"
+ Goto _next
+
+ _hklm:
+ ReadRegStr \$R0 HKLM "$HKLM_PATH" ""
+ StrCmp \$R0 \$INSTDIR 0 _hkcu
+ ; HKLM install path matches our INSTDIR so uninstall
+ DeleteRegKey HKLM "$APP_PATHS_KEY"
+ DeleteRegKey HKLM "$HKLM_PATH"
+ DeleteRegKey HKLM "$UNINSTALL_KEY"
+ SetShellVarContext all
+
+ _next:
+ ; Remove Language preference info
+ DeleteRegValue HKCU "$HKLM_PATH" "Installer Language"
+ ; remove shortcuts, if any.
+ Delete "\$SMPROGRAMS\\Yoink\\*.*"
+ RMDir "\$SMPROGRAMS\\Yoink"
+ Delete "\$SMPROGRAMS\\Yoink.lnk"
+ Delete "\$DESKTOP\\Yoink.lnk"
+ ; remove files
+ RMDir /r "\$INSTDIR"
+SectionEnd
+
+Function .onInit
+ ;Language selection
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+ IntOp \$R0 \${SF_RO} | \${SF_SELECTED}
+ SectionSetFlags \${SecInstallYoink} \$R0
+ SectionSetFlags \${SecUninstallOldYoink} \$R0
+
+ ; Set install path according to user rights
+ Call CheckUserInstallRights
+ Pop \$R0
+ StrCmp \$R0 "NONE" _none
+ StrCmp \$R0 "HKLM" 0 _hkcu
+ StrCpy \$INSTDIR "\$PROGRAMFILES\\Yoink"
+ Goto _done
+
+ _hkcu:
+ Push \$SMPROGRAMS
+ \${GetParent} \$SMPROGRAMS \$R2
+ \${GetParent} \$R2 \$R2
+ StrCpy \$INSTDIR "\$R2\\Yoink"
+ ; In this case uninstall shortcut *must* be available because
+ ; the alternative are complex for the user
+ IntOp \$R0 \${SF_RO} | \${SF_SELECTED}
+ SectionSetFlags \${SecUninstallShortcut} \$R0
+ Goto _done
+
+ _none:
+ ; Not going to bother
+ MessageBox MB_OK "$PROMPT1" /SD IDOK
+ Quit
+
+ _done:
+FunctionEnd
+
+; INSTDIR will be determined by reading a registry key
+Function un.onInit
+ !insertmacro MUI_UNGETLANGUAGE
+ ; Set install path according to user rights
+ Call un.CheckUserInstallRights
+ Pop \$R0
+ StrCmp \$R0 "NONE" _none
+ Goto _end
+
+ _none:
+ ; Not going to bother
+ MessageBox MB_OK "$PROMPT1" /SD IDOK
+ Quit
+
+ _end:
+FunctionEnd
+EOF
+
+
+#
+# Compile the installer and cleanup.
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+if ! "${MAKENSIS:-makensis}" "$SCRIPT"
+then
+ echo "makensis failed, aborting..."
+ exit 1
+fi
+
+rm -rf "$DEST"
+