#!/bin/bash

show_scoreboard()
{
local boardName=".$(basename "$0").scoreboard"
if [ -f "$boardName" ] ; then
clear
echo -e "\nHigh Scores\n"
cat $boardName
local continue
read -n 1 -p "Press any key to continue: " continue
echo ""
fi
}

high_score()
{
local boardName=".$(basename "$0").scoreboard"
local newHighScore=0
local i=1
if [ ! -f "$boardName" ] ; then
local newHighScore=1
while [ $i -le 10 ] ; do
local score[$i]="0 anonymous"
let i++
done
else
while IFS=$'\n' read line ; do
local score[$i]="$line"
local oldScore=$(echo "${score[$i]}" | cut -d ' ' -f 1)
if [ $1 -gt $oldScore -a $newHighScore == 0 ] ; then
local newHighScore=$i
fi
let i++
done < $boardName
fi
if [ $newHighScore -gt 0 ] ; then
local continue="n"
echo "Congratulations! You beat the score at position $newHighScore!"
while [ "${continue^}" != "Y" ] ; do
read -ep "Enter your name: " name
if [ -z "$name" ] ; then
local name="Anonymous"
fi
read -n 1 -p "is $name correct? " continue
done
if [ $newHighScore -le 5 ] ; then
read -n 1 -p "Post this score to GNU Social? " answer
if [ "${answer^}" = "Y" ] ; then
read -p "Enter your webfinger, e.g. storm@social.stormdragon.tk: " answer
result="$(curl --connect-timeout 60 -s -u "${answer%@*}" -d status="I just got the number $newHighScore position in #${0##*/} on my local scoreboard with $1 points using the ${sound##*/} soundpack! Wanna play? http://github.com/stormdragon2976/storm-games #storm-games" -d source="${0##/*}" https://${answer#*@}/api/statuses/update.xml | grep '^  <text>' | sed -e 's/^  <text>//' -e 's/<\/text>$//')"
echo "$result"
fi
fi
i=11
while [ $i -gt $newHighScore ] ; do
score[$i]="${score[$(echo "$i - 1" | bc)]}"
let i--
done
local name="$(echo "${name^}" | tr " " "_")"
local score[$newHighScore]="$1 $name"
local i=1
local scoreBoard=""
while [ $i -le 10 ] ; do
local scoreBoard="${scoreBoard}${score[$i]}\n"
let i++
done
echo -e "${scoreBoard:0:-2}" > $boardName
fi
}

show_instructions()
{
cat << EOF
To play, first choose the number of the sound pack you want.
When the game starts, use iether s or j for the left, d or k for the center, or l or f for the right.
To add sound packs, add a directory with the name of the soundpack under the sounds directory.
cpu and player.ogg sounds should be aprox .25 seconds in linkgth. Reward and lose sounds are optional.
Background sounds are optional too.

EOF
}

play_stop_bgm()
{
if [ "$1" == "play" ] ; then
if [ -f "$2/bgm.ogg" ] ; then
play -qV0 $2/bgm.ogg repeat 9999&
__bgmPID="$(echo "$!")"
fi
elif [ "$1" == "stop" ] ; then
if [[ "$__bgmPID" =~ ^[0-9]+$ ]] ; then
kill $__bgmPID
unset __bgmPID
fi
fi
}

select_soundpack()
{
local __soundPackVariable=$1
local i=1
for x in sounds/* ; do
if [ -d "$x" ] ; then
local soundPackList[$i]="$x"
if [ $i -lt 10 ] ; then
echo -n "0"
fi
echo "$i: $(basename "$x")"
let i++
fi
done
local continue="false"
while [ "$continue" == "false" ] ; do
local continue="true"
read -p "Select a soundpack: " soundpack
if ! [[ "$soundpack" =~ ^[0-9]+$ ]] ; then
local continue="false"
else
if ! [[ "$soundpack" =~ [1-9]+$ ]] ; then
local continue="false"
fi
if [ $soundpack -lt 1 -o $soundpack -gt $(($i - 1)) ] ; then
local continue="false"
fi
fi
done
if [[ $__soundPackVariable ]] ; then
eval $__soundPackVariable="'${soundPackList[$soundpack]}'"
else
echo "${soundPackList[$soundPack]}"
fi
}

play_bopit_direction()
{
local soundpack=$1
local __directionVariable=$2
direction="$(shuf -n 1 -e "center" "left" "right")"
case "$direction" in
"center")
play -qV0 $(shuf -n 1 -e $soundpack/cpu*ogg) remix v0.9 v0.9&
;;
"left")
play -qV0 $(shuf -n 1 -e $soundpack/cpu*ogg) remix v0.9 v0.1&
;;
"right")
play -qV0 $(shuf -n 1 -e $soundpack/cpu*ogg) remix v0.1 v0.9&
;;
esac
if [[ $__directionVariable ]] ; then
eval $__directionVariable="'$direction'"
else
echo "$direction"
fi
}

#Main Game Loop
while [ -z "$answer" ] ; do
read -n 1 -p "Would you like instructions? " answer
if [ "${answer^}" == "Y" ] ; then
show_instructions
read -n 1 -p "Press any key to continue. " answer
fi
done
gameLoop="true"
while [ "$gameLoop" == "true" ] ; do
clear
select_soundpack sound
speed="1.00"
continue="true"
if [ -f "$sound/intro.ogg" ] ; then
play -qV0 $sound/intro.ogg
else
echo "Ready"
echo
sleep 1
echo "set"
echo
sleep 1
echo "go"
fi
play_stop_bgm play $sound
difficultyIndex=0
score=0
while [ "$continue" == "true" ] ; do
if [ $difficultyIndex -ge 2 ] ; then
difficultyIndex=0
if [ "$speed" != "0.01" ] ; then
speed="$(echo "scale=2;$speed - .01" | bc)"
fi
fi
play_bopit_direction $sound bopDirection
read -st $speed -n 1 key
case "${key^}" in
"S" | "J")
key="left"
;;
"D" | "K")
key="center"
;;
"F" | "L")
key="right"
;;
esac
if [ "$key" != "$bopDirection" ] ; then
continue="false"
else
let score++
case "$key" in
"center")
play -qV0 $(shuf -n 1 -e $sound/player*ogg) remix v0.9 v0.9
;;
"left")
play -qV0 $(shuf -n 1 -e $sound/player*ogg) remix v0.9 v0.1
;;
"right")
play -qV0 $(shuf -n 1 -e $sound/player*ogg) remix v0.1 v0.9
;;
esac
if [ $(($score % 15)) -eq 0 ] ; then
if [ -f "$sound/reward.ogg" ] ; then
play -qV0 $(shuf -n 1 -e $sound/reward*ogg)
fi
fi
fi
let difficultyIndex++
done
play_stop_bgm stop
if [ -f "$sound/lose.ogg" ] ; then
play -qV0 $(shuf -n 1 -e $sound/lose*ogg)
fi
echo
echo "Score: $score."
high_score $score
show_scoreboard
read -n 1 -p "Play again? " answer
echo
if [ "${answer^}" != "Y" ] ; then
gameLoop="false"
fi
done
exit 0
