259 lines
5.8 KiB
Bash
Executable File
259 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
finish_cpu()
|
|
{
|
|
play -qV0 sounds/finish_cpu.ogg&
|
|
local key=""
|
|
local sound=cpu_fall
|
|
read -sn 4 -t 3 key
|
|
case "$key" in
|
|
"jiki" | "sede")
|
|
local sound="chopper"
|
|
;;
|
|
"kijl" | "desf")
|
|
local sound="breaker"
|
|
;;
|
|
"lijk" | "fesd")
|
|
local sound="king_of_the_hill"
|
|
;;
|
|
"kill" | "deff")
|
|
local sound="blood_eagle"
|
|
;;
|
|
esac
|
|
play -qV0 sounds/$sound.ogg
|
|
}
|
|
|
|
speak_verses()
|
|
{
|
|
#name is first argument, voice is second.
|
|
local name="$1"
|
|
local voice="$2"
|
|
echo "Verses $name..."
|
|
espeak -v en-us -a 200 "Verses" &> /dev/null
|
|
espeak -v $voice -a 200 "$name" &> /dev/null
|
|
}
|
|
|
|
play_intro()
|
|
{
|
|
local introLength="$(soxi sounds/intro.ogg | grep Duration | cut -d ':' -f2- | cut -d '=' -f1 | sed -e 's/00://g')"
|
|
play -qV0 sounds/intro.ogg&
|
|
local soundPID=$(echo "$!")
|
|
local continue=""
|
|
read -n 1 -t $introLength continue
|
|
if [ -n "$continue" ] ; then
|
|
kill $soundPID
|
|
sleep .5
|
|
fi
|
|
}
|
|
|
|
generate_enemy()
|
|
{
|
|
local __cpuInfo=$1
|
|
local level=$2
|
|
local hitpoints=$(($level * 5))
|
|
if [ $hitpoints -gt 25 ] ; then
|
|
local hitpoints=25
|
|
fi
|
|
if [ $level -gt 8 ] ; then
|
|
local defence=8
|
|
else
|
|
local defence=$level
|
|
fi
|
|
if [ $level -gt 5 ] ; then
|
|
local precision=5
|
|
else
|
|
local precision=$level
|
|
fi
|
|
local name="$(shuf -n 1 names.txt)"
|
|
local voice="$(shuf -n 1 -e "en-sc" "en-us+m1" "en-us+m2" "en-us+m" "en-us+m4" "en-us+m5" "en-us+m6" "en-us+m7")"
|
|
# returns name:hitpoints:defence:precision:voice
|
|
local info="$name:$hitpoints:$defence:$precision:$voice"
|
|
if [[ $__cpuInfo ]] ; then
|
|
eval $__cpuInfo="'$info'"
|
|
else
|
|
echo "$info"
|
|
fi
|
|
}
|
|
|
|
show_instructions()
|
|
{
|
|
local continue=""
|
|
cat << EOF
|
|
You are Wolfgang the warrior. Mighty in Odin's army, you and your brothers have faught off invasion after invasion.
|
|
Now, however, the greatest foe you have ever faught has broken your army, and hounds the warriors as they retreatthrough the mountains.
|
|
But now, a chance has been given to your force. One person must stay in a high narrow pass,
|
|
and that person must hold off the army persuing you long enough for your brothers to escape and regroup. So, as you take your position in the pass, you know your time remaining on Midgard is short.
|
|
Your task is important, for should you fail, Ragnarok itself may be brought upon us all.
|
|
Controls:
|
|
s, j: attack left
|
|
d, k: attack center
|
|
e, i: attack up
|
|
f, l: attack right
|
|
qw, r, a, g, h,u, o, z, v, m .: Catch bonus
|
|
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
|
|
}
|
|
|
|
play_attack()
|
|
{
|
|
local __directionVariable=$1
|
|
local precision=$2
|
|
direction="$(shuf -n 1 -e "center" "left" "right" "up")"
|
|
bonusCheck=$(rolldice 1d10)
|
|
if [ $bonusCheck -eq 10 -a "$direction" != "up" ] ; then
|
|
local bonus="true"
|
|
local sound="bonus"
|
|
else
|
|
local bonus="false"
|
|
local sound="cpu_attack"
|
|
fi
|
|
case "$direction" in
|
|
"center")
|
|
play -qV0 $(shuf -n 1 -e sounds/$sound*ogg) remix v0.9 v0.9&
|
|
;;
|
|
"up")
|
|
play -qV0 $(shuf -n 1 -e sounds/jump*ogg) remix v0.9 v0.9&
|
|
;;
|
|
"left")
|
|
play -qV0 $(shuf -n 1 -e sounds/$sound*ogg) remix v0.9 v0.$precision&
|
|
;;
|
|
"right")
|
|
play -qV0 $(shuf -n 1 -e sounds/$sound*ogg) remix v0.$precision v0.9&
|
|
;;
|
|
esac
|
|
if [[ $__directionVariable ]] ; then
|
|
eval $__directionVariable="'$bonus:$direction'"
|
|
else
|
|
echo "$bonus:$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
|
|
play_intro
|
|
gameLoop="true"
|
|
while [ "$gameLoop" == "true" ] ; do
|
|
clear
|
|
speed="1.00"
|
|
continue="true"
|
|
play -qV0 $sound/intro.ogg
|
|
play_stop_bgm play sounds/
|
|
level=1
|
|
oldLevel=1
|
|
playerHitpoints=3
|
|
generate_enemy cpuInfo $level
|
|
cpuName="$(echo "$cpuInfo" | cut -d ':' -f 1)"
|
|
cpuHitpoints="$(echo "$cpuInfo" | cut -d ':' -f 2)"
|
|
cpuDefence="$(echo "$cpuInfo" | cut -d ':' -f 3)"
|
|
cpuPrecision="$(echo "$cpuInfo" | cut -d ':' -f 4)"
|
|
cpuVoice="$(echo "$cpuInfo" | cut -d ':' -f 5)"
|
|
speak_verses "$cpuName" $cpuVoice
|
|
while [ $playerHitpoints -gt 0 ] ; do
|
|
if [ $level -ne $oldLevel ] ; then
|
|
oldLevel=$level
|
|
if [ "$speed" != "0.01" ] ; then
|
|
speed="$(echo "scale=2;$speed - .01" | bc)"
|
|
fi
|
|
fi
|
|
play_attack attackInfo $cpuPrecision
|
|
bonus="$(echo "$attackInfo" | cut -d ':' -f1)"
|
|
attackDirection="$(echo "$attackInfo" | cut -d ':' -f2)"
|
|
read -st $speed -n 1 key
|
|
case "${key^}" in
|
|
"S" | "J")
|
|
key="left"
|
|
;;
|
|
"D" | "K")
|
|
key="center"
|
|
;;
|
|
"F" | "L")
|
|
key="right"
|
|
;;
|
|
"E" | "I")
|
|
key="up"
|
|
;;
|
|
"W" | "R" | "A" | "G" | "Z" | "C" | "V" | "U" | "O" | "M" | "," | ".")
|
|
key="bonus"
|
|
;;
|
|
esac
|
|
if [ "$bonus" == "true" -a "$key" == "bonus" ] ; then
|
|
playerSound="player_bonus"
|
|
else
|
|
if [ "$key" != "$attackDirection" ] ; then
|
|
let playerHitpoints--
|
|
echo "$playerHitpoints"
|
|
playerSound="player_hit"
|
|
else
|
|
playerAttack=$(rolldice 1d10)
|
|
if [ $playerAttack -gt $cpuDefence ] ; then
|
|
let cpuHitpoints--
|
|
playerSound="hit_cpu"
|
|
if [ $cpuHitpoints -le 0 ] ; then
|
|
finish_cpu
|
|
let level++
|
|
generate_enemy cpuInfo $level
|
|
cpuName="$(echo "$cpuInfo" | cut -d ':' -f 1)"
|
|
cpuHitpoints="$(echo "$cpuInfo" | cut -d ':' -f 2)"
|
|
cpuDefence="$(echo "$cpuInfo" | cut -d ':' -f 3)"
|
|
cpuPrecision="$(echo "$cpuInfo" | cut -d ':' -f 4)"
|
|
cpuVoice="$(echo "$cpuInfo" | cut -d ':' -f 5)"
|
|
speak_verses "$cpuName" $cpuVoice
|
|
key=""
|
|
fi
|
|
else
|
|
playerSound="blocked"
|
|
fi
|
|
fi
|
|
fi
|
|
case "$key" in
|
|
"bonus" | "center" | "up")
|
|
play -qV0 $(shuf -n 1 -e sounds/$playerSound*ogg) remix v0.9 v0.9
|
|
;;
|
|
"left")
|
|
play -qV0 $(shuf -n 1 -e sounds/$playerSound*ogg) remix v0.9 v0.$cpuPrecision
|
|
;;
|
|
"right")
|
|
play -qV0 $(shuf -n 1 -e sounds/$playerSound*ogg) remix v0.$cpuPrecision v0.9
|
|
;;
|
|
esac
|
|
if [ "$bonus" == "true" ] ; then
|
|
if [ "$key" == "bonus" ] ; then
|
|
let playerHitpoints++
|
|
fi
|
|
fi
|
|
bonus="false"
|
|
key=""
|
|
done
|
|
play_stop_bgm stop
|
|
if [ -f "sounds/lose.ogg" ] ; then
|
|
play -qV0 $(shuf -n 1 -e sounds/lose*ogg)
|
|
fi
|
|
echo
|
|
read -n 1 -p "Play again? " answer
|
|
echo
|
|
if [ "${answer^}" != "Y" ] ; then
|
|
gameLoop="false"
|
|
fi
|
|
done
|
|
exit 0
|