#!/bin/bash -e

#added in v1.43
#CONFIG
if [ -e $HOME/.config/common-install-function.conf ]
then
    source $HOME/.config/common-install-function.conf
fi

#updated in v1.63
NSH_CURRENT_SOUNDFONT="/usr/share/sounds/sf2/FluidR3_GM.sf2"
#updated in v1.69
NSH_CURRENT_WINE="system"

#GENERAL
#---------------------------------------------------------------------
if [ -z "$NSH_SHAREDIR" ]; then
	NSH_SHAREDIR="/usr/share"
fi
#added in v1.65
if [ -z "${NSH_LOCALUSERDIR}" ]; then
	NSH_LOCALUSERDIR="$HOME/.local/share"
fi
#added in v1.69
if [ -z "${NSH_LOCALUSERCONFIG}" ]; then
	NSH_LOCALUSERCONFIG="$HOME/.config"
fi
#added in v1.64
if [ -z "$NSH_MAME_CTRLRCONFIG" ]; then
	NSH_MAME_CTRLRCONFIG="xbox360controller"
fi

#updated in v1.80
function NSH_SetInstallPath()
{
	# we prefere wine-devel in case it exist
	if [ -z "$NSH_WINEEXE" ]; then
		if [ -x /opt/wine-devel/bin/wine ]; then
			NSH_WINEEXE="/opt/wine-devel/bin/wine"
		else
			NSH_WINEEXE="/usr/bin/wine"	
		fi
		echo "[NSH_SetInstallPath] : wine found here $NSH_WINEEXE"
	fi
	echo "[NSH_SetInstallPath] : set to $1"
	case "$1" in
		normal)
			NSH_INSTALLPATH="normal"
			NSH_SHAREDIR="/usr/share"
			NSH_LOCALUSERDIR="$HOME/.local/share"
			NSH_LOCALUSERCONFIG="$HOME/.config"
			;;
		game)
			NSH_INSTALLPATH="game"
			NSH_SHAREDIR="/usr/share/games"
			NSH_LOCALUSERDIR="$HOME/.local/share/games"
			;;
		dosboxgame)
			NSH_INSTALLPATH="dosboxgame"
			NSH_SHAREDIR="/usr/share/games/dosbox"
			NSH_LOCALUSERDIR="$HOME/.local/share/games/dosbox"
			;;
		amigagame)
			NSH_INSTALLPATH="amigagame"
			NSH_SHAREDIR="/usr/share/games/fs-uae"
			NSH_LOCALUSERDIR="$HOME/.local/share/games/fs-uae"
			;;
		wine)
			NSH_INSTALLPATH="wine"
			NSH_SHAREDIR="/usr/share/win32/apps"
			NSH_LOCALUSERDIR="$HOME/.local/share/win32/apps"
			NSH_LOCALUSERCONFIG="$HOME/.config/win32/apps"
			;;
		winegame)
			NSH_INSTALLPATH="winegame"
			NSH_SHAREDIR="/usr/share/games/win32"
			NSH_LOCALUSERDIR="$HOME/.local/share/games/win32"
			NSH_LOCALUSERCONFIG="$HOME/.config/games/win32"
			;;
		*)
			NSH_INSTALLPATH="normal"
			NSH_SHAREDIR="/usr/share"
			NSH_LOCALUSERDIR="$HOME/.local/share"
			NSH_LOCALUSERCONFIG="$HOME/.config"
			;;
	esac
}

#updated in v1.76
function NSH_CreateTmpDomainDir()
{
	
    if [ ! -e /tmp/${domain} ]
    then
    	echo "[NSH_CreateTmpDomainDir] : mkdir /tmp/${domain}"
        mkdir /tmp/${domain}
	else
		echo "[NSH_CreateTmpDomainDir] : rm -rf /tmp/${domain}"
		rm -rf /tmp/${domain}
		echo "[NSH_CreateTmpDomainDir] : mkdir /tmp/${domain}"
		mkdir /tmp/${domain}
    fi
}

function NSH_RemoveTmpDomainDir()
{
    if [ -e /tmp/${domain} ]
    then
    	echo "[NSH_RemoveTmpDomainDir] : rm -rf /tmp/${domain}"
        rm -rf /tmp/${domain}
    fi
}

#created in v1.80
function NSH_CreateTmpCDDomainDir()
{
	
    if [ ! -e /tmp/${domain}_disc ]
    then
    	echo "[NSH_CreateTmpCDDomainDir] : mkdir /tmp/${domain}_disc"
        mkdir /tmp/${domain}_disc
	else
		echo "[NSH_CreateTmpCDDomainDir] : rm -rf /tmp/${domain}_disc"
		rm -rf /tmp/${domain}_disc
		echo "[NSH_CreateTmpCDDomainDir] : mkdir /tmp/${domain}_disc"
		mkdir /tmp/${domain}_disc
    fi
}

#created in v1.80
function NSH_RemoveTmpCDDomainDir()
{
    if [ -e /tmp/${domain}_disc ]
    then
    	echo "[NSH_RemoveTmpCDDomainDir] : rm -rf /tmp/${domain}_disc"
        rm -rf /tmp/${domain}_disc
    fi
}


#updated in v1.76
function NSH_InstallRWFileInTmp()
{
	echo "[NSH_InstallRWFileInTmp] : cp ${NSH_SHAREDIR}/${domain}/$1.init /tmp/${domain}/$2"
    cp "${NSH_SHAREDIR}/${domain}/$1.init" "/tmp/${domain}/$2"
}

#added in v1.62
function NSH_InstallRWDirInTmp()
{
	echo "[NSH_InstallRWDirInTmp] : cp -R ${NSH_SHAREDIR}/${domain}/$1.init /tmp/${domain}/$2"
    cp -R "${NSH_SHAREDIR}/${domain}/$1.init" "/tmp/${domain}/$2"
}

#added in v1.1
function NSH_CopyFileInTmp()
{
	 echo "[NSH_CopyFileInTmp] : cp ${NSH_SHAREDIR}/${domain}/$1 /tmp/${domain}/$1"
     cp "${NSH_SHAREDIR}/${domain}/$1" "/tmp/${domain}/$1"
}

#added in v1.1
function NSH_CopyDirInTmp()
{
	echo "[NSH_CopyDirInTmp] : cp -R ${NSH_SHAREDIR}/${domain}/$1 /tmp/${domain}"
    cp -R "${NSH_SHAREDIR}/${domain}/$1" "/tmp/${domain}"
}

#added in v1.78
function NSH_CreateDirInTmp()
{
	echo "[NSH_CreateDirInTmp] : /tmp/${domain}/$1"
    mkdir "/tmp/${domain}/$1"
}

#update in 1.69
function NSH_CreateConfigDir()
{
	if [ ! -e $NSH_LOCALUSERCONFIG/${domain} ]
	then
		echo "[NSH_CreateConfigDir] : mkdir -p $NSH_LOCALUSERCONFIG/${domain}"
		mkdir -p $NSH_LOCALUSERCONFIG/${domain}
	fi
}

#update in 1.69
function NSH_LinkConfig()
{
	if [ -e $NSH_LOCALUSERCONFIG/${domain}/$2 ]
	then
		echo "[NSH_LinkConfig] : ln -s $NSH_LOCALUSERCONFIG/${domain}/$2  /tmp/${domain}/$2"
		ln -s $NSH_LOCALUSERCONFIG/${domain}/$2  /tmp/${domain}/$2
	else
		echo "[NSH_LinkConfig] : cp -r ${NSH_SHAREDIR}/${domain}/$1.init $NSH_LOCALUSERCONFIG/${domain}/$2"
		cp -r ${NSH_SHAREDIR}/${domain}/$1.init $NSH_LOCALUSERCONFIG/${domain}/$2
		echo "[NSH_LinkConfig] : ln -s $NSH_LOCALUSERCONFIG/${domain}/$2  /tmp/${domain}/$2"
		ln -s $NSH_LOCALUSERCONFIG/${domain}/$2  /tmp/${domain}/$2
	fi
}

#update in 1.69
function NSH_ResetConf()
{
	echo "[NSH_ResetConf] : rm -rf $NSH_LOCALUSERCONFIG/${domain}/"
	rm -rf $NSH_LOCALUSERCONFIG/${domain}/
	echo config files removed
}

#updated in v1.65 $XDG_DATA_HOME
function NSH_CreateUserDataDir()
{
	if [ ! -e ${NSH_LOCALUSERDIR}/${domain} ]
    then
		if [ -e $HOME/.local/share/${domain} ]
			then
				if [ ! -e ${NSH_LOCALUSERDIR} ]
					then
					echo "[NSH_CreateUserDataDir] : mkdir -p ${NSH_LOCALUSERDIR}"
					mkdir -p ${NSH_LOCALUSERDIR}
				fi
				echo "[NSH_CreateUserDataDir] : mv $HOME/.local/share/${domain}  ${NSH_LOCALUSERDIR}/${domain}/"
				mv $HOME/.local/share/${domain}  ${NSH_LOCALUSERDIR}/${domain}
			else
				echo "[NSH_CreateUserDataDir] : mkdir -p ${NSH_LOCALUSERDIR}/${domain}"
				mkdir -p "${NSH_LOCALUSERDIR}/${domain}"
		fi
	fi
}

#updated in v1.75 $XDG_DATA_HOME
function NSH_LinkUserDataFileToTMP()
{
	if [ -e ${NSH_LOCALUSERDIR}/${domain}/$2 ]
	then
		echo "[NSH_LinkUserDataFileToTMP] : ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2"
		ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2
	else
		case "$NSH_INSTALLPATH" in
			amigagame)
			echo "[NSH_LinkUserDataFileToTMP] : cp -r /tmp/${domain}/$1.init ${NSH_LOCALUSERDIR}/${domain}/$2"
			cp -r /tmp/${domain}/$1.init ${NSH_LOCALUSERDIR}/${domain}/$2
			echo "[NSH_LinkUserDataFileToTMP] : ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2"
			ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2
			;;

			*)
			echo "[NSH_LinkUserDataFileToTMP] : cp -r ${NSH_SHAREDIR}/${domain}/$1.init ${NSH_LOCALUSERDIR}/${domain}/$2"
			cp -r ${NSH_SHAREDIR}/${domain}/$1.init ${NSH_LOCALUSERDIR}/${domain}/$2
			echo "[NSH_LinkUserDataFileToTMP] : ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2"
			ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2
			;;
		esac
	fi
}

#added in v1.78
function NSH_LinkUserDataDirToTMP()
{
	if [ -e ${NSH_LOCALUSERDIR}/${domain}/$2 ]
	then
		echo "[NSH_LinkUserDataDirToTMP] : ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2"
		ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2
	else
		echo "[NSH_LinkUserDataDirToTMP] : mkdir ${NSH_LOCALUSERDIR}/${domain}/$2"
		mkdir ${NSH_LOCALUSERDIR}/${domain}/$2
		echo "[NSH_LinkUserDataDirToTMP] : ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2"
		ln -s ${NSH_LOCALUSERDIR}/${domain}/$2  /tmp/${domain}/$2
	fi
}

#added in v1.18
function NSH_std_usage()
{
	if [ $(which gettext) ]; then
		gettext="gettext --domain=${domain} -s --"
	else
		gettext=echo
	fi

	$gettext "Start $APP_FULLNAME - $APP_DESC"
	echo
	$gettext "Usage: $0 [option]"
	$gettext "Options :"
	$gettext "    --help				display this help and exit"
}

#added in v1.25
function NSH_CHDtoCUE()
{
	if ! hash "chdman" > /dev/null; then
		error_exit "command $1 not found, the script won't be run."
	fi
	echo "[NSH_CHDtoCUE] : chdman extractcd -i $1 -o /tmp/${domain}/${domain}.cue"
	chdman extractcd -i "$1" -o "/tmp/${domain}/${domain}.cue"
}

#added in v1.25
function error_exit
{
	echo "$1" 1>&2
	times
	exit 1
}


#Hatari
#---------------------------------------------------------------------
#added in v1.17
function NSH_std_usage_ATARI()
{
	if [ $(which gettext) ]; then
		gettext="gettext --domain=${domain} -s --"
	else
		gettext=echo
	fi

	$gettext "Start $APP_FULLNAME - $APP_DESC"
	echo
	$gettext "Usage: $0 [option]"
	$gettext "Options :"
	$gettext "    --help				display this help and exit"
	$gettext "    --fullscreen			start game in fullscreen (Alt+F4 to quit)"
	$gettext "    --version				display version information and exit"
}

#added in v1.17
function NSH_version_ATARI()
{
	echo $0
	echo "Copyright (C) $APP_COPYRIGHT"
	echo "hatari Copyright (C) hatari Team"
}

#WHDload
#---------------------------------------------------------------------

#added in v1.16
function NSH_std_usage_AMIGA()
{
	if [ $(which gettext) ]; then
		gettext="gettext --domain=${domain} -s --"
	else
		gettext=echo
	fi

	$gettext "Start $APP_FULLNAME - $APP_DESC"
	echo
	$gettext "Usage: $0 [option]"
	$gettext "Options :"
	$gettext "    --help				display this help and exit"
	$gettext "    --fullscreen			start game in fullscreen (Alt+F4 to quit)"
	$gettext "    --version				display version information and exit"
}

#added in v1.16
function NSH_version_AMIGA()
{
	echo $0
	echo "Copyright (C) $APP_COPYRIGHT"
	echo "fs-uae Copyright (C) fs-uae Team"
}

#added in v1.66
function NSH_RunAMIGA()
{
	prerun
	/usr/bin/fs-uae ${NSH_SHAREDIR}/${domain}/${domain}$2.fs-uae $1
	postrun
}

#updated in v1.65
function NSH_CreateWHDSaves()
{
	if [ ! -e ${NSH_LOCALUSERDIR}/WHDSaves ]
	then
		if [ -e  $HOME/.local/share/WHDSaves ]
			then
				if [ ! -e ${NSH_LOCALUSERDIR} ]
					then
					echo "[NSH_CreateWHDSaves] : mkdir -p ${NSH_LOCALUSERDIR}"
					mkdir -p ${NSH_LOCALUSERDIR}
				fi
				echo "[NSH_CreateWHDSaves] : mv $HOME/.local/share/WHDSaves  ${NSH_LOCALUSERDIR}/WHDSaves"
				mv $HOME/.local/share/WHDSaves  ${NSH_LOCALUSERDIR}/WHDSaves
				echo "[NSH_CreateWHDSaves] : rm $HOME/.local/share/WHDSaves.uaem"
				rm $HOME/.local/share/WHDSaves.uaem
			else
				echo "[NSH_CreateWHDSaves] : mkdir -p "${NSH_LOCALUSERDIR}/WHDSaves""
				mkdir -p "${NSH_LOCALUSERDIR}/WHDSaves"
		fi
	fi
}

#added in v1.6
function NSH_ExtractDH1()
{
	if [ ! -e /tmp/${domain} ]; then
		echo "[NSH_ExtractDH1] : mkdir /tmp/${domain}"
		mkdir /tmp/${domain}
	else
		echo "[NSH_ExtractDH1] : rm -rf /tmp/${domain}"
		rm -rf /tmp/${domain}
		echo "[NSH_ExtractDH1] : mkdir /tmp/${domain}"
		mkdir /tmp/${domain}
	fi
	echo "[NSH_ExtractDH1] : unzip ${NSH_SHAREDIR}/${domain}/DH1.zip -d /tmp/${domain}"
	unzip ${NSH_SHAREDIR}/${domain}/DH1.zip -d /tmp/${domain}
}

#added in v1.8
function NSH_ExtractAnyDH1()
{
	if [ ! -e /tmp/${domain} ]; then
		echo "[NSH_ExtractAnyDH1] : mkdir /tmp/${domain}"
		mkdir /tmp/${domain}
	else
		echo "[NSH_ExtractAnyDH1] : rm -rf /tmp/${domain}"
		rm -rf /tmp/${domain}
		echo "[NSH_ExtractAnyDH1] : mkdir /tmp/${domain}"
		mkdir /tmp/${domain}
	fi
	echo "[NSH_ExtractAnyDH1] : unzip ${NSH_SHAREDIR}/${domain}/$1 -d /tmp/${domain}"
	unzip ${NSH_SHAREDIR}/${domain}/$1 -d /tmp/${domain}
}

#added in v1.6
function NSH_RemoveDH1()
{
	if [ -e /tmp/${domain} ]; then
		echo "[NSH_RemoveDH1] : rm -rf /tmp/${domain}"
		rm -rf /tmp/${domain}
	fi
}

#updated in v1.78
function NSH_LinkKickstart()
{
	echo "[NSH_LinkKickstart] : mkdir -p /tmp/devs/kickstarts"
	mkdir -p /tmp/devs/kickstarts
	case "$1" in
		a500)
		echo "[NSH_LinkKickstart] : cp /usr/share/amiga/kickstarts/Kickstart1.3.rom /tmp/devs/kickstarts/kick34005.A500"
    	cp /usr/share/amiga/kickstarts/Kickstart1.3.rom /tmp/devs/kickstarts/kick34005.A500
		;;

		a1200)
		echo "[NSH_LinkKickstart] : cp /usr/share/amiga/kickstarts/Kickstart3.1rev4068_1200.rom /tmp/devs/kickstarts/kick40068.A1200"
    	cp /usr/share/amiga/kickstarts/Kickstart3.1rev4068_1200.rom /tmp/devs/kickstarts/kick40068.A1200
		;;

		a4000)
		echo "[NSH_LinkKickstart] : cp /usr/share/amiga/kickstarts/Kickstart3.1.rom /tmp/devs/kickstarts/kick40068.A4000"
    	cp /usr/share/amiga/kickstarts/Kickstart3.1.rom /tmp/devs/kickstarts/kick40068.A4000
		;;
	esac
}

#added in v1.66
function NSH_UnLinkKickstart()
{
	echo "[NSH_UnLinkKickstart] : rm -rf /tmp/devs/"
	rm -rf /tmp/devs/
}

#DOSBOX
#---------------------------------------------------------------------

#changed in v1.61
function NSH_std_usage_DOSBOX()
{
	if [ $(which gettext) ]; then
		gettext="gettext --domain=${domain} -s --"
	else
		gettext=echo
	fi

	$gettext "Start $APP_FULLNAME - $APP_DESC"
	echo
	$gettext "Usage: $0 [option]"
	$gettext "Options :"
	$gettext "    --help				display this help and exit"
	$gettext "    --fullscreen			start game in fullscreen (Ctrl-F9 to exit)"

	case "$NSH_INSTALLPATH" in
			dosboxgame)
			$gettext "    --setsound				setup sound (if there is)"
			$gettext "    --resetconf				reset configuration"
			;;
	esac

	$gettext "    --debug				start the dosbox-x environnement without running the demo"
	$gettext "    --version				display version information and exit"
}

#changed in v1.59
function NSH_version_DOSBOX()
{
	echo $0
	echo "Copyright (C) $APP_COPYRIGHT"
	echo "copyright 2011-2020 joncampbell123."
    echo "Based on DOSBox by the DOSBox Team (See AUTHORS file)"
}

#updated in v1.69
function NSH_CopyDefaultMapperDOSBOX()
{
	if [ ! -e $NSH_LOCALUSERCONFIG/${domain}/keyboard.map ]
	then
		echo "[NSH_CopyDefaultMapperDOSBOX] : cp $HOME/.dosbox/mapper-${1}.map $NSH_LOCALUSERCONFIG/${domain}/keyboard.map"
		cp $HOME/.dosbox/mapper-${1}.map $NSH_LOCALUSERCONFIG/${domain}/keyboard.map
	fi
}

#updated in v1.69
function NSH_CopyXbox360MapperDOSBOX()
{
	if [ ! -e $NSH_LOCALUSERCONFIG/${domain}/keyboard.map ]
	then
		echo "[NSH_CopyXbox360MapperDOSBOX] : cp ${NSH_SHAREDIR}/${domain}/keyboard_to_xinputcontroller.map $NSH_LOCALUSERCONFIG/${domain}/keyboard.map"
		cp ${NSH_SHAREDIR}/${domain}/keyboard_to_xinputcontroller.map $NSH_LOCALUSERCONFIG/${domain}/keyboard.map
	fi
}

function NSH_SetDebugDOSBOX()
{
	echo "[NSH_SetDebugDOSBOX] : head -n -2 ${NSH_SHAREDIR}/${domain}/${domain}.conf > /tmp/${domain}_debug.conf"
	head -n -2 ${NSH_SHAREDIR}/${domain}/${domain}.conf > /tmp/${domain}_debug.conf
}

function NSH_SetEXEDOSBOX()
{
	head -n -2 ${NSH_SHAREDIR}/${domain}/${domain}.conf > /tmp/${domain}_temp.conf
	echo $1 >> /tmp/${domain}_temp.conf
	echo exit >> /tmp/${domain}_temp.conf
}

function NSH_RemoveEXEDOSBOX()
{
	echo "[NSH_RemoveEXEDOSBOX] : rm /tmp/${domain}_temp.conf"
	rm /tmp/${domain}_temp.conf
}

function NSH_RemoveDebugDOSBOX()
{
	echo "[NSH_RemoveDebugDOSBOX] : rm /tmp/${domain}_debug.conf"
	rm /tmp/${domain}_debug.conf
}

#update in v1.63
function NSH_StartMidiServer()
{
	if ! hash "fluidsynth" > /dev/null; then
		error_exit "command $1 not found, the script won't be run."
	fi
	case $1 in
		TimiditySF)
			if [ $(which pulseaudio) ]; then
				echo "[NSH_StartMidiServer] : fluidsynth /usr/share/sounds/sf2/TimGM6mb.sf2 -a 'pulseaudio' --server --no-shell -g 0.6 &"
				fluidsynth /usr/share/sounds/sf2/TimGM6mb.sf2 -a 'pulseaudio' --server --no-shell -g 0.6 &
			else
				echo "[NSH_StartMidiServer] : fluidsynth /usr/share/sounds/sf2/TimGM6mb.sf2 -a 'alsa' -m 'alsa_seq' -p '128:0' --server --no-shell -g 0.6 &"
				fluidsynth /usr/share/sounds/sf2/TimGM6mb.sf2 -a 'alsa' -m 'alsa_seq' -p '128:0' --server --no-shell -g 0.6 &
			fi
		;;
		FluidSF)
			if [ $(which pulseaudio) ]; then
				echo "[NSH_StartMidiServer] : fluidsynth /usr/share/sounds/sf2/FluidR3_GM.sf2 -a 'pulseaudio' --server --no-shell -g 0.6 &"
				fluidsynth /usr/share/sounds/sf2/FluidR3_GM.sf2 -a 'pulseaudio' --server --no-shell -g 0.6 &
			else
				echo "[NSH_StartMidiServer] : fluidsynth /usr/share/sounds/sf2/FluidR3_GM.sf2 -a 'alsa' -m 'alsa_seq' -p '128:0' --server --no-shell -g 0.6 &"
				fluidsynth /usr/share/sounds/sf2/FluidR3_GM.sf2 -a 'alsa' -m 'alsa_seq' -p '128:0' --server --no-shell -g 0.6 &
			fi
		;;
		*)
			if [ $(which pulseaudio) ]; then
					echo "[NSH_StartMidiServer] : fluidsynth $NSH_CURRENT_SOUNDFONT -a 'pulseaudio' --server --no-shell -g 0.6 &"
				    fluidsynth $NSH_CURRENT_SOUNDFONT -a 'pulseaudio' --server --no-shell -g 0.6 &
			else
					echo "[NSH_StartMidiServer] : fluidsynth $NSH_CURRENT_SOUNDFONT -a 'alsa' -m 'alsa_seq' -p '128:0' --server --no-shell -g 0.6 &"
				    fluidsynth $NSH_CURRENT_SOUNDFONT -a 'alsa' -m 'alsa_seq' -p '128:0' --server --no-shell -g 0.6 &
			fi
		;;
	esac
}

#added in v1.14
function NSH_StopMidiServer()
{
	echo "[NSH_StopMidiServer] : killall fluidsynth"
	killall fluidsynth
}

function NSH_RunDebugDOSBOX()
{
	NSH_SetDebugDOSBOX
	prerun
	/usr/bin/dosbox-x -conf  /tmp/${domain}_debug.conf
	postrun
	NSH_RemoveDebugDOSBOX
}

function NSH_RunAnyDOSBOX()
{
	NSH_CreateTmpDomainDir
	prerun
	NSH_SetEXEDOSBOX $1
	echo "[NSH_RunAnyDOSBOX] : /usr/bin/dosbox-x -conf "/tmp/${domain}_temp.conf" $2"
	/usr/bin/dosbox-x -conf "/tmp/${domain}_temp.conf" $2
	postrun
	NSH_RemoveTmpDomainDir
}

#SCUMMVM
#added in v1.65
function NSH_RunSCUMMVM()
{
	NSH_CreateUserDataDir
	prerun
	echo "[NSH_RunSCUMMVM] : scummvm -m 255 --aspect-ratio --savepath=$HOME/.local/share/games/scummvm/${domain} -p /usr/share/games/scummvm/${domain} $1"
	scummvm -m 255 --aspect-ratio --savepath=$HOME/.local/share/games/scummvm/${domain} -p /usr/share/games/scummvm/${domain} $1
	postrun
}


#WINE BASH
#---------------------------------------------------------------------

#added in v1.9
function NSH_WINE_std_usage()
{
	if [ $(which gettext) ]; then
		gettext="gettext --domain=${domain} -s --"
	else
		gettext=echo
	fi

	$gettext "Start $APP_FULLNAME - $APP_DESC"
	echo
	$gettext "Usage: $0 [option]"
	$gettext "Options :"
	$gettext "    --help                            display this help and exit"
	$gettext "    --setdesktop                      set to desktop and run"
	$gettext "    --setwindow                       set to window mode and run"
	$gettext "    --setwine [wine version]          set to another wine"
	$gettext "    --reset                           reset to the default wine"
	$gettext "    --version                         display version information and exit"
}

#added in v1.76
function NSH_WINE2_std_usage()
{
	if [ $(which gettext) ]; then
		gettext="gettext --domain=${domain} -s --"
	else
		gettext=echo
	fi

	$gettext "Start $APP_FULLNAME - $APP_DESC"
	echo
	$gettext "Usage: ${domain} [option]"
	$gettext "Options :"
	$gettext "    --help                            display this help and exit"
	$gettext "    --version                         display version information and exit"
	$gettext "Environment variable :"
	$gettext "    APP_RES                           with a value set like widthxheight, start in virtual desktop (width/height)"
}

#added in v1.76
function NSH_WINE2_version()
{
	echo $0
	echo "Copyright (C) $APP_COPYRIGHT"
}


#updated in v1.80
function NSH_WINE2_run()
{
        #by default this is a wine app, except if it's changed in the prerun
        NSH_SetInstallPath wine
        NSH_WINE_SetArch
        prerun

		if [ ! -z $APP_HDD  ]
		then
			APP_PATH=${NSH_SHAREDIR}/$domain/hdd/$APP_RUNPATH
		else
			APP_PATH=${NSH_SHAREDIR}/$domain/$APP_RUNPATH
		fi
		if [ -z $APP_DXVK_DEBUG  ]
		then
			APP_DXVK_DEBUG="false"
		else
			APP_DXVK_DEBUG="full"
		fi
        echo "[NSH_WINE2_run] : cd $APP_PATH"
        cd $APP_PATH
        if [ ! -z $APP_RES  ]
        then
                echo "[NSH_WINE2_run] : WINEARCH=$WINEARCH DXVK_HUD=$APP_DXVK_DEBUG WINEDLLOVERRIDES="ddraw,d3d8,d3d9,d3d10core,d3d11,dxgi=n,b" WINEPREFIX=$WINEPREFIX $NSH_WINEEXE explorer /desktop=$domain,$APP_RES $APP_EXE $APP_ARG"
                WINEARCH=$WINEARCH DXVK_HUD=$APP_DXVK_DEBUG WINEDLLOVERRIDES="ddraw,d3d8,d3d9,d3d10core,d3d11,dxgi=n,b" WINEPREFIX=$WINEPREFIX $NSH_WINEEXE explorer /desktop=$domain,$APP_RES $APP_EXE $APP_ARG
        else
                echo "[NSH_WINE2_run] : WINEARCH=$WINEARCH DXVK_HUD=$APP_DXVK_DEBUG WINEDLLOVERRIDES="ddraw,d3d8,d3d9,d3d10core,d3d11,dxgi=n,b" WINEPREFIX=$WINEPREFIX $NSH_WINEEXE $APP_EXE $APP_ARG"
                WINEARCH=$WINEARCH DXVK_HUD=$APP_DXVK_DEBUG WINEDLLOVERRIDES="ddraw,d3d8,d3d9,d3d10core,d3d11,dxgi=n,b" WINEPREFIX=$WINEPREFIX $NSH_WINEEXE $APP_EXE $APP_ARG
        fi
        postrun
}

#new in v1.80
function NSH_WINE2_run_specific()
{
        #by default this is a wine app, except if it's changed in the prerun
        NSH_WINE_SetArch

		if [ ! -z $APP_HDD  ]
		then
			APP_PATH=${NSH_SHAREDIR}/$domain/hdd/$APP_RUNPATH
		else
			APP_PATH=${NSH_SHAREDIR}/$domain/$APP_RUNPATH
		fi
		if [ -z $APP_DXVK_DEBUG  ]
		then
			APP_DXVK_DEBUG="false"
		else
			APP_DXVK_DEBUG="full"
		fi
		echo "[NSH_WINE2_run_specific] : cd $APP_PATH"
		cd $APP_PATH
        if [ ! -z $APP_RES  ]
        then
                echo "[NSH_WINE2_run_specific] : WINEARCH=$WINEARCH DXVK_HUD=$APP_DXVK_DEBUG WINEDLLOVERRIDES="ddraw,d3d8,d3d9,d3d10core,d3d11,dxgi=n,b" WINEPREFIX=$WINEPREFIX $NSH_WINEEXE explorer /desktop=$domain,$APP_RES $1 $2"              
                WINEARCH=$WINEARCH DXVK_HUD=$APP_DXVK_DEBUG WINEDLLOVERRIDES="ddraw,d3d8,d3d9,d3d10core,d3d11,dxgi=n,b"  WINEPREFIX=$WINEPREFIX $NSH_WINEEXE explorer /desktop=$domain,$APP_RES $1 $2
        else
                echo "[NSH_WINE2_run_specific] : WINEARCH=$WINEARCH DXVK_HUD=$APP_DXVK_DEBUG WINEDLLOVERRIDES="ddraw,d3d8,d3d9,d3d10core,d3d11,dxgi=n,b" WINEPREFIX=$WINEPREFIX $NSH_WINEEXE explorer $1 $2"
                WINEARCH=$WINEARCH DXVK_HUD=$APP_DXVK_DEBUG WINEDLLOVERRIDES="ddraw,d3d8,d3d9,d3d10core,d3d11,dxgi=n,b" WINEPREFIX=$WINEPREFIX $NSH_WINEEXE explorer $1 $2
        fi
}

#new in v1.76
function NSH_WINE_SetArch()
{
	case $APP_ARCH in
		win32)
		WINEARCH=win32
		PROGRAMFILES="Program Files"
		WINEPREFIX=$HOME/.wine32
		;;
		*)
		WINEARCH=win64
		PROGRAMFILES="Program Files (x86)"
		WINEPREFIX=$HOME/.wine
		;;
	esac
	echo "[NSH_WINE_SetArch] : $WINEARCH"
}

function NSH_UnlinkDeviceWINE()
{
	if [ -e "$WINEPREFIX" ]
	then
		if [ -h "$WINEPREFIX/dosdevices/d:" ]
		then
			echo "[NSH_UnlinkDeviceWINE] : rm $WINEPREFIX/dosdevices/d::"
			rm "$WINEPREFIX/dosdevices/d:"
		fi
	fi
}

#added in 1.80
function NSH_WINE_MountDISC()
{
	if ! hash "cdemu" > /dev/null; then
		error_exit "command $1 not found, the script won't be run."
	fi
	if [ ! $(cdemu status | grep -c $1) -eq 0 ]
	then
		echo "[NSH_WINE_MountCD] : cdemu unload $2"
		cdemu unload $2
	fi
    echo "[NSH_WINE_MountCD] : cdemu load $2 ${NSH_SHAREDIR}/${domain}/cdrom/$1"
	cdemu load $2 ${NSH_SHAREDIR}/${domain}/cdrom/$1
    NSH_CreateTmpCDDomainDir
    NSH_WINE_LinkDISC
}

#updated in 1.80
function NSH_WINE_UnMountDISC()
{
	if ! hash "cdemu" > /dev/null; then
		error_exit "command $1 not found, the script won't be run."
	fi
	if [ $(cdemu status | grep -c $1) -eq 1 ]
	then
		echo "[NSH_WINE_UMmountCD] : cdemu unload $1"
		cdemu unload $1
        NSH_WINE_UnlinkDISC
	fi
}

#updated in 1.80
function NSH_WINE_LinkDISC()
{
	if [ -e "$WINEPREFIX" ]
	then
		if [ ! -h "$WINEPREFIX/dosdevices/d:" ]
		then
			NSH_UnlinkDeviceWINE
            echo "[NSH_WINE_LinkDISC] : mount $(cdemu device-mapping | awk '$1 == 0 { print $2 }')"
            mount $(cdemu device-mapping | awk '$1 == 0 { print $2 }')
            echo "[NSH_WINE_LinkDISC] : ln -s $(findmnt -n -o TARGET --source $(cdemu device-mapping | awk '$1 == 0 { print $2 }')) "$WINEPREFIX/dosdevices/d:""
            ln -s $(findmnt -n -o TARGET --source $(cdemu device-mapping | awk '$1 == 0 { print $2 }')) "$WINEPREFIX/dosdevices/d:"
		fi
	fi
}

#updated in 1.80
function NSH_WINE_UnlinkDISC()
{
	if [ -e "$WINEPREFIX" ]
	then
		if [ -h "$WINEPREFIX/dosdevices/d:" ]
		then
			echo "[NSH_WINE_UnlinkDISC] : rm $WINEPREFIX/dosdevices/d:"
			rm "$WINEPREFIX/dosdevices/d:"
			NSH_RemoveTmpCDDomainDir
		fi
	fi
}


#MAME
#---------------------------------------------------------------------
#added in v1.32
NSH_MAME_ROMPATH="/usr/share/games/mame/roms;/usr/share/games/mame/softwarelistroms"
#added in v1.32
NSH_MAME_SAMPLEPATH="/usr/share/games/mame/samples"
#added in v1.57
NSH_MAME_ARTPATH="/usr/share/games/mame/artwork"
#added in v1.79
NSH_MAME_HASHPATH="/usr/share/games/mame/hash"
NSH_MAME_CTRLPATH="/usr/share/games/mame/ctrlr"
NSH_MAME_BGFXPATH="/usr/share/games/mame/bgfx"
#added in v1.33
NSH_SHADERLNG_VERSION=$(glxinfo | grep "OpenGL core profile shading language version"|cut -d: -f2|cut -b -2)
#added in v1.44
NSH_MAMEPSX_OPTION="-memcard1 $HOME/.local/share/games/mame/psj/card1.mcd -memcard2 $HOME/.local/share/games/mame/psj/card2.mcd"
#added in v1.64
function NSH_INFO_TO7TAPE()
{
	zenity --info --title="Aide au chargement du jeu" --width 400 --height 200 --text="1 : Choisissez l'option 2 avec la souris\n     (Le jeu se charge par cassette)\n\n2 : Scroll Lock ou Arret Défil\n     F10 puis F9 pour accelerer le temps jusqu'a skip 10/10\n\n3 : F10 pour revenir à auto 0/10\n     Scroll Lock ou Arrêt défil pour retrouver le clavier du to7"
}

#added in v1.32
function NSH_std_usage_mame()
{
	if [ $(which gettext) ]; then
		gettext="gettext --domain=${domain} -s --"
	else
		gettext=echo
	fi

	$gettext "Start $APP_FULLNAME - $APP_DESC"
	echo
	$gettext "Usage: $0 [option]"
	$gettext "Options :"
	$gettext "    --help				display this help and exit"
	$gettext "    --noshader				run game without shader"
}

#updated in v1.67 $XDG_DATA_HOME for mame
function NSH_MAME_CreateUserDataDir()
{
	if [ ! -e $HOME/.local/share/games/mame ]
	then
		echo "[NSH_MAME_CreateUserDataDir] : mkdir -p $HOME/.local/share/games/mame"
		mkdir -p $HOME/.local/share/games/mame
	fi
}

#added in v1.44 create empty memory card for playstation1
#as we can't create a memory card from mame
#psj is used cause it's the parent for ps1
function NSH_MAME_InitPSXMemoryCard()
{
	if [ ! -e $HOME/.local/share/games/mame/softwarelistroms/psj ]
	then
		echo "[NSH_MAME_InitPSXMemoryCard] : mkdir -p $HOME/.local/share/games/mame/softwarelistroms/psj"
		mkdir -p $HOME/.local/share/games/mame/softwarelistroms/psj
	fi
	#memory card 1
	if [ ! -e $HOME/.local/share/games/mame/softwarelistroms/psj/card1.mcd ]
	then
		echo "[NSH_MAME_InitPSXMemoryCard] : cp /usr/share/common-install-function-ddebs/empty_psxcard.mcd $HOME/.local/share/games/mame/softwarelistroms/psj/card1.mcd"
		cp /usr/share/common-install-function-ddebs/empty_psxcard.mcd $HOME/.local/share/games/mame/softwarelistroms/psj/card1.mcd
	fi
	#memory card 2
	if [ ! -e $HOME/.local/share/games/mame/softwarelistroms/psj/card2.mcd ]
	then
		echo "[NSH_MAME_InitPSXMemoryCard] : cp /usr/share/common-install-function-ddebs/empty_psxcard.mcd $HOME/.local/share/games/mame/softwarelistroms/psj/card2.mcd"
		cp /usr/share/common-install-function-ddebs/empty_psxcard.mcd $HOME/.local/share/games/mame/softwarelistroms/psj/card2.mcd
	fi
}

#updated in v1.64
function NSH_MAME_set_shader()
{
	NSH_MAME_VIDEO="-waitvsync -syncrefresh -nofilter -gl_forcepow2texture -gl_glsl -gl_notexturerect -video bgfx -bgfx_screen_chains crt-geom-deluxe,crt-geom-deluxe,crt-geom-deluxe"
}

#updated in v1.64
function NSH_MAME_set_noshader()
{
	NSH_MAME_VIDEO="-waitvsync -syncrefresh -nofilter -gl_forcepow2texture -gl_glsl -gl_notexturerect "
}

#added in v1.69
function NSH_MAME_run_exe()
{
	echo "[NSH_MAME_run_exe] : /usr/games/mame -noreadconfig -hashpath $NSH_MAME_HASHPATH -ctrlrpath $NSH_MAME_CTRLPATH -artpath $NSH_MAME_ARTPATH -rompath "$NSH_MAME_ROMPATH" -samplepath $NSH_MAME_SAMPLEPATH -cfg_directory $NSH_LOCALUSERCONFIG/mame/cfg -nvram_directory $HOME/.local/share/games/mame/nvram -input_directory $HOME/.local/share/games/mame/inp -state_directory $HOME/.local/share/games/mame/sta -snapshot_directory $HOME/.local/share/games/mame/snap -diff_directory $HOME/.local/share/games/mame/diff -comment_directory $HOME/.local/share/games/mame/comments -bgfx_path $NSH_MAME_BGFXPATH $NSH_MAME_VIDEO -ctrlr $NSH_MAME_CTRLRCONFIG $NSH_MAME_GAME $NSH_MAME_SOFT $NSH_MAME_BOOT_CMD $1"
	/usr/games/mame -noreadconfig -hashpath $NSH_MAME_HASHPATH -ctrlrpath $NSH_MAME_CTRLPATH -artpath $NSH_MAME_ARTPATH -rompath "$NSH_MAME_ROMPATH" -samplepath $NSH_MAME_SAMPLEPATH -cfg_directory $NSH_LOCALUSERCONFIG/mame/cfg -nvram_directory $HOME/.local/share/games/mame/nvram -input_directory $HOME/.local/share/games/mame/inp -state_directory $HOME/.local/share/games/mame/sta -snapshot_directory $HOME/.local/share/games/mame/snap -diff_directory $HOME/.local/share/games/mame/diff -comment_directory $HOME/.local/share/games/mame/comments -bgfx_path $NSH_MAME_BGFXPATH $NSH_MAME_VIDEO -ctrlr $NSH_MAME_CTRLRCONFIG $NSH_MAME_GAME $NSH_MAME_SOFT $NSH_MAME_BOOT_CMD $1
}

#updated in v1.64
function NSH_MAME_run()
{
	NSH_MAME_CreateUserDataDir
	if [ "$NSH_SHADERLNG_VERSION" -gt 2 ];then
		if [ "$NSH_MAME_DISABLESHADER" -eq 1 ];then
			echo "[NSH_MAME_run] : Shaders manually disabled"
			NSH_MAME_set_noshader
		else
			echo "[NSH_MAME_run] : Vulkan, OpenGL > 3 or shaders enabled manually"
			NSH_MAME_set_shader
		fi
	else
		echo "[NSH_MAME_run] : OpenGL < 2 - disable shader"
		NSH_MAME_set_noshader
	fi
	NSH_MAME_run_exe
}

#updated in v1.64
function NSH_MAME_runPSX()
{
	NSH_MAME_CreateUserDataDir
	NSH_MAME_InitPSXMemoryCard
	if [ "$NSH_SHADERLNG_VERSION" -gt 2 ];then
		if [ "$NSH_MAME_DISABLESHADER" -eq 1 ];then
			NSH_MAME_set_noshader
		else
			NSH_MAME_set_shader
		fi
	else
		NSH_MAME_set_noshader
	fi
	NSH_MAME_run_exe "-port1 dualshock_pad -port2 dualshock_pad -memc1 $HOME/.local/share/games/mame/softwarelistroms/psj/card1.mcd -memc2 $HOME/.local/share/games/mame/softwarelistroms/psj/card2.mcd"
}
