A set of classes for parsing, evaluating, and formatting die roll strings.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

SA_DiceBag.m 2.3KB

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