URI: 
       tpipesx - scripts - random scripts
  HTML git clone https://git.parazyd.org/scripts
   DIR Log
   DIR Files
   DIR Refs
       ---
       tpipesx (5086B)
       ---
            1 #!/bin/bash
            2 # Animated pipes.sh terminal screensaver at an angle.
            3 # Copyright (C) 2013, 2014 by Yu-Jie Lin
            4 #
            5 # Permission is hereby granted, free of charge, to any person obtaining a copy
            6 # of this software and associated documentation files (the "Software"), to deal
            7 # in the Software without restriction, including without limitation the rights
            8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
            9 # copies of the Software, and to permit persons to whom the Software is
           10 # furnished to do so, subject to the following conditions:
           11 #
           12 # The above copyright notice and this permission notice shall be included in
           13 # all copies or substantial portions of the Software.
           14 #
           15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
           16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
           17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
           18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
           19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
           20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
           21 # THE SOFTWARE.
           22 #
           23 # Website: https://github.com/livibetter/pipesX.sh
           24 
           25 VERSION=0.1.0
           26 
           27 W=$(tput cols) H=$(tput lines)
           28 # maximal random value + 1
           29 M=32768
           30 
           31 SETS=('╱╲' '/\')
           32 #SETS=('|-' '')
           33 COLORS=(31 32 33 34 35 36 37)
           34 
           35 # default values
           36 N=1
           37 T=()
           38 I=0.05
           39 P=25
           40 R=$((W * H / 4))
           41 
           42 HELP="Usage: $(basename $0) [OPTIONS]
           43 Animated pipes.sh terminal screensaver at an angle.
           44 
           45 Options:
           46 
           47   -n [1-]     number of pipes. (Default: $N)
           48   -t [0-$((${#SETS[@]} - 1))]    types of pipes, can be used more than once. (Default: $T)
           49   -i [float]  piping interval or maze generation interval. (Default: $I)
           50   -P [0-100]  probability of a turning pipe or of \\ in maze generation. (Default: $P)
           51   -r [LIMIT]  reset after x characters, 0 if no limit. (Default: $R)
           52   -R          random starting point.
           53   -C          no color.
           54   -X          maze generation.
           55   -h          this help message.
           56   -v          print version number.
           57 "
           58 
           59 while getopts "n:t:i:P:r:RCXhv" arg; do
           60   case $arg in
           61     n)
           62       ((N = OPTARG > 0 ? OPTARG : N))
           63       ;;
           64     t)
           65       T+=($(((OPTARG >= 0 && OPTARG < ${#SETS[@]}) ? OPTARG : T)))
           66       ;;
           67     i)
           68       I=$OPTARG
           69       ;;
           70     P)
           71       ((P = (OPTARG >= 0 && OPTARG <= 100) ? OPTARG : P))
           72       ;;
           73     r)
           74       ((R = OPTARG >= 0 ? OPTARG : R))
           75       ;;
           76     R)
           77       RNDSTART=1
           78       ;;
           79     C)
           80       NOCOLOR=1
           81       ;;
           82     X)
           83       MAZE=1
           84       ;;
           85     h)
           86       echo -e "$HELP"
           87       exit 0
           88       ;;
           89     v)
           90       echo "$(basename -- "$0") $VERSION"
           91       exit 0
           92   esac
           93 done
           94 
           95 # set to default values if not by options
           96 ((${#T[@]})) || T=(0)
           97 
           98 do_exit() {
           99   # Show cursor and echo stdin
          100   echo -ne "\e[?25h"
          101   stty echo
          102   clear
          103   exit 0
          104   }
          105 trap do_exit INT TERM
          106 
          107 # No echo stdin and hide the cursor
          108 stty -echo
          109 echo -ne "\e[?25l"
          110 
          111 # maze geneartion
          112 while [[ $MAZE ]] && clear; do
          113   [[ $NOCOLOR ]] || echo -ne "\e[1;${COLORS[${#COLORS[@]} * RANDOM / M]}m"
          114   for ((i = 0; i < W * H; i++ )); do
          115     echo -ne ${SETS[T]:100 * RANDOM / M < P:1}
          116   done
          117   read -t $I -n 1 && [[ $REPLY =~ q|Q ]] && do_exit
          118 done
          119 
          120 # initialze values
          121 for ((n = 0; n < N; n++)); do
          122   ((X[n] = RNDSTART ? (W + 2) * RANDOM / M : W / 2))
          123   ((Y[n] = RNDSTART ? (H + 2) * RANDOM / M : H / 2))
          124   D[n]=$((4 * RANDOM / M))
          125   C[n]=${COLORS[${#COLORS[@]} * RANDOM / M]}
          126   t[n]=${T[${#T[@]} * RANDOM / M]}
          127 done
          128 
          129 clear
          130 while :; do
          131   for ((n = 0; n < N; n++, CC = 0)); do
          132     x=${X[n]} y=${Y[n]}
          133     d=${D[n]} c=${C[n]}
          134 
          135     # calculate new direction `d`
          136     # 1  0
          137     #  \/  4 directions 0 to 3
          138     #  /\
          139     # 2  3
          140     # valid directions: d: dd', d' is the new direction
          141     # d
          142     # 0:  / 00 \  01          03
          143     #    /     /           /\
          144     # 1:  / 10 \  11    12
          145     #     \     \    /\
          146     # 2:       \/ 21  / 22  / 23
          147     #                /      \
          148     # 3: \/ 30       \  32 \  33
          149     #                /      \
          150     ((d = (100 * RANDOM / M) < P ? ((d + 1) + 2 * (RANDOM % 2)) % 4 : d))
          151     ((e = (d + 1) % 4))
          152 
          153     # calculate new position
          154     # d'  x'  y'
          155     # 0: x+1 y-1
          156     # 1: x-1 y-1
          157     # 2: x-1 y+1
          158     # 3: x+1 y+1
          159     ((xn = e < 2 ? x + 1 : x - 1))
          160     ((yn = d < 2 ? y - 1 : y + 1))
          161     
          162     # adjust position and change color?
          163     ((d < 2 && y == 0)) && ((yn--, CC=1))
          164     ((e > 1 && x == 0)) && ((xn--, CC=1))
          165     ((d > 1 && y == H)) && ((yn++, CC=1))
          166     ((e < 2 && x == W)) && ((xn++, CC=1))
          167     ((CC)) && c=${COLORS[${#COLORS[@]} * RANDOM / M]}
          168     ((CC)) && t[n]=${T[${#T[@]} * RANDOM / M]}
          169 
          170     # warp pipe
          171     ((xn = (xn + W + 1) % (W + 1)))
          172     ((yn = (yn + H + 1) % (H + 1)))
          173 
          174     # calculate position in terminal
          175     # d'  xt   yt
          176     # 0: x'   y'+1
          177     # 1: x'+1 y'+1
          178     # 2: x'+1 y'
          179     # 3: x'   y'
          180     ((xt = e < 2 ? xn : xn + 1))
          181     ((yt = d < 2 ? yn + 1 : yn))
          182 
          183     echo -ne "\e[${yt};${xt}H"
          184     [[ $NOCOLOR ]] || echo -ne "\e[1;${c}m"
          185     echo -n "${SETS[t[n]]:d%2:1}"
          186 
          187     X[n]=$xn Y[n]=$yn
          188     D[n]=$d C[n]=$c
          189   done
          190   read -t $I -n 1 && [[ $REPLY =~ q|Q ]] && do_exit
          191   ((R)) && ((r += N, r >= R)) && r=0 && clear
          192 done
          193 
          194 do_exit