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

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