4 // Copyright 2016-2021 Said Achmiz.
5 // See LICENSE and README.md for more info.
8 #import <GameplayKit/GameplayKit.h>
10 /*******************************************/
11 #pragma mark SA_DiceBag class implementation
12 /*******************************************/
14 @implementation SA_DiceBag {
15 // GKRandomSource *_randomSource;
17 NSMutableDictionary <NSNumber *, GKRandomDistribution *> *_dice;
20 -(instancetype) init {
21 if (!(self = [super init]))
24 // _randomSource = [GKMersenneTwisterRandomSource new];
26 _dice = [NSMutableDictionary dictionary];
31 /****************************/
32 #pragma mark - Public methods
33 /****************************/
35 -(NSUInteger) biggestPossibleDieSize {
39 -(NSUInteger) rollDie:(NSUInteger)dieSize {
40 // return [_randomSource nextIntWithUpperBound:dieSize] + 1;
41 return [[self dieOfSize:dieSize] nextInt];
44 -(NSArray <NSNumber *> *) rollNumber:(NSUInteger)number
45 ofDice:(NSUInteger)dieSize {
46 return [self rollNumber:number
51 -(NSArray <NSNumber *> *) rollNumber:(NSUInteger)number
52 ofDice:(NSUInteger)dieSize
53 withOptions:(SA_DiceRollingOptions)options {
54 NSMutableArray *rollsArray = [NSMutableArray arrayWithCapacity:number];
56 for (NSUInteger i = 0; i < number; i++) {
59 dieRoll = [self rollDie:dieSize];
60 [rollsArray addObject:@(dieRoll)];
61 } while ( options & SA_DiceRollingExplodingDice
63 && dieRoll == dieSize);
69 -(char) rollFudgeDie {
70 NSInteger d3roll = [self rollDie:3];
71 return (char) (d3roll - 2);
74 -(NSArray <NSNumber *> *) rollFudgeDice:(NSUInteger)number {
75 NSMutableArray *rollsArray = [NSMutableArray arrayWithCapacity:number];
77 for (NSUInteger i = 0; i < number; i++) {
78 [rollsArray addObject:@([self rollFudgeDie])];
84 /****************************/
85 #pragma mark - Helper methods
86 /****************************/
88 -(GKRandomDistribution *) dieOfSize:(NSUInteger) dieSize {
89 if (_dice[@(dieSize)] == nil)
90 _dice[@(dieSize)] = [[GKRandomDistribution alloc] initWithRandomSource:[GKMersenneTwisterRandomSource new]
92 highestValue:dieSize];
94 return _dice[@(dieSize)];