#!/bin/bash
# aass - the Ascii Art Screen Saver by Aurelio Marinho Jargas
#
# a very simple bash Ascii Art Screen Saver (saver?!?) to run on console.
# features: 3 speed, color, sound, fullscreen mode and 1line themes.
# themes: alien, crab, eye, fish, mosaic, mountain, msdos, plane, space.
# it's a one day wonder, so this is probably the 1st and final version.
#
# the words you're searching:
# GPL, 4linux, text mode, NO make or compilation (download and run).
#
# 20010507 ** birthday
#
# DOCUMENTATION:
# ctrl+c exits the program
# EXAMPLES:
# aass
# aass -s3 -fg \\
# aass -s1 -beep -clear 15 "YES, i'm NOT here"
# aass -theme msdos
# HELP:
# read above or give -wrong_option option
#
# TODO more themes
# TODO go back to work NOW!
# TODO ==*-,,--,,-- --/--\-<@
Usage() {
echo "usage: `basename $0` [OPTIONS] [pattern]
OPTIONS:
-bg color in background [default]
-fg color in foreground
-s1 speed 1: slow (1 second pause)
-s2 speed 2: cool (1 microsecond pause) [default]
-s3 speed 3: fast (no pause - burn cpu, burn!)
-lines n use 'n' lines on the screen
-cols n use 'n' columns on the screen
-full full screen mode [default]
-clear n clears the screen after 'n' outputs [default n=0]
-bw black and white (no colors)
-seed n extra number to feed the random seed [default n=1]
-beep noise! noise! noise!
-quiet no noise... [default]
-theme name themes available:
alien, crab, eye, fish, mosaic, mountain, msdos, plane, space
'pattern' can be anything you want from '@' to \"i hate cats\".
the default value is '|'. some cool patterns are /, . and o.
"
exit 1
}
doOpts(){
while [ $# -gt 0 ]
do case "$1" in
# only fg can be lightenned
-bg) c1='30;4'; unset f_light ;;
-fg) c1='40;3'; f_light=1 ;;
-bw) f_bw=1 ;;
-theme) [ "$2" ] || Usage;
# to generate the --help themes list:
# sed -n 's/^ *\([a-z]\+\)).*/\1/p' aass|sort|sed ':a;$!N;s/\n/, /;ta'
case "$2" in
space) doOpts -fg -s2 -bw '.' ;;
fish) doOpts -fg -s1 '>-)))-D' ;;
mountain) doOpts -fg -s1 "_.=\"'\`\"=._" ;;
eye) doOpts -fg -s1 -bw '00' ;; # remember xeyes?
crab) doOpts -fg -s1 "(_).-=\`'=-.(_)";;
plane) doOpts -fg -s1 ' --o-0-o--' ;;
alien) doOpts -fg -s1 -beep '/-=-\\' ;;
msdos) doOpts -fg -s3 'Bad command or filename\nC:\> ';; # &:I
mosaic) doOpts -bg -s3 ' ' ;;
*) Usage;;
esac
shift
;;
-s1) pause='sleep 1' ;;
-s2) pause='usleep 1' ;;
-s3) unset pause ;;
-full) ssize=`stty size`; lines=${ssize% *}; cols=${ssize#* };;
-lines) [ "$2" ] || Usage; lines=$2; shift;;
-cols) [ "$2" ] || Usage; cols=$2; shift;;
-clear) [ "$2" ] || Usage; clear=$2; shift;;
-seed) [ "$2" ] || Usage; seed=$2; shift;;
-beep) beep='\a';;
-quiet) unset beep;;
-*) Usage;;
*) z="$1";;
esac
shift
done
}
# 1st the defaults, then user options. cool no?
doOpts -bg -s2 -full -clear 0 -seed 1 '|' "$@"
zn=${#z}
setterm -cursor off
clear
trap "setterm -cursor on;clear;exit" SIGINT
i=0
while :
do
i=$((i+1)) # i as the counter, as always...
j=$((i+seed))
RANDOM=$j # feeding random
# our (not so) random position and colors
x=$((((RANDOM+c*j)%lines)+1))
y=$((((RANDOM*c+j)%(cols-zn+1))+1))
c=$(((x+y+j+RANDOM)%7+1))
b=$((y%2)) # should i bold?
unset light; [ "$f_light" -a $b -eq 1 ] && light='1;'
echo -ne "\033[$x;${y}H" # going to screen position
if [ "$f_bw" ] # b&w or colored output
then echo -ne "$z$beep"
else echo -ne "\033[${light}$c1${c}m$z"
echo -ne "$beep\033[m"
fi
$pause
[ "$clear" -ne 0 ] && [ $((i%clear)) -eq 0 ] && clear && $pause
done