train - scripts - random scripts
HTML git clone https://git.parazyd.org/scripts
DIR Log
DIR Files
DIR Refs
---
train (2550B)
---
1 #!/bin/bash
2 RAINS=("|" "│" "┃" "┆" "┇" "┊" "┋" "╽" "╿")
3 COLORS=("\e[37m" "\e[37;1m")
4 # More from 256 color mode
5 for i in {244..255}; do
6 COLORS=("${COLORS[@]}" "\e[38;5;${i}m")
7 done
8 NRAINS=${#RAINS[@]}
9 NCOLORS=${#COLORS[@]}
10 NUM_RAIN_METADATA=5
11
12
13 sigwinch() {
14 TERM_WIDTH=$(tput cols)
15 TERM_HEIGHT=$(tput lines)
16 STEP_DURATION=0.025
17 ((MAX_RAINS = TERM_WIDTH * TERM_HEIGHT / 4))
18 ((MAX_RAIN_LENGTH = TERM_HEIGHT < 10 ? 1 : TERM_HEIGHT / 10))
19 # In percentage
20 ((NEW_RAIN_ODD = TERM_HEIGHT > 50 ? 100 : TERM_HEIGHT * 2))
21 ((NEW_RAIN_ODD = NEW_RAIN_ODD * 75 / 100))
22 ((FALLING_ODD = TERM_HEIGHT > 25 ? 100 : TERM_HEIGHT * 4))
23 ((FALLING_ODD = FALLING_ODD * 90 / 100))
24 }
25
26 do_exit() {
27 echo -ne "\e[${TERM_HEIGHT};1H\e[0K"
28
29 # Show cursor and echo stdin
30 echo -ne "\e[?25h"
31 stty echo
32 exit 0
33 }
34
35 do_render() {
36 # Clean screen first
37 for ((idx = 0; idx < num_rains * NUM_RAIN_METADATA; idx += NUM_RAIN_METADATA)); do
38 X=${rains[idx]}
39 Y=${rains[idx + 1]}
40 LENGTH=${rains[idx + 4]}
41 for ((y = Y; y < Y + LENGTH; y++)); do
42 (( y < 1 || y > TERM_HEIGHT )) && continue
43 echo -ne "\e[${y};${X}H "
44 done
45 done
46
47 for ((idx = 0; idx < num_rains * NUM_RAIN_METADATA; idx += NUM_RAIN_METADATA)); do
48 if ((100 * RANDOM / 32768 < FALLING_ODD)); then
49 # Falling
50 if ((++rains[idx + 1] > TERM_HEIGHT)); then
51 # Out of screen, bye sweet <3
52 rains=("${rains[@]:0:idx}"
53 "${rains[@]:idx+NUM_RAIN_METADATA:num_rains*NUM_RAIN_METADATA}")
54 ((num_rains--))
55 continue
56 fi
57 fi
58 X=${rains[idx]}
59 Y=${rains[idx + 1]}
60 RAIN=${rains[idx + 2]}
61 COLOR=${rains[idx + 3]}
62 LENGTH=${rains[idx + 4]}
63 for ((y = Y; y < Y + LENGTH; y++)); do
64 (( y < 1 || y > TERM_HEIGHT )) && continue
65 echo -ne "\e[${y};${X}H${COLOR}${RAIN}"
66 done
67 done
68 }
69
70 trap do_exit TERM INT
71 trap sigwinch WINCH
72 # no echo stdin and hide the cursor
73 stty -echo
74 echo -ne "\e[?25l"
75
76 echo -ne "\e[2J"
77 rains=()
78 sigwinch
79 while :; do
80 read -n 1 -t $STEP_DURATION ch
81 case "$ch" in
82 q|Q)
83 do_exit
84 ;;
85 esac
86
87 if ((num_rains < MAX_RAINS)) && ((100 * RANDOM / 32768 < NEW_RAIN_ODD)); then
88 # Need new |, 1-based
89 RAIN="${RAINS[NRAINS * RANDOM / 32768]}"
90 COLOR="${COLORS[NCOLORS * RANDOM / 32768]}"
91 LENGTH=$((MAX_RAIN_LENGTH * RANDOM / 32768 + 1))
92 X=$((TERM_WIDTH * RANDOM / 32768 + 1))
93 Y=$((1 - LENGTH))
94 rains=("${rains[@]}" "$X" "$Y" "$RAIN" "$COLOR" "$LENGTH")
95 ((num_rains++))
96 fi
97
98 # let rain fall!
99 do_render
100 done