-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathGet-DiceRoll.ps1
140 lines (120 loc) · 4.31 KB
/
Get-DiceRoll.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
function Get-DiceRoll {
<#
.SYNOPSIS
Simulates rolling gaming dice
.DESCRIPTION
Simulates rolling gaming dice. You can specify the number and type of a particular die.
.PARAMETER Dice
A [string] array that you use to specify the type of and number of that type of dice that you want to roll. Takes the form of [#]D[Type] where # is blank or 1-9, and Type is 4, 6, 8, 10, %, 12, 20
TYPE DESCRIPTION
4 4 sided die with face values of 1-4
6 6 sided die with face values of 1-6
8 8 sided die with face values of 1-8
10 10 sided die with face values of 0-9
% 10 sided die with face values of 0,10,20,30,40,50,60,70,80,90
12 12 sided die with face values of 1-12
20 20 sided die with face values of 1-20
.PARAMETER ShowRoll
A switch to show the results of each individual dice roll
.EXAMPLE
# Rolling 3 standard six sided dice and showing the result of each die. The total would be between 3 and 18
Get-DiceRoll -Dice 3d6 -ShowRoll
Example return
DiceType Roll
-------- ----
D6 6, 3, 3
TOTAL 12
.EXAMPLE
Get-DiceRoll -Dice 3d4
Would return a value between 3 and 12
.EXAMPLE
Get-DiceRoll -Dice d%,d10 -ShowRoll
Sample return
DiceType Roll
-------- ----
D10 5
D% 30
TOTAL 35
.EXAMPLE
'd12','d4' | Get-DiceRoll -ShowRoll
Sample return
DiceType Roll
-------- ----
D12 3
D4 1
TOTAL 4
.NOTES
If you need to specify 10 or more of a particular type of dice use several entries of that dice type that add up to the value you want.
You want to know results of rolling ten 6-sided dice
Get-DiceRoll -Dice 2d6,8d6
.OUTPUTS
'int'
or
'psobject'
#>
# purposely not changing += to either [System.Collections.Arraylist] or other generic list as it is handling relatively small # of entries
#region Parameter
[CmdletBinding(ConfirmImpact = 'Low')]
[OutputType('int')]
Param
(
[Parameter(Mandatory, HelpMessage='Please enter the number and type of dice you wish to roll (ex. 3D6)', Position=0, ValueFromPipeLine)]
[string[]] $Dice,
[switch] $ShowRoll
)
#endregion parameter
begin {
Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
$Total = 0
$ValidDice = $true
$Roll = @{}
$ReturnVal = @()
$DiceCharacteristics = ([ordered] @{
'4' = @{ Side = 4; Face = 1..4}
'6' = @{ Side = 6; Face = 1..6}
'8' = @{ Side = 8; Face = 1..8}
'10' = @{ Side = 10; Face = 0..9}
'%' = @{ Side = 10; Face = (0..9 | Foreach-Object { $_ * 10 }) }
'12' = @{ Side = 12; Face = 1..12}
'20' = @{ Side = 20; Face = 1..20}
})
}
process {
foreach ($Die in $Dice) {
if ($Die -match '^([1-9]?)d(4|6|8|10|%|12|20)$') {
$DieType = $matches[2]
$NumDie = $matches[1]
if (Test-IsNull $NumDie -Verbose:$false) {
$NumDie = 1
}
for ($i = 1; $i -le $NumDie; $i++) {
if (-not ($Roll.ContainsKey($DieType))) {
$Roll.$DieType = @()
}
$Roll.$DieType += Get-Random $DiceCharacteristics.$DieType.Face
}
} else {
$ValidDice = $false
}
}
}
end {
if (-not $ValidDice) {
Write-Error -Message 'Invalid dice specified'
} else {
foreach ($R in $Roll.GetEnumerator()) {
Write-Verbose -Message "`$R.Value is [$($R.Value -join ', ')]"
$Total += ($R.Value | Measure-Object -Sum).Sum
[string] $CurrentRoll = ($R.Value | Sort-Object -Descending) -join ', '
$ReturnVal += New-Object -TypeName PSObject -Property ([ordered] @{DiceType = ('D' + $R.Name); Roll = $CurrentRoll })
}
if ($ShowRoll) {
$ReturnVal += New-Object -TypeName PSObject -Property ([ordered] @{DiceType = 'TOTAL'; Roll = $Total })
$ReturnVal
} else {
Write-Output -InputObject $Total
}
}
Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
}
}