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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. if (!(self = [super init]))
  19. 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 alloc] initWithRandomSource:[GKMersenneTwisterRandomSource new]
  72. lowestValue:1
  73. highestValue:dieSize];
  74. return _dice[@(dieSize)];
  75. }
  76. @end