Updated LICENSE and info comments
[SA_Dice.git] / SA_DiceBag.m
blob39540453921ed07c25f62968a182230b6bb98e0c
1 //
2 //  SA_DiceBag.m
3 //
4 //  Copyright 2016-2021 Said Achmiz.
5 //  See LICENSE and README.md for more info.
7 #import "SA_DiceBag.h"
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]))
22                 return nil;
24 //      _randomSource = [GKMersenneTwisterRandomSource new];
26         _dice = [NSMutableDictionary dictionary];
28         return self;
31 /****************************/
32 #pragma mark - Public methods
33 /****************************/
35 -(NSUInteger) biggestPossibleDieSize {
36         return NSUIntegerMax;
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
47                                          ofDice:dieSize
48                                 withOptions:0];
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++) {
57                 NSUInteger dieRoll;
58                 do {
59                         dieRoll = [self rollDie:dieSize];
60                         [rollsArray addObject:@(dieRoll)];
61                 } while (   options & SA_DiceRollingExplodingDice
62                                  && dieSize > 1
63                                  && dieRoll == dieSize);
64         }
66         return rollsArray;
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])];
79         }
81         return rollsArray;
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]
91                                                                                                                                    lowestValue:1
92                                                                                                                                   highestValue:dieSize];
94         return _dice[@(dieSize)];
97 @end