manage element density

This commit is contained in:
fatalerrors
2026-05-20 15:22:17 +02:00
parent 6e4d052170
commit 9a272689eb
4 changed files with 81 additions and 3 deletions

View File

@@ -110,12 +110,24 @@ _rain_normalize_speed()
fi
}
_rain_normalize_density()
{
local raw_density="$1"
if [[ ! "$raw_density" =~ ^[0-9]+$ || "$raw_density" -lt 1 ]]; then
return 1
fi
printf "%s" "$raw_density"
}
_rain_engine()
{
local step_duration="$1"
local base_color="$2"
local mode="$3"
local charset="$4"
local density_override="$5"
command -v tput >/dev/null 2>&1 || {
disp E "The program 'tput' is required but not installed."
@@ -175,6 +187,10 @@ _rain_engine()
frame_sleep="$step_duration"
;;
esac
if [[ -n "$density_override" ]]; then
max_rain_width="$density_override"
fi
}
do_exit()
@@ -251,7 +267,11 @@ _rain_engine()
if ((num_rains < max_rain_width)) && ((100 * RANDOM / 32768 < new_rain_odd)); then
rain_drop="${rain_chars[rain_tab * RANDOM / 32768]}"
drop_color="${rain_colors[rain_color_tab * RANDOM / 32768]}"
drop_length=$((max_rain_height * RANDOM / 32768 + 1))
if [[ "$mode" == "matrix" ]]; then
drop_length=$((max_rain_height * RANDOM / 32768 + 2))
else
drop_length=$((max_rain_height * RANDOM / 32768 + 1))
fi
X=$((term_width * RANDOM / 32768 + 1))
Y=$((1 - drop_length))
rains=("${rains[@]}" "$X" "$Y" "$rain_drop" "$drop_color" "$drop_length")
@@ -280,6 +300,7 @@ rain()
printf "\t-s, --speed NUM Set speed value (default: 5 => 0.050s).\n"
printf "\t Values >=1 use a /100 scale (5 => 0.05s).\n"
printf "\t Values <1 are interpreted as raw seconds.\n"
printf "\t-d, --density NUM Maximum number of simultaneous falling elements.\n"
printf "\t-c, --color COLOR Set the color theme (default: white).\n"
printf "\t-h, --help Display this help message and exit.\n\n"
printf "Available Colors:\n"
@@ -296,6 +317,11 @@ rain()
local step_duration
step_duration=$(_rain_normalize_speed "$_raw_speed") || step_duration=0.050
local base_color="${RAIN_DEFAULT_COLOR:-white}"
local density_override="${RAIN_DEFAULT_DENSITY:-}"
if [[ -n "$density_override" ]]; then
density_override=$(_rain_normalize_density "$density_override") || density_override=""
fi
while [[ "$#" -gt 0 ]]; do
case $1 in
@@ -323,6 +349,20 @@ rain()
return 1
fi
;;
-d|--density)
if [[ -n "$2" && ! "$2" =~ ^- ]]; then
density_override=$(_rain_normalize_density "$2") || {
disp E "--density requires a positive integer value."
_rain_show_usage
return 1
}
shift
else
disp E "--density requires a positive integer value."
_rain_show_usage
return 1
fi
;;
-h|--help)
_rain_show_usage
return 0
@@ -340,7 +380,7 @@ rain()
shift
done
_rain_engine "$step_duration" "$base_color" "rain" ""
_rain_engine "$step_duration" "$base_color" "rain" "" "$density_override"
}
export -f rain
@@ -356,6 +396,7 @@ matrix()
printf "\t-s, --speed NUM Set speed value (default: 3.5 => 0.035s).\n"
printf "\t Values >=1 use a /100 scale (3.5 => 0.035s).\n"
printf "\t Values <1 are interpreted as raw seconds.\n"
printf "\t-d, --density NUM Maximum number of simultaneous falling elements.\n"
printf "\t-c, --color COLOR Set color theme (default: green).\n"
printf "\t-C, --charset SET Character set: binary, kana, ascii (default: binary).\n"
printf "\t-h, --help Display this help message and exit.\n\n"
@@ -367,6 +408,11 @@ matrix()
step_duration=$(_rain_normalize_speed "$_raw_speed") || step_duration=0.035
local base_color="${MATRIX_DEFAULT_COLOR:-green}"
local charset="${MATRIX_DEFAULT_CHARSET:-binary}"
local density_override="${MATRIX_DEFAULT_DENSITY:-}"
if [[ -n "$density_override" ]]; then
density_override=$(_rain_normalize_density "$density_override") || density_override=""
fi
while [[ "$#" -gt 0 ]]; do
case $1 in
@@ -412,6 +458,20 @@ matrix()
return 1
fi
;;
-d|--density)
if [[ -n "$2" && ! "$2" =~ ^- ]]; then
density_override=$(_rain_normalize_density "$2") || {
disp E "--density requires a positive integer value."
_matrix_show_usage
return 1
}
shift
else
disp E "--density requires a positive integer value."
_matrix_show_usage
return 1
fi
;;
-h|--help)
_matrix_show_usage
return 0
@@ -429,7 +489,7 @@ matrix()
shift
done
_rain_engine "$step_duration" "$base_color" "matrix" "$charset"
_rain_engine "$step_duration" "$base_color" "matrix" "$charset" "$density_override"
}
export -f matrix