A set of classes for parsing, evaluating, and formatting die roll strings.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

SA_DiceExpression.m 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. //
  2. // SA_DiceExpression.m
  3. // SA_IRCBotServer
  4. //
  5. // Created by Said Achmiz on 6/23/19.
  6. //
  7. //
  8. #import "SA_DiceExpression.h"
  9. /*********************/
  10. #pragma mark Functions
  11. /*********************/
  12. NSString *NSStringFromSA_DiceExpressionOperator(SA_DiceExpressionOperator operator) {
  13. static NSDictionary <NSNumber *, NSString *> *SA_DiceExpressionOperatorStringValues;
  14. static dispatch_once_t onceToken;
  15. dispatch_once(&onceToken, ^{
  16. SA_DiceExpressionOperatorStringValues = @{ @(SA_DiceExpressionOperator_NONE) : @"SA_DB_OPERATOR_NONE",
  17. @(SA_DiceExpressionOperator_MINUS) : @"SA_DB_OPERATOR_MINUS",
  18. @(SA_DiceExpressionOperator_PLUS) : @"SA_DB_OPERATOR_PLUS",
  19. @(SA_DiceExpressionOperator_TIMES) : @"SA_DB_OPERATOR_TIMES"
  20. };
  21. });
  22. return SA_DiceExpressionOperatorStringValues[@(operator)];
  23. }
  24. NSString *NSStringFromSA_DiceExpressionRollCommand(SA_DiceExpressionRollCommand command) {
  25. static NSDictionary <NSNumber *, NSString *> *SA_DiceExpressionRollCommandStringValues;
  26. static dispatch_once_t onceToken;
  27. dispatch_once(&onceToken, ^{
  28. SA_DiceExpressionRollCommandStringValues = @{ @(SA_DiceExpressionRollCommand_SUM) : @"SA_DB_ROLL_COMMAND_SUM",
  29. @(SA_DiceExpressionRollCommand_SUM_EXPLODING) : @"SA_DB_ROLL_COMMAND_SUM_EXPLODING"
  30. };
  31. });
  32. return SA_DiceExpressionRollCommandStringValues[@(command)];
  33. }
  34. NSString *NSStringFromSA_DiceExpressionRollModifier(SA_DiceExpressionRollModifier modifier) {
  35. static NSDictionary <NSNumber *, NSString *> *SA_DiceExpressionRollModifierStringValues;
  36. static dispatch_once_t onceToken;
  37. dispatch_once(&onceToken, ^{
  38. SA_DiceExpressionRollModifierStringValues = @{ @(SA_DiceExpressionRollModifier_KEEP_HIGHEST) : @"SA_DB_ROLL_MODIFIER_KEEP_HIGHEST",
  39. @(SA_DiceExpressionRollModifier_KEEP_LOWEST) : @"SA_DB_ROLL_MODIFIER_KEEP_LOWEST"
  40. };
  41. });
  42. return SA_DiceExpressionRollModifierStringValues[@(modifier)];
  43. }
  44. NSString *NSStringFromSA_DiceExpressionError(SA_DiceExpressionError error) {
  45. static NSDictionary <NSNumber *, NSString *> *SA_DiceExpressionErrorStringValues;
  46. static dispatch_once_t onceToken;
  47. dispatch_once(&onceToken, ^{
  48. SA_DiceExpressionErrorStringValues = @{ @(SA_DiceExpressionError_ROLL_STRING_EMPTY) : @"SA_DB_ERROR_ROLL_STRING_EMPTY",
  49. @(SA_DiceExpressionError_ROLL_STRING_HAS_ILLEGAL_CHARACTERS) : @"SA_DB_ERROR_ROLL_STRING_HAS_ILLEGAL_CHARACTERS",
  50. @(SA_DiceExpressionError_UNKNOWN_ROLL_COMMAND) : @"SA_DB_ERROR_UNKNOWN_ROLL_COMMAND",
  51. @(SA_DiceExpressionError_ROLL_MODIFIER_INAPPLICABLE) : @"SA_DB_ERROR_ROLL_MODIFIER_INAPPLICABLE",
  52. @(SA_DiceExpressionError_UNKNOWN_ROLL_MODIFIER) : @"SA_DB_ERROR_UNKNOWN_ROLL_MODIFIER",
  53. @(SA_DiceExpressionError_DIE_COUNT_NEGATIVE) : @"SA_DB_ERROR_DIE_COUNT_NEGATIVE",
  54. @(SA_DiceExpressionError_DIE_COUNT_EXCESSIVE) : @"SA_DB_ERROR_DIE_COUNT_EXCESSIVE",
  55. @(SA_DiceExpressionError_DIE_SIZE_INVALID) : @"SA_DB_ERROR_DIE_SIZE_INVALID",
  56. @(SA_DiceExpressionError_DIE_SIZE_EXCESSIVE) : @"SA_DB_ERROR_DIE_SIZE_EXCESSIVE",
  57. @(SA_DiceExpressionError_UNKNOWN_OPERATOR) : @"SA_DB_ERROR_UNKNOWN_OPERATOR",
  58. @(SA_DiceExpressionError_INVALID_EXPRESSION) : @"SA_DB_ERROR_INVALID_EXPRESSION",
  59. @(SA_DiceExpressionError_INTEGER_OVERFLOW_NEGATION) : @"SA_DB_ERROR_INTEGER_OVERFLOW_NEGATION",
  60. @(SA_DiceExpressionError_INTEGER_OVERFLOW_ADDITION) : @"SA_DB_ERROR_INTEGER_OVERFLOW_ADDITION",
  61. @(SA_DiceExpressionError_INTEGER_UNDERFLOW_ADDITION) : @"SA_DB_ERROR_INTEGER_UNDERFLOW_ADDITION",
  62. @(SA_DiceExpressionError_INTEGER_OVERFLOW_SUBTRACTION) : @"SA_DB_ERROR_INTEGER_OVERFLOW_SUBTRACTION",
  63. @(SA_DiceExpressionError_INTEGER_UNDERFLOW_SUBTRACTION) : @"SA_DB_ERROR_INTEGER_UNDERFLOW_SUBTRACTION",
  64. @(SA_DiceExpressionError_INTEGER_OVERFLOW_MULTIPLICATION) : @"SA_DB_ERROR_INTEGER_OVERFLOW_MULTIPLICATION",
  65. @(SA_DiceExpressionError_INTEGER_UNDERFLOW_MULTIPLICATION) : @"SA_DB_ERROR_INTEGER_UNDERFLOW_MULTIPLICATION",
  66. @(SA_DiceExpressionError_KEEP_COUNT_EXCEEDS_ROLL_COUNT) : @"SA_DB_ERROR_KEEP_COUNT_EXCEEDS_ROLL_COUNT",
  67. @(SA_DiceExpressionError_KEEP_COUNT_NEGATIVE) : @"SA_DB_ERROR_KEEP_COUNT_NEGATIVE"
  68. };
  69. });
  70. return SA_DiceExpressionErrorStringValues[@(error)];
  71. }
  72. NSComparisonResult compareEvaluatedExpressionsByResult(SA_DiceExpression *expression1,
  73. SA_DiceExpression *expression2) {
  74. if (expression1.result.integerValue < expression2.result.integerValue)
  75. return NSOrderedAscending;
  76. else if (expression1.result.integerValue > expression2.result.integerValue)
  77. return NSOrderedDescending;
  78. else
  79. return NSOrderedSame;
  80. }
  81. NSComparisonResult compareEvaluatedExpressionsByAttemptBonus(SA_DiceExpression *expression1,
  82. SA_DiceExpression *expression2) {
  83. if (expression1.rightOperand.result.integerValue < expression2.rightOperand.result.integerValue)
  84. return NSOrderedAscending;
  85. else if (expression1.rightOperand.result.integerValue > expression2.rightOperand.result.integerValue)
  86. return NSOrderedDescending;
  87. else
  88. return NSOrderedSame;
  89. }
  90. /****************************************************/
  91. #pragma mark - SA_DiceExpression class implementation
  92. /****************************************************/
  93. @implementation SA_DiceExpression
  94. /*******************************/
  95. #pragma mark - NSCopying methods
  96. /*******************************/
  97. -(instancetype) copyWithZone:(NSZone *)zone {
  98. SA_DiceExpression *copy = [SA_DiceExpression new];
  99. copy.type = _type;
  100. copy.errorBitMask = _errorBitMask;
  101. copy.operator = _operator;
  102. copy.leftOperand = [_leftOperand copy];
  103. copy.rightOperand = [_rightOperand copy];
  104. copy.rollCommand = _rollCommand;
  105. copy.dieCount = [_dieCount copy];
  106. copy.dieSize = [_dieSize copy];
  107. copy.dieType = _dieType;
  108. copy.rollModifier = _rollModifier;
  109. copy.value = _value;
  110. copy.inputString = _inputString;
  111. copy.attributedInputString = _attributedInputString;
  112. copy.result = _result;
  113. copy.rolls = _rolls;
  114. return copy;
  115. }
  116. @end