63 lines
1.5 KiB
Bash
Executable File
63 lines
1.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
[ -f functions.sh ] && source functions.sh
|
|
|
|
roll_dice() {
|
|
local count=${1%[dD]*}
|
|
local sides=${1#*[dD]}
|
|
local i
|
|
local total=0
|
|
for i in $(seq $count) ; do
|
|
local die=$(($RANDOM % $sides + 1))
|
|
total=$((total + $die))
|
|
if [[ $i -le 10 ]]; then
|
|
if [[ $i -lt $count ]]; then
|
|
echo -n "${die}, "
|
|
else
|
|
if [[ $count -gt 1 ]]; then
|
|
echo -n "and ${die} "
|
|
else
|
|
echo -n "${die} "
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
if [[ $((count - 10)) -gt 1 ]]; then
|
|
echo -n "and $((count - 10)) more dice "
|
|
fi
|
|
if [[ $((count - 10)) -eq 1 ]]; then
|
|
echo -n "and 1 more die "
|
|
fi
|
|
echo "for a total of ${total}."
|
|
}
|
|
|
|
rollString="${3##* }"
|
|
|
|
# Validate roll string is provided
|
|
if [[ -z "$rollString" ]]; then
|
|
msg "$2" "${1}: Usage is roll #d# (e.g., 2d6, 1d20)"
|
|
exit 0
|
|
fi
|
|
|
|
# Validate roll string format
|
|
if ! [[ "$rollString" =~ ^[1-9][0-9]*[dD][1-9][0-9]*$ ]]; then
|
|
msg "$2" "${1}: Invalid format. Usage: roll #d# where # is greater than 0 (e.g., 2d6, 1d20)"
|
|
exit 0
|
|
fi
|
|
|
|
# Extract count and sides for validation
|
|
count=${rollString%[dD]*}
|
|
sides=${rollString#*[dD]}
|
|
|
|
# Validate reasonable limits to prevent abuse
|
|
if [[ $count -gt 1000 ]]; then
|
|
msg "$2" "${1}: Maximum 1000 dice per roll."
|
|
exit 0
|
|
fi
|
|
|
|
if [[ $sides -gt 1000 ]]; then
|
|
msg "$2" "${1}: Maximum 1000 sides per die."
|
|
exit 0
|
|
fi
|
|
|
|
msg "$2" "$(roll_dice ${rollString})"
|