#!/bin/bash

# .uaerc:
#floppy2type=0
#floppy3type=0
#sound_latency=500
#chipmem_size=2
#bogomem_size=4
#fastmem_size=1

export gamesdir zipdir kick
: ${gamesdir:="$HOME/amiga/games"}
: ${zipdir:="$HOME/amiga/zips"}
: ${kick:="$HOME/amiga/kick.rom"}
: ${nice:=-10}

unzip_game() {
	zip="$1"
	game=`basename "$zip"`
	game="${game%.zip}"
	game="$gamesdir/$game"
	if [ ! -e "$game" ]; then
		if unzip -d "$game" -x "$zip" >&2; then
			:
		else
			message "unzip failed: $zip"
			rm -rf "$game"
			return 1
		fi
		( cd "$game" &&
		  fix_numbers_in_filenames * &&
		  rename '
		    our %num;
		    BEGIN {
		      %num = (
		        one=>1, two=>2, three=>3, four=>4, five=>5, six=>6,
			i=>1, ii=>2, iii=>3, iv=>4, v=>5, vi=>6
		      );
		    }
		    s/(disk\W?)(\w+)/$1.($num{lc $2} ? sprintf("%04d", $num{lc $2}) : $2)/ie;
		    my $n = 4;
		    if (/startup|boot/i) { $n = 0; } elsif (/program|playdisk/i) { $n = 1; } elsif (/data|levels/i) { $n = 2; } elsif (/sound/i) { $n = 3; }
		    $_ = "${n}_$_";
		  ' *
		)
	fi
	echo "$game"
	return 0
}

fix_disk() {
	if [ -n "$1" ]; then
		case "$1" in
		*/*)	echo "$1" ;;
		*)	echo "$game/$1" ;;
		esac
	fi
}

mkdir -p "$gamesdir"
game="$1"
case "$game" in
*AGA* | *aga*) aga=1
esac
if [ -n "$game" ]; then
	case "$game" in
	*.zip)	game=`unzip_game "$game"`
		;;
	*.ipf | *.adf)
		game=`temp -d`
		cp "$@" "$game"/
		;;
	*)	if [ ! -d "$game" ]; then
			game="$gamesdir/$game"
		fi
		if [ ! -d "$game" ]; then
			export base=`basename "$1"`
			game=`ls "$gamesdir"/ | perl -ne 'if (/^\Q$ENV{base}\E/i) { print "$ENV{gamesdir}/$_"; exit 0; }'`
		fi
		if [ ! -d "$game" ]; then
			export base=`basename "$1"`
			game=$(
			ls "$zipdir"/ | perl -ne 'if (/^\Q$ENV{base}\E/i) { print "$ENV{zipdir}/$_"; }' |
			while read zip; do
				if [ -f "$zip" ]; then
					unzip_game "$zip" && break
				fi
			done
			)
		fi
		;;
	esac
	if [ ! -d "$game" ]; then
		message "game not found: $1"
		exit 1
	fi
	echo "$game"
	find "$game" -type f \( -name '*.ipf' -or -name '*.adf' \) | sort
else
	:
fi |
{
	read game
	if [ -z "$disk0" ]; then
		read disk0
		[ -z "$disk1" ] && read disk1
		[ -z "$disk2" ] && read disk2
		[ -z "$disk3" ] && read disk3
	fi
#	cd ~/amiga
	cd "$game"
	cp "$HOME/.uaerc" "$game"/
	export HOME="$game"
	[ -n "$start" ] && amiga_opts="$amiga_opts -s use_gui=false"
	[ "$fast" = 1 -o "$fast" = c ] && amiga_opts="$amiga_opts -s cpu_speed=max"
	if [ -n "$disk" ]; then
		amiga_opts="$amiga_opts -s floppy_speed=$disk"
	else
		[ "$fast" = 1 -o "$fast" = d ] && amiga_opts="$amiga_opts -s floppy_speed=800"
	fi
	if [ -n "$small" ]; then
		amiga_opts="$amiga_opts -s gfx_lores=true -s gfx_linemode=none -s gfx_width_windowed=360 -s gfx_height_windowed=284"
	elif [ ! -n "$medium" ]; then
		amiga_opts="$amiga_opts -s gfx_fullscreen_amiga=true"
	fi
	[ -n "$aga" ] && amiga_opts="$amiga_opts -s cpu_type=68ec020 -s chipset=aga -s chipmem_size=8 -s fastmem_size=4 -s bogomem_size=0 -s cpu_speed=max"
	  # aga / amiga 1200 needs a different kick ROM too
	[ -n "$disk0" ] && amiga_opts="$amiga_opts -s floppy0=`shesc "$disk0"`"
	[ -n "$disk1" ] && amiga_opts="$amiga_opts -s floppy1=`shesc "$disk1"`"
	[ -n "$disk2" ] && amiga_opts="$amiga_opts -s floppy2=`shesc "$disk2"`"
	[ -n "$disk3" ] && amiga_opts="$amiga_opts -s floppy3=`shesc "$disk3"`"
	[ -n "$kick" ] && amiga_opts="$amiga_opts -s kickstart_rom_file=$kick"
	nice_cmd=""
	[ -n "$nice" -a "$nice" != 0 -a "$nice" != -0 ] && nice_cmd="nice -n $nice"
	echo uae $nice_cmd $amiga_opts
	if [ -n "$debug" ]; then
		echo "  press a key"
		read -n 1 <&2 dummy
	fi
	xset s off
	eval uae $nice_cmd $amiga_opts
	xrandr -s 0
}
