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