-
Notifications
You must be signed in to change notification settings - Fork 0
/
pipes
executable file
·49 lines (44 loc) · 1.48 KB
/
pipes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
declare -i f=75 s=13 r=2000 t=0 c=1 n=0 l=0
declare -ir w=$(tput cols) h=$(tput lines)
declare -i x=$((w/2)) y=$((h/2))
declare -ar v=( [00]="\x83" [01]="\x8f" [03]="\x93"
[10]="\x9b" [11]="\x81" [12]="\x93"
[21]="\x97" [22]="\x83" [23]="\x9b"
[30]="\x97" [32]="\x8f" [33]="\x81" )
OPTIND=1
while getopts "f:s:r:h" arg; do
case $arg in
f) ((f=($OPTARG>19 && $OPTARG<101)?$OPTARG:$f));;
s) ((s=($OPTARG>4 && $OPTARG<16 )?$OPTARG:$s));;
r) ((r=($OPTARG>0)?$OPTARG:$r));;
h) echo -e "Usage: pipes [OPTION]..."
echo -e "Animated pipes terminal screensaver.\n"
echo -e " -f [20-100]\tframerate (D=75)."
echo -e " -s [5-15]\tprobability of a straight fitting (D=13)."
echo -e " -r LIMIT\treset after x characters (D=2000)."
echo -e " -h\t\thelp (this screen).\n"
exit 0;;
esac
done
tput smcup
tput reset
tput civis
while ! read -t0.0$((1000/$f)) -n1; do
# New position:
(($l%2)) && ((x+=($l==1)?1:-1))
((!($l%2))) && ((y+=($l==2)?1:-1))
# Loop on edges (change color on loop):
((c=($x>$w || $x<0 || $y>$h || $y<0)?($RANDOM%7-1):$c))
((x=($x>$w)?0:(($x<0)?$w:$x)))
((y=($y>$h)?0:(($y<0)?$h:$y)))
# New random direction:
((n=$RANDOM%$s-1))
((n=($n>1||$n==0)?$l:$l+$n))
((n=($n<0)?3:$n%4))
# Print:
tput cup $y $x
echo -ne "\033[1;3${c}m\xe2\x94${v[$l$n]}"
(($t>$r)) && tput reset && tput civis && t=0 || ((t++))
l=$n
done
tput rmcup