#!/usr/bin/env bash

# =============================================================================
# convert_artwork.sh
# -----------------------------------------------------------------------------
# convert BD style artwork from static and template files to final artwork sets
# =============================================================================

ORIG_BASE_DIR="artwork"
ORIG_SND_DIR="sounds"
ORIG_MUS_DIR="music"

ORIG_LEVELS_DIR="caves"

FILES_DIR="$ORIG_BASE_DIR/files"
BUILD_DIR="$ORIG_BASE_DIR/BUILD"

ARTWORK_TYPES="gfx snd mus"
ARTWORK_PREFIX_SET="krissz"
ARTWORK_PREFIX_ALL="ALL"

CONF_FILE_GIC_TITLE="gfx_krissz_boulder_dash/graphics/gic_title_dynamic.conf"
CONF_FILE_GIC_TITLE_SRC="$FILES_DIR/$CONF_FILE_GIC_TITLE"
CONF_FILE_GIC_TITLE_DST="$BUILD_DIR/$CONF_FILE_GIC_TITLE"

CONF_FILE_GIC_GAME="graphics/gic_game.conf"
CONF_FILES="$CONF_FILE_GIC_GAME"

GFX_SET_BOULDER_RUSH="gfx_krissz_boulder_rush"
SND_SET_BOULDER_DASH="snd_krissz_boulder_dash"
MUS_SET_BOULDER_DASH="mus_krissz_boulder_dash"

declare -A GFX_FILES_BOULDER_DASH=\
(							\
    ["_GFX_FILE_DEFAULT_"]="c64_gfx.png"		\
    ["_GFX_FILE_EDITOR_"]="c64_gfx_editor.png"		\
)

declare -A GFX_FILES_BOULDER_RUSH=\
(							\
    ["_GFX_FILE_DEFAULT_"]="boulder_rush.png"		\
    ["_GFX_FILE_EDITOR_"]="boulder_rush_editor.png"	\
)

declare -A GFX_FILES_BOULDER_RUSH_CWS=\
(							\
    ["_GFX_FILE_DEFAULT_"]="boulder_rush_cws.png"		\
    ["_GFX_FILE_EDITOR_"]="boulder_rush_cws_editor.png"	\
)

declare -A SND_FILES_MAPPING=\
(							\
    ["stone.ogg"]="stone_wall.wav"			\
    ["slime.ogg"]="slime_lava_replicator.wav"		\
    ["expanding_wall.ogg"]="SKIP"			\
    ["falling_wall.ogg"]="SKIP"				\
    ["lava.ogg"]="SKIP"					\
    ["replicator.ogg"]="SKIP"				\
)


# -----------------------------------------------------------------------------
# functions
# -----------------------------------------------------------------------------

create_gic_digit ()
{
    POS=$1
    DIGIT=$2

    BASE_FRAME=16
    START_FRAME=$(( BASE_FRAME + DIGIT ))

    LINE="gfx.global.anim_$POS.TITLE_INITIAL.start_frame:		$START_FRAME"

    echo "$LINE" >> "$CONF_FILE_GIC_TITLE_DST"
}

create_gic_digits_from_number ()
{
    POS=$1
    NUMBER=$2
    NUMBER_TYPE=$3

    # needed for output of "wc -l" on Mac
    NUMBER=`echo $NUMBER | awk '{ print $1 }'`

    echo "  * creating GIC digits for $NUMBER $NUMBER_TYPE"

    echo "" >> "$CONF_FILE_GIC_TITLE_DST"

    for (( i = 0; i < ${#NUMBER}; i++ )); do
        create_gic_digit "$POS" "${NUMBER:$i:1}"
        (( POS++ ))
    done
}


# -----------------------------------------------------------------------------
# main
# -----------------------------------------------------------------------------

if [ ! -d "$FILES_DIR" ]; then
    echo "ERROR: Source directory '$FILES_DIR' does not exist!"

    exit 10
fi

if [ -d "$BUILD_DIR" ]; then
    echo "ERROR: Target directory '$BUILD_DIR' already exists!"

    exit 10
fi

mkdir -p "$BUILD_DIR"

echo "Converting Krissz artwork to R'n'D artwork sets ..."

for TYPE in $ARTWORK_TYPES; do
    echo "- converting $TYPE sets ..."

    for LEVELSET_DIR in "$FILES_DIR/${TYPE}"_${ARTWORK_PREFIX_SET}_*; do
	SET=`basename "$LEVELSET_DIR"`

	echo "  * copying static files for artwork set '$SET' ..."

	if [ -d "$FILES_DIR/${TYPE}_${ARTWORK_PREFIX_ALL}" ]; then
	    rsync -a $FILES_DIR/${TYPE}_${ARTWORK_PREFIX_ALL}/ $BUILD_DIR/$SET/
	fi

	rsync -a "$LEVELSET_DIR" "$BUILD_DIR"
    done
done

echo "- creating dynamic GIC file for title screen ..."

NUM_LEVELS=`find "$ORIG_LEVELS_DIR/" | egrep "\.(cave|demo)\." | wc -l`
NUM_LEVELSETS=`find "$ORIG_LEVELS_DIR/" | grep html | sed "s/[^\/]*html//" | sort -u | wc -l`

create_gic_digits_from_number "10" "$NUM_LEVELS" "levels"
create_gic_digits_from_number "20" "$NUM_LEVELSETS" "level sets"

echo "- converting sound files ..."

for SND_FILENAME_OGG in $ORIG_SND_DIR/*.ogg; do
    SND_BASENAME_OGG=`basename "$SND_FILENAME_OGG"`
    SND_BASENAME_WAV=${SND_FILES_MAPPING["$SND_BASENAME_OGG"]}
    SND_PREFIX=`echo "$SND_BASENAME_OGG" | sed -e "s/-.*//"`

    if [ "$SND_PREFIX" = "music" ]; then
        # skip music files

	continue
    fi

    if [ "$SND_BASENAME_WAV" = "SKIP" ]; then
	echo "  * skipping duplicate sound file '$SND_BASENAME_OGG' ..."

	continue
    fi

    if [ "$SND_BASENAME_WAV" = "" ]; then
	SND_BASENAME_WAV=`basename "$SND_FILENAME_OGG" ".ogg"`.wav
    fi

    SND_FILENAME_WAV="$BUILD_DIR/$SND_SET_BOULDER_DASH/sounds/$SND_BASENAME_WAV"

    echo "  * converting sound file '$SND_BASENAME_OGG' to '$SND_BASENAME_WAV' ..."

    ffmpeg -i "$SND_FILENAME_OGG" "$SND_FILENAME_WAV" 2> /dev/null

    if [ "$?" != "0" ]; then
	echo "ERROR: converting sound file '$SND_BASENAME_OGG' failed!"

	exit 10
    fi
done

echo "- converting music files ..."

for MUS_FILENAME_OGG in $ORIG_MUS_DIR/*.ogg; do
    MUS_BASENAME_OGG=`basename "$MUS_FILENAME_OGG"`
    MUS_BASENAME_MP3=`basename "$MUS_FILENAME_OGG" ".ogg"`.mp3
    MUS_PREFIX=`echo "$MUS_BASENAME_OGG" | sed -e "s/-.*//"`

    if [ "$MUS_PREFIX" != "music" ]; then
        # skip non-music files

	continue
    fi

    MUS_FILENAME_MP3="$BUILD_DIR/$MUS_SET_BOULDER_DASH/music/$MUS_BASENAME_MP3"

    echo "  * converting music file '$MUS_BASENAME_OGG' to '$MUS_BASENAME_MP3' ..."

    ffmpeg -i "$MUS_FILENAME_OGG" "$MUS_FILENAME_MP3" 2> /dev/null

    if [ "$?" != "0" ]; then
	echo "ERROR: converting music file '$MUS_BASENAME_OGG' failed!"

	exit 10
    fi
done

echo "- creating top-level config file ..."

cp -a "$FILES_DIR/levelinfo.conf" "$BUILD_DIR"

echo "Done"

exit 0
