From 150a70bbad7a6038c81145bd1673c2c1cefe7eb1 Mon Sep 17 00:00:00 2001 From: xero Date: Sun, 9 Mar 2014 19:11:14 -0400 Subject: update fun pipes scripts --- code/fun/pipes | 76 ++++++++++++++++++++++++++++++++++----------------------- code/fun/pipesx | 44 +++++++++++++++++++++++++++++---- 2 files changed, 84 insertions(+), 36 deletions(-) (limited to 'code/fun') diff --git a/code/fun/pipes b/code/fun/pipes index 5cc366e..43e7046 100755 --- a/code/fun/pipes +++ b/code/fun/pipes @@ -1,29 +1,19 @@ -#!/bin/bash -# The author of the original script is unknown to me. The first entry I can -# find was posted at 2010-03-21 09:50:09 on Arch Linux Forums (doesn't mean the -# poster is the author at all): +#!/usr/bin/env bash +# pipes.sh: Animated pipes terminal screensaver. # -# https://bbs.archlinux.org/viewtopic.php?pid=728932#p728932 +# This modified version is maintained at: # -# I, Yu-Jie Lin, made a few changes and additions: -# -# -p, -t, -R, and -C -# -# Screenshot: http://flic.kr/p/dRnLVj -# Screencast: http://youtu.be/5XnGSFg_gTk -# -# And push the commits to Gist: -# -# https://gist.github.com/4689307 -# -# I, Devin Samarin, made a few changes and additions: -# -# -r can be 0 to mean "no limit". -# Reset cursor visibility after done. -# Cleanup for those people who want to quit with ^C -# -# Pushed the changes to https://gist.github.com/4725048 +# https://github.com/livibetter/pipes.sh + +# options: +# s = straight [5-15] +# f = rate [20-100] +# t = style [0-5] +# r = ttl + +VERSION=0.1.0 +M=32768 p=1 f=75 s=13 r=2000 t=0 w=$(tput cols) h=$(tput lines) @@ -36,16 +26,18 @@ sets=( "│╭ ╮╯─╮ ╰│╯╰ ╭─" "│┌ ┐┘─┐ └│┘└ ┌─" "║╔ ╗╝═╗ ╚║╝╚ ╔═" + "|+ ++-+ +|++ +-" + "|/ \/-\ \|/\ /-" ) -v="${sets[0]}" +v=() RNDSTART=0 NOCOLOR=0 OPTIND=1 -while getopts "p:t:f:s:r:RCh" arg; do +while getopts "p:t:f:s:r:RChv" arg; do case $arg in p) ((p=(OPTARG>0)?OPTARG:p));; - t) ((OPTARG>=0 && OPTARG<${#sets[@]})) && v="${sets[OPTARG]}";; + t) ((OPTARG>=0 && OPTARG<${#sets[@]})) && V+=($OPTARG);; f) ((f=(OPTARG>19 && OPTARG<101)?OPTARG:f));; s) ((s=(OPTARG>4 && OPTARG<16 )?OPTARG:s));; r) ((r=(OPTARG>=0)?OPTARG:r));; @@ -54,20 +46,39 @@ case $arg in h) echo -e "Usage: $(basename $0) [OPTION]..." echo -e "Animated pipes terminal screensaver.\n" echo -e " -p [1-]\tnumber of pipes (D=1)." - echo -e " -t [0-$((${#sets[@]} - 1))]\ttype of pipes (D=0)." + echo -e " -t [0-$((${#sets[@]} - 1))]\ttype of pipes, can be used more than once (D=0)." 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, 0 if no limit (D=2000)." echo -e " -R \t\trandom starting point." echo -e " -C \t\tno color." - echo -e " -h\t\thelp (this screen).\n" + echo -e " -h\t\thelp (this screen)." + echo -e " -v\t\tprint version number.\n" exit 0;; + v) echo "$(basename -- "$0") $VERSION" + exit 0 esac done +# set default values if not by options +((${#V[@]})) || V=(0) + +# Attempt to workaround for Bash versions < 4, such as 3.2 on Mac: +# https://gist.github.com/livibetter/4689307/#comment-892368 +# Untested--in conduction of using shebang `env bash`--should fall back to +# `sleep` +printf -v SLEEP "read -t0.0$((1000/f)) -n 1" +if $SLEEP &>/dev/null; (($? != 142)); then + printf -v SLEEP "sleep 0.0$((1000/f))" +fi + cleanup() { + # clear up standard input + read -t 0 && cat /dev/null + tput rmcup tput cnorm + stty echo exit 0 } trap cleanup SIGHUP SIGINT SIGTERM @@ -76,18 +87,21 @@ for (( i=1; i<=p; i++ )); do c[i]=$((i%8)) n[i]=0 l[i]=0 ((x[i]=RNDSTART==1?RANDOM*w/32768:w/2)) ((y[i]=RNDSTART==1?RANDOM*h/32768:h/2)) + v[i]=${V[${#V[@]} * RANDOM / M]} done +stty -echo tput smcup tput reset tput civis -while ! read -t0.0$((1000/f)) -n1; do +# any key press exits the loop and this script +while $SLEEP; (($? > 128)) || [[ $SLEEP = sleep* ]] && (($? == 0)); do for (( i=1; i<=p; i++ )); do # New position: ((${l[i]}%2)) && ((x[i]+=-${l[i]}+2,1)) || ((y[i]+=${l[i]}-1)) # Loop on edges (change color on loop): - ((${x[i]}>w||${x[i]}<0||${y[i]}>h||${y[i]}<0)) && ((c[i]=RANDOM%8)) + ((${x[i]}>w||${x[i]}<0||${y[i]}>h||${y[i]}<0)) && ((c[i]=RANDOM%8, v[i]=V[${#V[@]}*RANDOM/M])) ((x[i]=(x[i]+w)%w)) ((y[i]=(y[i]+h)%h)) @@ -99,7 +113,7 @@ while ! read -t0.0$((1000/f)) -n1; do # Print: tput cup ${y[i]} ${x[i]} [[ $NOCOLOR == 0 ]] && echo -ne "\033[1;3${c[i]}m" - echo -n "${v:l[i]*4+n[i]:1}" + echo -n "${sets[v[i]]:l[i]*4+n[i]:1}" l[i]=${n[i]} done ((r>0 && t*p>=r)) && tput reset && tput civis && t=0 || ((t++)) diff --git a/code/fun/pipesx b/code/fun/pipesx index 02ed325..a937bf8 100755 --- a/code/fun/pipesx +++ b/code/fun/pipesx @@ -1,4 +1,29 @@ #!/bin/bash +# Animated pipes.sh terminal screensaver at an angle. +# Copyright (C) 2013, 2014 by Yu-Jie Lin +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# Website: https://github.com/livibetter/pipesX.sh + +VERSION=0.1.0 + W=$(tput cols) H=$(tput lines) # maximal random value + 1 M=32768 @@ -8,7 +33,7 @@ COLORS=(31 32 33 34 35 36 37) # default values N=1 -T=0 +T=() I=0.05 P=25 R=$((W * H / 4)) @@ -19,7 +44,7 @@ Animated pipes.sh terminal screensaver at an angle. Options: -n [1-] number of pipes. (Default: $N) - -t [0-$((${#SETS[@]} - 1))] type of pipes. (Default: $T) + -t [0-$((${#SETS[@]} - 1))] types of pipes, can be used more than once. (Default: $T) -i [float] piping interval or maze generation interval. (Default: $I) -P [0-100] probability of a turning pipe or of \\ in maze generation. (Default: $P) -r [LIMIT] reset after x characters, 0 if no limit. (Default: $R) @@ -27,15 +52,16 @@ Options: -C no color. -X maze generation. -h this help message. + -v print version number. " -while getopts "n:t:i:P:r:RCXh" arg; do +while getopts "n:t:i:P:r:RCXhv" arg; do case $arg in n) ((N = OPTARG > 0 ? OPTARG : N)) ;; t) - ((T = (OPTARG >= 0 && OPTARG < ${#SETS[@]}) ? OPTARG : T)) + T+=($(((OPTARG >= 0 && OPTARG < ${#SETS[@]}) ? OPTARG : T))) ;; i) I=$OPTARG @@ -59,9 +85,15 @@ while getopts "n:t:i:P:r:RCXh" arg; do echo -e "$HELP" exit 0 ;; + v) + echo "$(basename -- "$0") $VERSION" + exit 0 esac done +# set to default values if not by options +((${#T[@]})) || T=(0) + do_exit() { # Show cursor and echo stdin echo -ne "\e[?25h" @@ -90,6 +122,7 @@ for ((n = 0; n < N; n++)); do ((Y[n] = RNDSTART ? (H + 2) * RANDOM / M : H / 2)) D[n]=$((4 * RANDOM / M)) C[n]=${COLORS[${#COLORS[@]} * RANDOM / M]} + t[n]=${T[${#T[@]} * RANDOM / M]} done clear @@ -131,6 +164,7 @@ while :; do ((d > 1 && y == H)) && ((yn++, CC=1)) ((e < 2 && x == W)) && ((xn++, CC=1)) ((CC)) && c=${COLORS[${#COLORS[@]} * RANDOM / M]} + ((CC)) && t[n]=${T[${#T[@]} * RANDOM / M]} # warp pipe ((xn = (xn + W + 1) % (W + 1))) @@ -147,7 +181,7 @@ while :; do echo -ne "\e[${yt};${xt}H" [[ $NOCOLOR ]] || echo -ne "\e[1;${c}m" - echo -n "${SETS[T]:d%2:1}" + echo -n "${SETS[t[n]]:d%2:1}" X[n]=$xn Y[n]=$yn D[n]=$d C[n]=$c -- cgit v1.2.1