A set of classes for parsing, evaluating, and formatting die roll strings.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //
  2. // SA_DiceBag.m
  3. //
  4. // Copyright (c) 2016 Said Achmiz.
  5. //
  6. // This software is licensed under the MIT license.
  7. // See the file "LICENSE" for more information.
  8. #import "SA_DiceBag.h"
  9. #import <GameplayKit/GameplayKit.h>
  10. /*******************************************/
  11. #pragma mark SA_DiceBag class implementation
  12. /*******************************************/
  13. @implementation SA_DiceBag {
  14. GKRandomSource *_randomSource;
  15. // NSMutableDictionary <NSNumber *, GKRandomDistribution *> *_dice;
  16. }
  17. -(instancetype) init {
  18. self = [super init];
  19. if (!self) return nil;
  20. _randomSource = [GKMersenneTwisterRandomSource new];
  21. // _dice = [NSMutableDictionary dictionary];
  22. return self;
  23. }
  24. /****************************/
  25. #pragma mark - Public methods
  26. /****************************/
  27. -(NSUInteger) biggestPossibleDieSize {
  28. return NSUIntegerMax;
  29. }
  30. -(NSUInteger) rollDie:(NSUInteger)dieSize {
  31. return [_randomSource nextIntWithUpperBound:dieSize] + 1;
  32. // return [[self dieOfSize:dieSize] nextInt];
  33. }
  34. -(NSArray <NSNumber *> *) rollNumber:(NSUInteger)number
  35. ofDice:(NSUInteger)dieSize {
  36. return [self rollNumber:number
  37. ofDice:dieSize
  38. withOptions:0];
  39. }
  40. -(NSArray <NSNumber *> *) rollNumber:(NSUInteger)number
  41. ofDice:(NSUInteger)dieSize
  42. withOptions:(SA_DiceRollingOptions)options {
  43. NSMutableArray *rollsArray = [NSMutableArray arrayWithCapacity:number];
  44. for (NSUInteger i = 0; i < number; i++) {
  45. NSUInteger dieRoll;
  46. do {
  47. dieRoll = [self rollDie:dieSize];
  48. [rollsArray addObject:@(dieRoll)];
  49. } while ((options & SA_DiceRollingExplodingDice)
  50. && dieSize > 1
  51. && dieRoll == dieSize);
  52. }
  53. return rollsArray;
  54. }
  55. -(char) rollFudgeDie {
  56. NSInteger d3roll = [self rollDie:3];
  57. return (char) (d3roll - 2);
  58. }
  59. -(NSArray <NSNumber *> *) rollFudgeDice:(NSUInteger)number {
  60. NSMutableArray *rollsArray = [NSMutableArray arrayWithCapacity:number];
  61. for (NSUInteger i = 0; i < number; i++) {
  62. [rollsArray addObject:@([self rollFudgeDie])];
  63. }
  64. return rollsArray;
  65. }
  66. /****************************/
  67. #pragma mark - Helper methods
  68. /****************************/
  69. //-(GKRandomDistribution *) dieOfSize:(NSUInteger) dieSize {
  70. // if (_dice[@(dieSize)] == nil)
  71. // _dice[@(dieSize)] = [GKRandomDistribution distributionForDieWithSideCount:dieSize];
  72. //
  73. // return _dice[@(dieSize)];
  74. //}
  75. @end