bcdice 3.0.0.pre.alpha.2 → 3.0.0.pre.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +1 -0
  4. data/i18n/KillDeathBusiness/ja_jp.yml +4 -4
  5. data/i18n/KillDeathBusiness/ko_kr.yml +5 -4
  6. data/i18n/MagicaLogia/ko_kr.yml +564 -0
  7. data/i18n/MonotoneMuseum/ja_jp.yml +37 -1
  8. data/i18n/StratoShout/ja_jp.yml +4 -4
  9. data/i18n/StratoShout/ko_kr.yml +4 -4
  10. data/lib/bcdice.rb +2 -1
  11. data/lib/bcdice/arithmetic.rb +22 -0
  12. data/lib/bcdice/arithmetic/node.rb +112 -43
  13. data/lib/bcdice/arithmetic/parser.rb +240 -0
  14. data/lib/bcdice/arithmetic_evaluator.rb +5 -156
  15. data/lib/bcdice/base.rb +8 -1
  16. data/lib/bcdice/command/lexer.rb +57 -0
  17. data/lib/bcdice/command/parsed.rb +65 -0
  18. data/lib/bcdice/command/parser.rb +489 -0
  19. data/lib/bcdice/common_command/add_dice.rb +1 -1
  20. data/lib/bcdice/common_command/add_dice/node.rb +142 -69
  21. data/lib/bcdice/common_command/add_dice/parser.rb +100 -83
  22. data/lib/bcdice/common_command/barabara_dice/node.rb +7 -1
  23. data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
  24. data/lib/bcdice/common_command/calc/node.rb +10 -1
  25. data/lib/bcdice/common_command/calc/parser.rb +1 -1
  26. data/lib/bcdice/common_command/d66_dice.rb +3 -1
  27. data/lib/bcdice/common_command/lexer.rb +2 -1
  28. data/lib/bcdice/common_command/upper_dice/parser.rb +118 -97
  29. data/lib/bcdice/common_command/version.rb +1 -1
  30. data/lib/bcdice/deprecated/checker.rb +6 -6
  31. data/lib/bcdice/dice_table.rb +1 -0
  32. data/lib/bcdice/dice_table/d66_parity_table.rb +34 -0
  33. data/lib/bcdice/game_system.rb +3 -0
  34. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  35. data/lib/bcdice/game_system/AlchemiaStruggle.rb +312 -0
  36. data/lib/bcdice/game_system/Alshard.rb +0 -1
  37. data/lib/bcdice/game_system/Amadeus.rb +1 -1
  38. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -5
  39. data/lib/bcdice/game_system/BadLife.rb +1 -1
  40. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -10
  41. data/lib/bcdice/game_system/BeginningIdol.rb +4 -4
  42. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +4 -4
  43. data/lib/bcdice/game_system/BladeOfArcana.rb +4 -4
  44. data/lib/bcdice/game_system/BlindMythos.rb +12 -9
  45. data/lib/bcdice/game_system/BloodCrusade.rb +12 -38
  46. data/lib/bcdice/game_system/BloodMoon.rb +2 -2
  47. data/lib/bcdice/game_system/CardRanker.rb +23 -63
  48. data/lib/bcdice/game_system/ChaosFlare.rb +3 -3
  49. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  50. data/lib/bcdice/game_system/ColossalHunter.rb +2 -2
  51. data/lib/bcdice/game_system/Cthulhu7th.rb +2 -2
  52. data/lib/bcdice/game_system/CthulhuTech.rb +0 -1
  53. data/lib/bcdice/game_system/DarkBlaze.rb +4 -4
  54. data/lib/bcdice/game_system/DeadlineHeroes.rb +1 -1
  55. data/lib/bcdice/game_system/DoubleCross.rb +60 -93
  56. data/lib/bcdice/game_system/EmbryoMachine.rb +5 -5
  57. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +0 -1
  58. data/lib/bcdice/game_system/FilledWith.rb +3 -3
  59. data/lib/bcdice/game_system/FullMetalPanic.rb +0 -1
  60. data/lib/bcdice/game_system/GURPS.rb +1 -1
  61. data/lib/bcdice/game_system/Garako.rb +3 -2
  62. data/lib/bcdice/game_system/GardenOrder.rb +1 -1
  63. data/lib/bcdice/game_system/GehennaAn.rb +3 -3
  64. data/lib/bcdice/game_system/Gundog.rb +1 -1
  65. data/lib/bcdice/game_system/GundogRevised.rb +3 -3
  66. data/lib/bcdice/game_system/GundogZero.rb +2 -2
  67. data/lib/bcdice/game_system/GurpsFW.rb +2 -5
  68. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  69. data/lib/bcdice/game_system/HuntersMoon.rb +17 -110
  70. data/lib/bcdice/game_system/JuinKansen.rb +251 -0
  71. data/lib/bcdice/game_system/KanColle.rb +17 -166
  72. data/lib/bcdice/game_system/KillDeathBusiness.rb +35 -44
  73. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +2 -1
  74. data/lib/bcdice/game_system/LogHorizon.rb +8 -8
  75. data/lib/bcdice/game_system/LostRoyal.rb +1 -3
  76. data/lib/bcdice/game_system/MagicaLogia.rb +3 -3
  77. data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
  78. data/lib/bcdice/game_system/MeikyuDays.rb +1 -1
  79. data/lib/bcdice/game_system/MeikyuKingdom.rb +1 -1
  80. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +1 -1
  81. data/lib/bcdice/game_system/MetalHeadExtream.rb +4 -4
  82. data/lib/bcdice/game_system/MetallicGuardian.rb +0 -1
  83. data/lib/bcdice/game_system/MonotoneMuseum.rb +3 -2
  84. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +1 -1
  85. data/lib/bcdice/game_system/NSSQ.rb +2 -2
  86. data/lib/bcdice/game_system/Nechronica.rb +3 -3
  87. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  88. data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
  89. data/lib/bcdice/game_system/NinjaSlayer.rb +26 -28
  90. data/lib/bcdice/game_system/OracleEngine.rb +13 -17
  91. data/lib/bcdice/game_system/Paradiso.rb +2 -2
  92. data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
  93. data/lib/bcdice/game_system/Raisondetre.rb +1 -1
  94. data/lib/bcdice/game_system/RecordOfLodossWar.rb +2 -3
  95. data/lib/bcdice/game_system/RokumonSekai2.rb +2 -2
  96. data/lib/bcdice/game_system/RuinBreakers.rb +1 -1
  97. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  98. data/lib/bcdice/game_system/SRS.rb +0 -5
  99. data/lib/bcdice/game_system/SamsaraBallad.rb +4 -3
  100. data/lib/bcdice/game_system/Satasupe.rb +22 -14
  101. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  102. data/lib/bcdice/game_system/ShinkuuGakuen.rb +1 -1
  103. data/lib/bcdice/game_system/ShinobiGami.rb +75 -39
  104. data/lib/bcdice/game_system/StellarKnights.rb +1 -3
  105. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  106. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
  107. data/lib/bcdice/game_system/StratoShout.rb +10 -36
  108. data/lib/bcdice/game_system/StratoShout_Korean.rb +2 -1
  109. data/lib/bcdice/game_system/SwordWorld.rb +5 -5
  110. data/lib/bcdice/game_system/SwordWorld2_5.rb +1 -1
  111. data/lib/bcdice/game_system/TherapieSein.rb +2 -2
  112. data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
  113. data/lib/bcdice/game_system/Torg.rb +1 -1
  114. data/lib/bcdice/game_system/TorgEternity.rb +4 -7
  115. data/lib/bcdice/game_system/TrinitySeven.rb +2 -2
  116. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +6 -6
  117. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -1
  118. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  119. data/lib/bcdice/game_system/Warhammer.rb +6 -6
  120. data/lib/bcdice/game_system/Warhammer4.rb +9 -12
  121. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  122. data/lib/bcdice/normalize.rb +1 -1
  123. data/lib/bcdice/preprocessor.rb +12 -8
  124. data/lib/bcdice/randomizer.rb +12 -0
  125. data/lib/bcdice/repl.rb +1 -1
  126. data/lib/bcdice/result.rb +2 -0
  127. data/lib/bcdice/user_defined_dice_table.rb +26 -15
  128. data/lib/bcdice/version.rb +1 -1
  129. metadata +14 -25
  130. data/.editorconfig +0 -21
  131. data/.github/.codecov.yaml +0 -10
  132. data/.github/workflows/coverage.yaml +0 -21
  133. data/.github/workflows/lint.yaml +0 -13
  134. data/.github/workflows/test.yml +0 -20
  135. data/.gitignore +0 -14
  136. data/.rubocop.yml +0 -108
  137. data/.rubocop_todo.yml +0 -114
  138. data/Gemfile +0 -14
  139. data/ROADMAP.md +0 -30
  140. data/Rakefile +0 -152
  141. data/bcdice.gemspec +0 -29
  142. data/bin/repl.rb +0 -21
  143. data/docs/README.txt +0 -2028
  144. data/docs/dicebot_sort_key.md +0 -72
  145. data/docs/how_to_make_dicebot.md +0 -453
  146. data/lib/bcdice/command_parser.rb +0 -242
  147. data/lib/bcdice/common_command/add_dice/parser.y +0 -153
  148. data/lib/bcdice/common_command/barabara_dice/parser.y +0 -107
  149. data/lib/bcdice/common_command/calc/parser.y +0 -79
  150. data/lib/bcdice/common_command/reroll_dice/parser.y +0 -158
  151. data/lib/bcdice/common_command/upper_dice/parser.y +0 -143
@@ -126,15 +126,13 @@ module BCDice
126
126
 
127
127
  # 正規表現の都合で先頭に ',' が残っているので取っておく
128
128
  text = text[1..-1]
129
- rules = text.split(',').map do |rule|
129
+ text.split(',').map do |rule|
130
130
  v = rule.split('>').map(&:to_i)
131
131
  {
132
132
  from: v[0],
133
133
  to: v[1],
134
134
  }
135
135
  end
136
-
137
- rules
138
136
  end
139
137
 
140
138
  def roll_all_situation_b2_tables
@@ -104,7 +104,7 @@ module BCDice
104
104
 
105
105
  def getJudgeResult(command)
106
106
  case command
107
- when /(\d+)*DA([\d\+\*\-]*[\d])?\[(\d+),(\d+)(,(\d+))?\]/i
107
+ when /(\d+)*DA([\d+*\-]*\d)?\[(\d+),(\d+)(,(\d+))?\]/i
108
108
  number = (Regexp.last_match(1) || 1).to_i
109
109
  correction = (Regexp.last_match(2) || 0).to_i
110
110
  single = (Regexp.last_match(3) || 4).to_i
@@ -46,7 +46,7 @@ module BCDice
46
46
  debug("checkRoll begin command", command)
47
47
 
48
48
  result = ''
49
- return result unless command =~ /^(\d+)SR([\+\-]?\d+)?(>=(\d+))?$/i
49
+ return result unless command =~ /^(\d+)SR([+\-]?\d+)?(>=(\d+))?$/i
50
50
 
51
51
  diceCount = Regexp.last_match(1).to_i
52
52
  modify = Regexp.last_match(2).to_i
@@ -17,15 +17,14 @@ module BCDice
17
17
 
18
18
  VOT, GUT, BAT, KEYT, DRT: (ボーカル、ギター、ベース、キーボード、ドラム)トラブル表
19
19
  EMO: 感情表
20
- AT[1-6]: 特技表(空: ランダム 1: 主義 2: 身体 3: モチーフ 4: エモーション 5: 行動 6: 逆境)
20
+ ATn, RTTn: 特技表(n=分野。空:ランダム 1:主義 2:身体 3:モチーフ 4:エモーション 5:行動 6:逆境)
21
+ RCT: 分野ランダム表
21
22
  SCENE, MACHI, GAKKO, BAND: (汎用、街角、学校、バンド)シーン表 接近シーンで使用
22
23
  TENKAI: シーン展開表 奔走シーン 練習シーンで使用
23
24
 
24
- []内は省略可 D66入れ替えあり
25
+ D66入れ替えあり
25
26
  INFO_MESSAGE_TEXT
26
27
 
27
- register_prefix('AT[1-6]?')
28
-
29
28
  def initialize(command)
30
29
  super(command)
31
30
 
@@ -52,37 +51,7 @@ module BCDice
52
51
  end
53
52
 
54
53
  def eval_game_system_specific_command(command)
55
- if (m = /^AT([1-6]?)$/.match(command))
56
- value = m[1].to_i
57
- return getSkillList(value)
58
- end
59
-
60
- roll_tables(command, self.class::TABLES)
61
- end
62
-
63
- def getSkillList(field = 0)
64
- title = translate("StratoShout.AT.name")
65
- table = translate("StratoShout.AT.table")
66
-
67
- number1 = 0
68
- if field == 0
69
- table, number1 = get_table_by_1d6(table)
70
- else
71
- table = table[field - 1]
72
- end
73
-
74
- fieldName, table = table
75
- skill, number2 = get_table_by_2d6(table)
76
-
77
- text = title
78
- if field == 0
79
- text += " > [#{number1},#{number2}]"
80
- else
81
- skill_class = translate("StratoShout.AT.skill_class", name: fieldName)
82
- text += "#{skill_class} > [#{number2}]"
83
- end
84
-
85
- return "#{text} > 《#{skill}/#{fieldName}#{number2}》"
54
+ roll_tables(command, self.class::TABLES) || self.class::RTT.roll_command(@randomizer, command)
86
55
  end
87
56
 
88
57
  class << self
@@ -103,11 +72,16 @@ module BCDice
103
72
  "TENKAI" => DiceTable::D66Table.from_i18n("StratoShout.table.TENKAI", locale),
104
73
  }
105
74
  end
75
+
76
+ def translate_rtt(locale)
77
+ DiceTable::SaiFicSkillTable.from_i18n("StratoShout.RTT", locale, rtt: 'AT', rttn: ['AT1', 'AT2', 'AT3', 'AT4', 'AT5', 'AT6'])
78
+ end
106
79
  end
107
80
 
108
81
  TABLES = translate_tables(:ja_jp)
82
+ RTT = translate_rtt(:ja_jp)
109
83
 
110
- register_prefix(TABLES.keys)
84
+ register_prefix(TABLES.keys, RTT.prefixes)
111
85
  end
112
86
  end
113
87
  end
@@ -18,7 +18,7 @@ module BCDice
18
18
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
19
  VOT, GUT, BAT, KEYT, DRT: (보컬, 기타, 베이스, 키보드, 드럼)트러블표
20
20
  EMO: 감정표
21
- AT[1-6]: 특기표(공백: 랜덤 1: 주의 2: 신체 3: 모티브 4: 이모션 5: 행동 6: 역경)
21
+ RTT[1-6], AT[1-6]: 특기표(공백: 랜덤 1: 주의 2: 신체 3: 모티브 4: 이모션 5: 행동 6: 역경)
22
22
  SCENE, MACHI, GAKKO, BAND: (범용, 거리, 학교, 밴드)장면표. 접근 장면에 사용
23
23
  TENKAI: 장면 전개표. 분주 장면, 연습 장면에 사용
24
24
  []내는 생략가능 D66는 변동있음
@@ -33,6 +33,7 @@ module BCDice
33
33
  end
34
34
 
35
35
  TABLES = translate_tables(:ko_kr).freeze
36
+ RTT = translate_rtt(:ko_kr)
36
37
  end
37
38
  end
38
39
  end
@@ -71,7 +71,7 @@ module BCDice
71
71
 
72
72
  commands = getRatingCommandStrings
73
73
 
74
- m = /^S?(H?K[\d\+\-]+([#{commands}]\[([\d\+\-]+)\])*([\d\+\-]*)([CMR]\[([\d\+\-]+)\]|GF|H)*)/i.match(string)
74
+ m = /^S?(H?K[\d+\-]+([#{commands}]\[([\d+\-]+)\])*([\d+\-]*)([CMR]\[([\d+\-]+)\]|GF|H)*)/i.match(string)
75
75
  unless m
76
76
  debug("not matched")
77
77
  return '1'
@@ -86,7 +86,7 @@ module BCDice
86
86
 
87
87
  key, addValue = getKeyAndAddValueFromString(string)
88
88
 
89
- return '1' unless key =~ /([\d]+)/
89
+ return '1' unless key =~ /(\d+)/
90
90
 
91
91
  key = Regexp.last_match(1).to_i
92
92
 
@@ -204,12 +204,12 @@ module BCDice
204
204
  firstDiceChanteTo = 0
205
205
  firstDiceChangeModify = 0
206
206
 
207
- regexp = /m\[([\d\+\-]+)\]/i
207
+ regexp = /m\[([\d+\-]+)\]/i
208
208
 
209
209
  if regexp =~ string
210
210
  firstDiceChangeModify = Regexp.last_match(1)
211
211
 
212
- unless /[\+\-]/ =~ firstDiceChangeModify
212
+ unless /[+\-]/ =~ firstDiceChangeModify
213
213
  firstDiceChanteTo = firstDiceChangeModify.to_i
214
214
  firstDiceChangeModify = 0
215
215
  end
@@ -229,7 +229,7 @@ module BCDice
229
229
  key = nil
230
230
  addValue = 0
231
231
 
232
- if /K(\d+)([\d\+\-]*)/i =~ string # ボーナスの抽出
232
+ if /K(\d+)([\d+\-]*)/i =~ string # ボーナスの抽出
233
233
  key = Regexp.last_match(1)
234
234
  if Regexp.last_match(2)
235
235
  addValue = ArithmeticEvaluator.eval(Regexp.last_match(2))
@@ -108,7 +108,7 @@ module BCDice
108
108
 
109
109
  def getKeptDiceChangesFromString(string)
110
110
  keptDiceChangeModify = 0
111
- regexp = /a\[([\+\-]\d+)\]/i
111
+ regexp = /a\[([+\-]\d+)\]/i
112
112
  if regexp =~ string
113
113
  keptDiceChangeModify = Regexp.last_match(1)
114
114
  string = string.gsub(regexp, '')
@@ -36,13 +36,13 @@ module BCDice
36
36
  output =
37
37
  case command.upcase
38
38
 
39
- when /(TS|OP)(\d+)?(([\+\-]\d+)*)(\@(\d+))?$/i
39
+ when /(TS|OP)(\d+)?(([+\-]\d+)*)(@(\d+))?$/i
40
40
  hasCritical = (Regexp.last_match(1) == "OP")
41
41
  target = (Regexp.last_match(6) || 0).to_i
42
42
  modify = (Regexp.last_match(2) || 0).to_i
43
43
  modifyAddString = Regexp.last_match(3)
44
44
 
45
- modify_list = modifyAddString.scan(/[\+\-]\d+/) # 修正値を分割して配列へ
45
+ modify_list = modifyAddString.scan(/[+\-]\d+/) # 修正値を分割して配列へ
46
46
  modify_list.each { |i| modify += i.to_i }
47
47
 
48
48
  checkRoll(hasCritical, modify, target)
@@ -26,10 +26,10 @@ module BCDice
26
26
  @sort_add_dice = true
27
27
  end
28
28
 
29
- register_prefix('\d+D6.*')
29
+ register_prefix('\d+D6')
30
30
 
31
31
  def eval_game_system_specific_command(command)
32
- parser = CommandParser.new(/^\d+D6$/)
32
+ parser = Command::Parser.new(/\d+D6/, round_type: round_type)
33
33
  cmd = parser.parse(command)
34
34
  unless cmd
35
35
  return nil
@@ -120,7 +120,7 @@ module BCDice
120
120
  ttype = ""
121
121
  value = 0
122
122
 
123
- return nil unless /([RITMDB]T)(\d+([\+\-]\d+)*)/i =~ string
123
+ return nil unless /([RITMDB]T)(\d+([+\-]\d+)*)/i =~ string
124
124
 
125
125
  type = Regexp.last_match(1)
126
126
  num = Regexp.last_match(2)
@@ -42,9 +42,6 @@ module BCDice
42
42
   ・ロールボーナス表「BTx+y or BONUSx+y or TOTALx+y」 xは数値, yは技能基本値
43
43
  INFO_MESSAGE_TEXT
44
44
  register_prefix('TE.*', 'UP.*', 'POS.*', '\d+BD.*', 'TG.*', 'RT.*', 'Result.*', 'DT.*', 'damage.*', 'BT.*', 'bonus.*', 'total.*', '1R20.*')
45
- def initialize(command)
46
- super(command)
47
- end
48
45
 
49
46
  def eval_game_system_specific_command(command)
50
47
  torg_check(command) ||
@@ -176,7 +173,7 @@ module BCDice
176
173
  # ダメージボーナスコマンド
177
174
  def getBonusDamageDiceCommandResult(command)
178
175
  debug("TorgEternity Bonus Damage Roll Command ? ", command)
179
- m = /(\d+)(BD)(([\+\-]\d+)*)/i.match(command)
176
+ m = /(\d+)(BD)(([+\-]\d+)*)/i.match(command)
180
177
  unless m
181
178
  return nil
182
179
  end
@@ -196,7 +193,7 @@ module BCDice
196
193
  # 成功レベル表コマンド
197
194
  def getSuccessLevelDiceCommandResult(command)
198
195
  debug("TorgEternity Success Level Table Command ? ", command)
199
- m = /(RT|Result)(\-*\d+([\+\-]\d+)*)/i.match(command)
196
+ m = /(RT|Result)(-*\d+([+\-]\d+)*)/i.match(command)
200
197
  unless m
201
198
  return nil
202
199
  end
@@ -216,7 +213,7 @@ module BCDice
216
213
  # ダメージ結果表コマンド
217
214
  def getDamageResultDiceCommandResult(command)
218
215
  debug("TorgEternity Damage Result Table Command ? ", command)
219
- m = /(DT|Damage)(\-*\d+([\+\-]\d+)*)/i.match(command)
216
+ m = /(DT|Damage)(-*\d+([+\-]\d+)*)/i.match(command)
220
217
  unless m
221
218
  return nil
222
219
  end
@@ -232,7 +229,7 @@ module BCDice
232
229
  # ロールボーナス表コマンド
233
230
  def getRollBonusDiceCommandResult(command)
234
231
  debug("TorgEternity Roll Bonus Table Command ? ", command)
235
- m = /(BT|Bonus)(\d+)(([\+\-]\d+)*)/i.match(command)
232
+ m = /(BT|Bonus)(\d+)(([+\-]\d+)*)/i.match(command)
236
233
  unless m
237
234
  return nil
238
235
  end
@@ -44,14 +44,14 @@ module BCDice
44
44
  return "#{firstName} , #{secondName}"
45
45
  end
46
46
 
47
- if /^TR([\+\-\d]*)<=([\d]*)([\+\-\d]*)/ =~ command
47
+ if /^TR([+\-\d]*)<=(\d*)([+\-\d]*)/ =~ command
48
48
  critical = Regexp.last_match(1).to_i + 7
49
49
  target = Regexp.last_match(2).to_i
50
50
  modify = Regexp.last_match(3).to_i
51
51
  return rollHit(command, critical, target, modify)
52
52
  end
53
53
 
54
- if /^([\d]*)DM([\d]*)([\+\-\d]*)$/ =~ command
54
+ if /^(\d*)DM(\d*)([+\-\d]*)$/ =~ command
55
55
  diceCount = Regexp.last_match(1).to_i
56
56
  critical = Regexp.last_match(2).to_i
57
57
  modify = Regexp.last_match(3).to_i
@@ -42,9 +42,9 @@ module BCDice
42
42
 
43
43
  def replace_text(string)
44
44
  if /BS/i =~ string
45
- string = string.gsub(/(\d+)HBS([^\d\s][\+\-\d]+)/i) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(2)}[H]" }
45
+ string = string.gsub(/(\d+)HBS([^\d\s][+\-\d]+)/i) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(2)}[H]" }
46
46
  string = string.gsub(/(\d+)HBS/i) { "#{Regexp.last_match(1)}R6[H]" }
47
- string = string.gsub(/(\d+)BS([^\d\s][\+\-\d]+)/i) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(2)}" }
47
+ string = string.gsub(/(\d+)BS([^\d\s][+\-\d]+)/i) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(2)}" }
48
48
  string = string.gsub(/(\d+)BS/i) { "#{Regexp.last_match(1)}R6" }
49
49
  end
50
50
 
@@ -61,7 +61,7 @@ module BCDice
61
61
 
62
62
  output = "1"
63
63
 
64
- return output unless (m = /(^|\s)S?((\d+)[rR]6([\+\-\d]*)(\[(\w+)\])?)(\s|$)/i.match(string))
64
+ return output unless (m = /(^|\s)S?((\d+)[rR]6([+\-\d]*)(\[(\w+)\])?)(\s|$)/i.match(string))
65
65
 
66
66
  debug('tandt_berserk matched')
67
67
 
@@ -184,9 +184,9 @@ module BCDice
184
184
  command = command
185
185
  .sub(/\d+LV$/i) { |level| level.to_i * 5 + 15 }
186
186
 
187
- parser = CommandParser.new(/^\d+D6$/)
188
- .allow_cmp_op(nil, :>=)
189
- .enable_question_target()
187
+ parser = Command::Parser.new(/\d+D6/, round_type: round_type)
188
+ .restrict_cmp_op_to(nil, :>=)
189
+ .enable_question_target()
190
190
  cmd = parser.parse(command)
191
191
  unless cmd
192
192
  return nil
@@ -58,7 +58,7 @@ module BCDice
58
58
  private
59
59
 
60
60
  def check_roll(command)
61
- m = /^2D6([\+\-\d]*)>=(\d+)(\[(\d+)?(,(\d+))?\])?$/i.match(command)
61
+ m = /^2D6([+\-\d]*)>=(\d+)(\[(\d+)?(,(\d+))?\])?$/i.match(command)
62
62
  unless m
63
63
  return nil
64
64
  end
@@ -39,7 +39,7 @@ module BCDice
39
39
  result = ''
40
40
 
41
41
  case command
42
- when /(\d+)?UK(\@?(\d))?(>=(\d+))?/i
42
+ when /(\d+)?UK(@?(\d))?(>=(\d+))?/i
43
43
  base = (Regexp.last_match(1) || 2).to_i
44
44
  crit = Regexp.last_match(3).to_i
45
45
  diff = Regexp.last_match(5).to_i
@@ -255,18 +255,18 @@ module BCDice
255
255
  debug("pos_type", pos_type)
256
256
  if pos_type != ""
257
257
  case pos_type
258
- when /\@(2W|W2)/i
258
+ when /@(2W|W2)/i
259
259
  pos_t = 1
260
- when /\@(4W|W4)/i
260
+ when /@(4W|W4)/i
261
261
  pos_t = 4
262
- when /\@(4H|H4)/i
262
+ when /@(4H|H4)/i
263
263
  pos_t = 3
264
- when /\@4/i
264
+ when /@4/i
265
265
  pos_t = 2
266
- when /\@W/i
266
+ when /@W/i
267
267
  pos_t = 5
268
268
  else
269
- unless /\@(2H|H2|2)/i =~ pos_type
269
+ unless /@(2H|H2|2)/i =~ pos_type
270
270
  pos_t = -1
271
271
  end
272
272
  end
@@ -263,19 +263,16 @@ module BCDice
263
263
 
264
264
  def additional_result(total, target_number)
265
265
  tens, ones = split_d100(total)
266
- result =
267
- if (total > target_number) || (total > 95) # 自動失敗時のファンブル処理も
268
- if ones == tens
269
- "ファンブル"
270
- end
271
- elsif ones == tens
272
- "クリティカル"
273
- else
274
- # 一の位と十の位を入れ替えて参照する
275
- HIT_PARTS_TABLE.fetch(merge_d100(ones, tens)).content
266
+ if (total > target_number) || (total > 95) # 自動失敗時のファンブル処理も
267
+ if ones == tens
268
+ "ファンブル"
276
269
  end
277
-
278
- result
270
+ elsif ones == tens
271
+ "クリティカル"
272
+ else
273
+ # 一の位と十の位を入れ替えて参照する
274
+ HIT_PARTS_TABLE.fetch(merge_d100(ones, tens)).content
275
+ end
279
276
  end
280
277
 
281
278
  def split_d100(dice)
@@ -23,7 +23,7 @@ module BCDice
23
23
  register_prefix('\d+\-2DR.*')
24
24
 
25
25
  def eval_game_system_specific_command(command)
26
- return nil unless command =~ /^(\d+)-2DR([\+\-\d]*)(>=(\d+))?$/i
26
+ return nil unless command =~ /^(\d+)-2DR([+\-\d]*)(>=(\d+))?$/i
27
27
 
28
28
  baseAvility = Regexp.last_match(1).to_i
29
29
  modText = Regexp.last_match(2)
@@ -18,7 +18,7 @@ module BCDice
18
18
  :<
19
19
  when />/
20
20
  :>
21
- when /\=/
21
+ when /=/
22
22
  :==
23
23
  end
24
24
  end
@@ -29,7 +29,7 @@ module BCDice
29
29
 
30
30
  @text = @game_system.change_text(@text)
31
31
 
32
- replace_implicit_d6()
32
+ replace_implicit_d()
33
33
 
34
34
  return @text
35
35
  end
@@ -45,18 +45,22 @@ module BCDice
45
45
  def replace_parentheses
46
46
  loop do
47
47
  prev = @text
48
- @text = @text.gsub(%r{\([\d/\+\*\-]+\)}) do |expr|
49
- ae = ArithmeticEvaluator.new(expr, round_type: @game_system.round_type)
50
- val = ae.eval
51
- ae.error? ? expr : val
48
+ @text = @text.gsub(%r{\([\d/+*\-CURF]+\)}) do |expr|
49
+ Arithmetic.eval(expr, @game_system.round_type) || expr
52
50
  end
53
51
  break if prev == @text
54
52
  end
55
53
  end
56
54
 
57
- # nDをnD6に置き換える
58
- def replace_implicit_d6
59
- @text = @text.gsub(/(\d+)D([^\w]|$)/i) { "#{Regexp.last_match(1)}D6#{Regexp.last_match(2)}" }
55
+ # nDをゲームシステムに応じて置き換える
56
+ def replace_implicit_d
57
+ @text = @text.gsub(/(\d+)D([^\w]|$)/i) do
58
+ times = Regexp.last_match(1)
59
+ sides = @game_system.sides_implicit_d
60
+ trailer = Regexp.last_match(2)
61
+
62
+ "#{times}D#{sides}#{trailer}"
63
+ end
60
64
  end
61
65
  end
62
66
  end