A set of classes for parsing, evaluating, and formatting die roll strings.
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

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