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})"
 |