168 lines
5.4 KiB
Markdown
168 lines
5.4 KiB
Markdown
# Desktop Dice Statistics Calculator
|
|
|
|
A native desktop application for calculating dice statistics for tabletop RPGs. Built with Go and the Fyne GUI library to support both Windows and Linux.
|
|
|
|
## Features
|
|
|
|
- **Dice Rolling**: Roll any combination of dice with notation like `2d20`, `3d6+5`, etc.
|
|
- **Highest/Lowest Selection**: Use `H` and `L` modifiers to take the highest or lowest result from multiple dice
|
|
- Example: `2d20H` rolls two d20s and takes the highest
|
|
- Example: `4d6L` rolls four d6s and takes the lowest
|
|
- **Calculator Functionality**: Perform arithmetic operations alongside dice rolls
|
|
- Supports: `+`, `-`, `*`, `/`, and parentheses
|
|
- Example: `2d6 + 5 * 3`
|
|
- **Standard Dice Support**: d4, d6, d8, d10, d12, d20, d100
|
|
- **Custom Dice**: Use `dx` to define custom dice (e.g., `d24`, `d30`)
|
|
- **Calculator-Style Interface**: Familiar button layout resembling a traditional calculator
|
|
|
|
## Building
|
|
|
|
### Prerequisites
|
|
|
|
- Go 1.25.7 or later
|
|
- [Fyne GUI library](https://fyne.io/) (automatically fetched by `go mod`)
|
|
|
|
### Build Instructions
|
|
|
|
```bash
|
|
cd desktop_dice_statistics_calculator
|
|
go build -o dice_calculator
|
|
```
|
|
|
|
This creates an executable named `dice_calculator` in the current directory.
|
|
|
|
### Running
|
|
|
|
```bash
|
|
./dice_calculator
|
|
```
|
|
|
|
On Windows, use:
|
|
```bash
|
|
dice_calculator.exe
|
|
```
|
|
|
|
## Application Structure
|
|
|
|
### main.go
|
|
The main application file containing all UI logic:
|
|
- Window setup and layout management
|
|
- Dice control bar with quick-access buttons (d4, d6, d8, d10, d12, d20, d100, dx, H, L)
|
|
- Calculator-style number pad and operation buttons
|
|
- Input field for dice expressions
|
|
- Output display for results
|
|
- Event handlers for button clicks
|
|
|
|
### calculations.go
|
|
The calculation engine containing all dice logic:
|
|
- **CalculateDice()**: Main entry point for evaluating dice expressions
|
|
- **expandDiceNotations()**: Parses and rolls dice notation (e.g., `2d20H`)
|
|
- **rollDiceSet()**: Rolls a specified number of dice with a given number of sides
|
|
- **evaluateMathExpression()**: Evaluates mathematical expressions with proper operator precedence
|
|
- **ExpressionParser**: Recursive descent parser handling +, -, *, /, and parentheses
|
|
|
|
## Usage Examples
|
|
|
|
### Basic Dice Rolls
|
|
- `d20` - Roll a single d20
|
|
- `2d6` - Roll two d6s and sum them
|
|
- `3d4` - Roll three d4s and sum them
|
|
|
|
### With Modifiers
|
|
- `2d20H` - Roll two d20s, take the highest (advantage in D&D 5e)
|
|
- `2d20L` - Roll two d20s, take the lowest (disadvantage in D&D 5e)
|
|
- `4d6L` - Roll four d6s, take the lowest (typical stat rolling method)
|
|
|
|
### With Arithmetic
|
|
- `2d6 + 5` - Roll 2d6 and add 5
|
|
- `3d6 + 2d4 + 3` - Multiple dice and modifiers
|
|
- `2d6 * 2` - Roll 2d6 and multiply by 2
|
|
- `(2d6 + 1) * 3` - Using parentheses for complex calculations
|
|
|
|
### Custom Dice
|
|
- `d24` - Roll a 24-sided die
|
|
- `3d30` - Roll three 30-sided dice
|
|
- `d100` - Roll a percentile die
|
|
|
|
## Interface Layout
|
|
|
|
```
|
|
┌─────────────────────────────────────┐
|
|
│ Result: [output] │
|
|
├─────────────────────────────────────┤
|
|
│ Dice Options │
|
|
│ [d4] [d6] [d8] [d10] [d12] │
|
|
│ [d20] [d100] [dx] [H] [L] │
|
|
├─────────────────────────────────────┤
|
|
│ Calculator │
|
|
│ [7] [8] [9] [+] [-] │
|
|
│ [4] [5] [6] [*] [/] │
|
|
│ [1] [2] [3] [CLR] [BACKSPACE] │
|
|
│ [0] [.] [ ] [ ] [ ] │
|
|
├─────────────────────────────────────┤
|
|
│ Dice Expression: │
|
|
│ [input field showing: 2d20H] │
|
|
│ [ROLL] │
|
|
└─────────────────────────────────────┘
|
|
```
|
|
|
|
## Supported Operations
|
|
|
|
### Dice Notation
|
|
- `[count]d[sides]` - Standard dice notation (count defaults to 1)
|
|
- `H` - Take highest result (when count > 1)
|
|
- `L` - Take lowest result (when count > 1)
|
|
|
|
### Arithmetic Operations
|
|
- `+` Addition
|
|
- `-` Subtraction
|
|
- `*` Multiplication
|
|
- `/` Division (integer division)
|
|
- `()` Parentheses for grouping
|
|
|
|
### Operator Precedence
|
|
1. Parentheses
|
|
2. Unary minus (e.g., `-5`)
|
|
3. Multiplication and Division (left-to-right)
|
|
4. Addition and Subtraction (left-to-right)
|
|
|
|
## Error Handling
|
|
|
|
The calculator provides error messages for:
|
|
- Invalid dice notation (e.g., `d0`, `0d6`)
|
|
- Division by zero
|
|
- Malformed expressions
|
|
- Unexpected characters
|
|
|
|
When an error occurs, it displays in the result field with an "Error: " prefix.
|
|
|
|
## Dependencies
|
|
|
|
- `fyne.io/fyne/v2` - Cross-platform GUI library
|
|
- Go standard library (math/rand, regexp, strconv, strings, time, etc.)
|
|
|
|
## Cross-Platform Support
|
|
|
|
This application is built with Fyne, which supports:
|
|
- **Linux** - All major distributions
|
|
- **Windows** - Windows 7 and later
|
|
- **macOS** - (Can be built, but not tested in this project scope)
|
|
|
|
To build for a different platform, use Go's cross-compilation flags:
|
|
```bash
|
|
GOOS=windows GOARCH=amd64 go build
|
|
GOOS=linux GOARCH=amd64 go build
|
|
```
|
|
|
|
## Future Enhancement Ideas
|
|
|
|
- History of recent rolls
|
|
- Statistics display (average, min, max for dice rolls)
|
|
- Save/load custom dice definitions
|
|
- Keyboard shortcuts for common operations
|
|
- Dark/light theme support
|
|
- Sound effects for dice rolls
|
|
|
|
## License
|
|
|
|
See LICENSE file for details. |