#!/bin/bash

##
##       [20]                          [60]                          [20]
##    |--------|--------------------------------------------------|--------|
## e:  0     19 20                                              79 80
## ee: 80    61 60                                               1 0       
##

mez="                                                                                "
hes="heslo je petrzel"

function e()
{
	line="  $1"
	if ((t > 22)); then
		part=$((80 - t))
		echo "[$((t - 22))C${line:0:$part}"
	else
		part=$((22 - t))
		echo "${line:$part:60}"
	fi
}

function e_full()
{
	line="${mez:0:$t}$1"
	echo "${line:20:60}"
}

function ee()
{
	line="$1  "
	if ((t > 60)); then
		part=$((t - 60))
		echo "${line:$part:60}"
	else
		part=$((60 - t))
		echo "[${part}C${line:0:$t}"
	fi
}

function abs()
{
	echo "[$((t - 20))C$1"
}

function up()
{
	echo -n "[$1A"
}

function down()
{
	echo -n "[$1B"
}

function home()
{
	echo -n "[H"
}

function auto()
{
	t=$1
	e " ___________   "
	e "|        |[__\\ "
	e "|        |    |"
	e "\`-(OO)----(O)-'"
}

function revauto()
{
	t=$1
	ee "   ___________ "
	ee " /__]|        |"
	ee "|    |        |"
	ee "\`-(O)----(OO)-'"
}

function mys1()
{
	t=$1
	e "___(##o."
}

function revmys1()
{
	t=$1
	ee ".o##)___"
}

function bedna()
{
	t=$1
	e "  _______  "
	e " |       | "
	e ".|_______|."
	e " |       | "
	e " |_______| "
}

function mys()
{
	local i
	local cmd
	if [ "x$1" = "x+" ]; then cmd=mys1; else cmd=revmys1; fi
	for ((i = $2; i <= $3; i++)); do
		down $4
		$cmd $i
		home
		sleep 0.1
	done
}

function bub()
{
	if [ -n "$2" ]; then last_bubx=$2; fi
	if [ -n "$3" ]; then last_buby=$3; fi
	if [ -n "$4" ]; then last_bubs="$4"; fi
	if [ "$1" == off ]; then
		s1="${mez:0:${#last_bubs}}"
		s2=" "
	else
		s1="$last_bubs"
		s2="/"
	fi
	t=$last_bubx
	down $last_buby
	abs "$s1"
	abs "$s2"
}

function bedna_pad()
{
	p=$1
	if ((p >= 30 && p <= 32)); then
		t=$((p - 1))
		up 2
		abs "|"
	elif ((p >= 33 && p <= 36)); then
		t=$((p - 3))
		up 3
		abs "  _"
		abs " |_"
	elif ((p >= 37 && p <= 38)); then
		t=34
		up 3
		abs "   "
		abs " /\\"
		abs " \\/"
	elif ((p >= 39 && p < 66)); then
		if [ $p -le 40 -o $((p & 3)) -eq 3 ]; then
			t=$((((p + 1) >> 2) + 25))
			typ=$((t & 1))
			if [ $typ -eq 1 ]; then
				s1="  _ "
				s2=" |_|"
			else
				s1=" /\\"
				s2=" \\/"
			fi
			up 2
			abs "$s1"
			abs "$s2"
		fi
	fi
}

function bedna_zoom()
{
	if [ $1 -eq 1 ]; then return; fi
	t=$((43 - $1))
	down $((9 - $1))
	case $1 in
	2)
		abs " ___ "
		abs "|~~~|"
		abs "|___|"
		;;
	3)
		abs " _____ "
		abs "|I:;<:|"
		abs "|     |"
		abs "|_____|"
		;;
	4)
		abs " _______ "
		abs "|FRAGILE|"
		abs "|       |"
		abs "|       |"
		abs "|_______|"
		;;
	esac
}

function bedna_ote()
{
	t=39
	case $1 in
	1)
		down 4
		abs "  _____  "
		abs "/_______\\"
		;;
	2)
		down 4
		abs " ,-----. "
		abs "|_______|"
		;;
	3)
		down 3
		abs " _______ "
		abs "|       |"
		abs "|_______|"
		;;
	4)
		t=38
		down 3
		abs "           "
		abs ".---------."
		abs " |_______| "
		;;
	5)
		t=38
		down 4
		abs "___________"
		abs "\\ _______ /"
		;;
	6)
		t=38
		down 4
		abs "           "
		abs "___________"
		abs "\`|FRAGILE|'"
		;;
	7)
		t=38
		down 5
		abs "  _______  "
		abs "/_________\\"
		;;
	8)
		t=38
		down 6
		abs " |       | "
		abs ".|_______|."
		;;
	esac
}

function kouzlo()
{
	case $1 in
	1)
		t=42
		down 4
		abs "..."
		;;
	2)
		t=40
		down 3
		abs ". .  ."
		abs " . .. "
		;;
	3)
		t=39
		down 2
		abs "   *  .  ."
		abs "*   *  *  "
		abs "   . ..   "
		;;
	4)
		t=36
		down 1
		abs "  *   *   **  ."
		abs ".   **  *   .  "
		abs "  .  * *  *   ."
		abs "               "
		;;
	esac
}

# Uses a global array variable.  Must be non-sparse.
shuffle() {
	local i tmp size max rand

	# $RANDOM % (i+1) is biased because of the limited range of $RANDOM
	# Compensate by using a range which is a multiple of the array size.
	size=${#array[*]}
	max=$(( 32768 / size * size ))

	for ((i=size-1; i>0; i--)); do
		while (( (rand=$RANDOM) >= max )); do :; done
		rand=$(( rand % (i+1) ))
		tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
	done
}

heslen=${#hes}
for ((i = 0; i < heslen; i++)); do
	array[i]=${hes:$i:1}
done

function rand_heslo()
{
	local i
	local j
	declare -a s
	shuffle
	for ((i = 0; i < heslen; i++)); do
		kam=$((RANDOM % 3))
		for ((j = 0; j < 3; j++)); do
			if ((j == kam)); then
				s[j]="${s[j]}${array[i]}"
			else
				s[j]="${s[j]} "
			fi
		done
	done
	t=35
	down 1
	abs "${s[0]}"
	abs "${s[1]}"
	abs "${s[2]}"
}

function semirand_heslo()
{
	local i
	local j
	declare -a s
	for ((i = 0; i < heslen; i++)); do
		kam=$((RANDOM % 3))
		for ((j = 0; j < 3; j++)); do
			if ((j == kam)); then
				s[j]="${s[j]}${hes:$i:1}"
			else
				s[j]="${s[j]} "
			fi
		done
	done
	t=35
	down 1
	abs "${s[0]}"
	abs "${s[1]}"
	abs "${s[2]}"
}

function heslo()
{
	t=35
	down 1
	abs "${mez:0:$heslen}"
	abs "$hes"
	abs "${mez:0:$heslen}"
}

echo "c"
sleep 1

###
#if false; then
###

for ((i = 0; i < 1600; i++)); do
	down 1
	auto $((i % 80 + 1))
	if ((i >= 50 && i < 1570)); then
		revauto $(((i + 30) % 80 + 1))
	else
		down 4
	fi
	if ((i >= 40 && i < 1560)); then
		auto $(((i + 40) % 80 + 1))
	fi
	home
	sleep 0.05
done

sleep 0.5

for ((j = 1; j <= 6; j++)); do
	if (((j & 1) == 0)); then
		cmd=auto
	else
		cmd=revauto
	fi
	for ((i = 1; i <= 80; i++)); do
		down $j
		$cmd $i
		if ((j == 6)); then bedna_pad $i; fi
		home
		sleep 0.05
	done
done

sleep 1

for ((i = 1; i <= 4; i++)); do
	bedna_zoom $i
	home
	echo ">>> ZOOM <<<"
	home
	sleep 0.5
	echo "            "
	home
	sleep 0.5
done

###
#fi
#bedna_zoom 4
#home
#sleep 0.5
###

mys + 10 29 9
mys - 1 30 9
mys - 1 28 8
mys + 10 28 7
mys - 1 29 7
mys + 10 28 8
mys - 1 31 10
mys + 10 31 10
mys + 10 31 11

###
#if false; then
###

sleep 2
bub on 36 5 "??"
home
sleep 1.5
bub off
home
sleep 3

for ((i = 1; i <= 8; i++)); do
	bedna_ote $i
	home
	sleep 0.1
done

bub on 36 5 "!!"
home
sleep 1.5
bub off
home
sleep 1

for ((i = 1; i <= 4; i++)); do
	kouzlo $i
	home
	sleep 0.2
done

for ((i = 0; i < 300; i++)); do
	rand_heslo
	home
	if ((i == 100)); then
		bub on 36 5 "??"
		home
	elif ((i == 111)); then
		bub off
		home
	fi
	sleep 0.2
done

for ((i = 0; i < 60; i++)); do
	semirand_heslo
	home
	sleep 0.2
done

heslo
home

sleep 0.5
bub on 36 5 "!!"
home
sleep 1.5
bub off
home
sleep 1

###
#fi
#heslo
#home
#sleep 1
###

#for ((i = 0; i <= 28; i++)); do
#	down 7
#	if ((i <= 26)); then
#		revmys1 $((52 + i))
#		revmys1 $((52 + i))
#		revmys1 $((51 + i))
#		revmys1 $((49 + i))
#		revmys1 $((49 + i))
#		up 5
#		mys1 $((52 + i))
#		mys1 $((53 + i))
#	else
#		down 2
#	fi
#	mys1 $((51 + i))
#	mys1 $((50 + i))
#	home
#	sleep 0.1
#done
for ((i = 0; i <= 49; i++)); do
	down 7
	if ((i <= 28)); then
		if ((i <= 26)); then
			mys1 $((52 + i))
			mys1 $((53 + i))
		else
			down 2
		fi
		mys1 $((51 + i))
		mys1 $((50 + i))
		up 4
	fi
	if ((i >= 2 && i <= 40)); then
		up 2
		bedna $((37 + i))
		up 3
	fi
	mys1 $((29 + i))
	mys1 $((29 + i))
	mys1 $((30 + i))
	if ((i <= 47)); then
		mys1 $((32 + i))
		mys1 $((32 + i))
	fi
	home
	sleep 0.1
done

sleep 5
echo "c"

