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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -1
  3. data/.rubocop.yml +12 -0
  4. data/.rubocop_todo.yml +1 -0
  5. data/CHANGELOG.md +34 -0
  6. data/Gemfile +6 -3
  7. data/Rakefile +52 -18
  8. data/bcdice.gemspec +2 -0
  9. data/i18n/Amadeus/ja_jp.yml +386 -0
  10. data/i18n/Amadeus/ko_kr.yml +148 -0
  11. data/i18n/Cthulhu/ja_jp.yml +11 -0
  12. data/i18n/Cthulhu/ko_kr.yml +11 -0
  13. data/i18n/Cthulhu/zh_hant.yml +11 -0
  14. data/i18n/DetatokoSaga/ja_jp.yml +74 -0
  15. data/i18n/DetatokoSaga/ko_kr.yml +74 -0
  16. data/i18n/DoubleCross/ja_jp.yml +53 -0
  17. data/i18n/DoubleCross/ko_kr.yml +53 -0
  18. data/i18n/Dracurouge/ja_jp.yml +1374 -0
  19. data/i18n/Dracurouge/ko_kr.yml +295 -0
  20. data/i18n/Fiasco/ja_jp.yml +10 -0
  21. data/i18n/Fiasco/ko_kr.yml +10 -0
  22. data/i18n/FutariSousa/ja_jp.yml +720 -0
  23. data/i18n/FutariSousa/ko_kr.yml +746 -0
  24. data/i18n/Insane/ja_jp.yml +454 -0
  25. data/i18n/Insane/ko_kr.yml +502 -0
  26. data/i18n/Kamigakari/ja_jp.yml +276 -0
  27. data/i18n/Kamigakari/ko_kr.yml +204 -0
  28. data/i18n/KillDeathBusiness/ja_jp.yml +1092 -0
  29. data/i18n/KillDeathBusiness/ko_kr.yml +1062 -0
  30. data/i18n/LogHorizon/ja_jp.yml +3082 -0
  31. data/i18n/LogHorizon/ko_kr.yml +923 -0
  32. data/i18n/MagicaLogia/ja_jp.yml +564 -0
  33. data/i18n/MonotoneMuseum/ja_jp.yml +525 -0
  34. data/i18n/MonotoneMuseum/ko_kr.yml +89 -0
  35. data/i18n/Nechronica/ja_jp.yml +57 -0
  36. data/i18n/Nechronica/ko_kr.yml +14 -0
  37. data/i18n/StratoShout/ja_jp.yml +160 -0
  38. data/i18n/StratoShout/ko_kr.yml +160 -0
  39. data/i18n/ja_jp.yml +5 -0
  40. data/i18n/ko_kr.yml +7 -0
  41. data/i18n/zh_hant.yml +3 -0
  42. data/lib/bcdice/arithmetic/node.rb +154 -0
  43. data/lib/bcdice/base.rb +87 -101
  44. data/lib/bcdice/common_command.rb +2 -0
  45. data/lib/bcdice/common_command/add_dice.rb +5 -41
  46. data/lib/bcdice/common_command/add_dice/node.rb +92 -16
  47. data/lib/bcdice/common_command/add_dice/parser.rb +374 -274
  48. data/lib/bcdice/common_command/add_dice/parser.y +153 -0
  49. data/lib/bcdice/common_command/add_dice/randomizer.rb +25 -33
  50. data/lib/bcdice/common_command/barabara_dice.rb +6 -47
  51. data/lib/bcdice/common_command/barabara_dice/node.rb +84 -0
  52. data/lib/bcdice/common_command/barabara_dice/parser.rb +336 -0
  53. data/lib/bcdice/common_command/barabara_dice/parser.y +107 -0
  54. data/lib/bcdice/common_command/calc.rb +7 -30
  55. data/lib/bcdice/common_command/calc/node.rb +30 -0
  56. data/lib/bcdice/common_command/calc/parser.rb +271 -0
  57. data/lib/bcdice/common_command/calc/parser.y +79 -0
  58. data/lib/bcdice/common_command/choice.rb +137 -19
  59. data/lib/bcdice/common_command/d66_dice.rb +48 -34
  60. data/lib/bcdice/common_command/lexer.rb +46 -0
  61. data/lib/bcdice/common_command/repeat.rb +102 -0
  62. data/lib/bcdice/common_command/reroll_dice.rb +8 -158
  63. data/lib/bcdice/common_command/reroll_dice/node.rb +198 -0
  64. data/lib/bcdice/common_command/reroll_dice/parser.rb +421 -0
  65. data/lib/bcdice/common_command/reroll_dice/parser.y +158 -0
  66. data/lib/bcdice/common_command/upper_dice.rb +10 -129
  67. data/lib/bcdice/common_command/upper_dice/node.rb +181 -0
  68. data/lib/bcdice/common_command/upper_dice/parser.rb +412 -0
  69. data/lib/bcdice/common_command/upper_dice/parser.y +143 -0
  70. data/lib/bcdice/common_command/version.rb +9 -17
  71. data/lib/bcdice/deprecated/checker.rb +78 -0
  72. data/lib/bcdice/dice_table/d66_grid_table.rb +8 -0
  73. data/lib/bcdice/dice_table/d66_table.rb +10 -0
  74. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +75 -17
  75. data/lib/bcdice/dice_table/sai_fic_skill_table/category.rb +25 -0
  76. data/lib/bcdice/dice_table/sai_fic_skill_table/skill.rb +23 -0
  77. data/lib/bcdice/dice_table/table.rb +8 -0
  78. data/lib/bcdice/game_system.rb +7 -1
  79. data/lib/bcdice/game_system/AFF2e.rb +1 -1
  80. data/lib/bcdice/game_system/AceKillerGene.rb +2 -2
  81. data/lib/bcdice/game_system/Airgetlamh.rb +3 -3
  82. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  83. data/lib/bcdice/game_system/Alshard.rb +1 -1
  84. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  85. data/lib/bcdice/game_system/Amadeus.rb +46 -507
  86. data/lib/bcdice/game_system/Amadeus_Korean.rb +12 -456
  87. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -1
  88. data/lib/bcdice/game_system/Arianrhod.rb +0 -1
  89. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  90. data/lib/bcdice/game_system/Avandner.rb +1 -1
  91. data/lib/bcdice/game_system/BBN.rb +1 -1
  92. data/lib/bcdice/game_system/BadLife.rb +1 -1
  93. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  94. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -2
  95. data/lib/bcdice/game_system/BeginningIdol.rb +2 -3
  96. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +2 -3
  97. data/lib/bcdice/game_system/BladeOfArcana.rb +2 -2
  98. data/lib/bcdice/game_system/BlindMythos.rb +1 -1
  99. data/lib/bcdice/game_system/BloodCrusade.rb +0 -1
  100. data/lib/bcdice/game_system/BloodMoon.rb +0 -1
  101. data/lib/bcdice/game_system/CardRanker.rb +1 -2
  102. data/lib/bcdice/game_system/ChaosFlare.rb +1 -1
  103. data/lib/bcdice/game_system/Chill.rb +1 -1
  104. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  105. data/lib/bcdice/game_system/ColossalHunter.rb +1 -2
  106. data/lib/bcdice/game_system/Comes.rb +50 -0
  107. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  108. data/lib/bcdice/game_system/Cthulhu.rb +94 -97
  109. data/lib/bcdice/game_system/Cthulhu7th.rb +108 -67
  110. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  111. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  112. data/lib/bcdice/game_system/CthulhuTech.rb +8 -14
  113. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +7 -190
  114. data/lib/bcdice/game_system/Cthulhu_Korean.rb +5 -186
  115. data/lib/bcdice/game_system/DarkBlaze.rb +9 -5
  116. data/lib/bcdice/game_system/DarkDaysDrive.rb +17 -15
  117. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  118. data/lib/bcdice/game_system/DeadlineHeroes.rb +2 -2
  119. data/lib/bcdice/game_system/DemonParasite.rb +1 -2
  120. data/lib/bcdice/game_system/DetatokoSaga.rb +48 -149
  121. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +6 -274
  122. data/lib/bcdice/game_system/DiceOfTheDead.rb +9 -6
  123. data/lib/bcdice/game_system/DoubleCross.rb +102 -81
  124. data/lib/bcdice/game_system/DoubleCross_Korean.rb +13 -330
  125. data/lib/bcdice/game_system/Dracurouge.rb +376 -1678
  126. data/lib/bcdice/game_system/Dracurouge_Korean.rb +16 -271
  127. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  128. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  129. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  130. data/lib/bcdice/game_system/Elysion.rb +3 -4
  131. data/lib/bcdice/game_system/EmbryoMachine.rb +1 -1
  132. data/lib/bcdice/game_system/Emoklore.rb +131 -0
  133. data/lib/bcdice/game_system/EndBreaker.rb +1 -2
  134. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -1
  135. data/lib/bcdice/game_system/Fiasco.rb +87 -70
  136. data/lib/bcdice/game_system/Fiasco_Korean.rb +7 -95
  137. data/lib/bcdice/game_system/FilledWith.rb +462 -566
  138. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -1
  139. data/lib/bcdice/game_system/FutariSousa.rb +103 -938
  140. data/lib/bcdice/game_system/FutariSousa_Korean.rb +7 -948
  141. data/lib/bcdice/game_system/{Gurps.rb → GURPS.rb} +184 -217
  142. data/lib/bcdice/game_system/Garako.rb +131 -39
  143. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  144. data/lib/bcdice/game_system/GehennaAn.rb +1 -1
  145. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  146. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  147. data/lib/bcdice/game_system/GoldenSkyStories.rb +1 -1
  148. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  149. data/lib/bcdice/game_system/GranCrest.rb +2 -3
  150. data/lib/bcdice/game_system/GundogRevised.rb +1 -1
  151. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  152. data/lib/bcdice/game_system/GurpsFW.rb +2 -3
  153. data/lib/bcdice/game_system/HarnMaster.rb +2 -2
  154. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -2
  155. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  156. data/lib/bcdice/game_system/HuntersMoon.rb +1 -2
  157. data/lib/bcdice/game_system/Illusio.rb +2 -2
  158. data/lib/bcdice/game_system/Insane.rb +90 -717
  159. data/lib/bcdice/game_system/Insane_Korean.rb +7 -719
  160. data/lib/bcdice/game_system/Kamigakari.rb +47 -242
  161. data/lib/bcdice/game_system/Kamigakari_Korean.rb +6 -394
  162. data/lib/bcdice/game_system/KanColle.rb +3 -3
  163. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  164. data/lib/bcdice/game_system/KillDeathBusiness.rb +162 -1144
  165. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +6 -1459
  166. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  167. data/lib/bcdice/game_system/LiveraDoll.rb +2 -2
  168. data/lib/bcdice/game_system/LogHorizon.rb +350 -3379
  169. data/lib/bcdice/game_system/LogHorizon_Korean.rb +55 -1357
  170. data/lib/bcdice/game_system/LostRecord.rb +0 -1
  171. data/lib/bcdice/game_system/LostRoyal.rb +1 -2
  172. data/lib/bcdice/game_system/MagicaLogia.rb +158 -1044
  173. data/lib/bcdice/game_system/MeikyuDays.rb +1 -2
  174. data/lib/bcdice/game_system/MeikyuKingdom.rb +4 -4
  175. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -5
  176. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  177. data/lib/bcdice/game_system/MetalHeadExtream.rb +2 -2
  178. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -1
  179. data/lib/bcdice/game_system/MonotoneMuseum.rb +38 -239
  180. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +10 -270
  181. data/lib/bcdice/game_system/NSSQ.rb +159 -0
  182. data/lib/bcdice/game_system/Nechronica.rb +34 -73
  183. data/lib/bcdice/game_system/Nechronica_Korean.rb +11 -128
  184. data/lib/bcdice/game_system/NeverCloud.rb +1 -1
  185. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  186. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  187. data/lib/bcdice/game_system/NinjaSlayer.rb +12 -11
  188. data/lib/bcdice/game_system/NjslyrBattle.rb +1 -1
  189. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -2
  190. data/lib/bcdice/game_system/OracleEngine.rb +1 -1
  191. data/lib/bcdice/game_system/OrgaRain.rb +2 -2
  192. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  193. data/lib/bcdice/game_system/Paranoia.rb +1 -1
  194. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  195. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  196. data/lib/bcdice/game_system/Peekaboo.rb +22 -122
  197. data/lib/bcdice/game_system/Postman.rb +2 -2
  198. data/lib/bcdice/game_system/PulpCthulhu.rb +3 -3
  199. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  200. data/lib/bcdice/game_system/RecordOfLodossWar.rb +1 -1
  201. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  202. data/lib/bcdice/game_system/RokumonSekai2.rb +1 -1
  203. data/lib/bcdice/game_system/RuinBreakers.rb +296 -0
  204. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  205. data/lib/bcdice/game_system/SRS.rb +1 -2
  206. data/lib/bcdice/game_system/SamsaraBallad.rb +1 -1
  207. data/lib/bcdice/game_system/Satasupe.rb +1 -2
  208. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  209. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  210. data/lib/bcdice/game_system/ShadowRun5.rb +2 -2
  211. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  212. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +1 -1
  213. data/lib/bcdice/game_system/ShinkuuGakuen.rb +2 -2
  214. data/lib/bcdice/game_system/ShinobiGami.rb +1 -2
  215. data/lib/bcdice/game_system/ShoujoTenrankai.rb +2 -2
  216. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  217. data/lib/bcdice/game_system/SteamPunkers.rb +1 -1
  218. data/lib/bcdice/game_system/StellarKnights.rb +1 -2
  219. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  220. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -2
  221. data/lib/bcdice/game_system/StratoShout.rb +44 -247
  222. data/lib/bcdice/game_system/StratoShout_Korean.rb +6 -282
  223. data/lib/bcdice/game_system/Strave.rb +2 -2
  224. data/lib/bcdice/game_system/SwordWorld.rb +8 -9
  225. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -3
  226. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -3
  227. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  228. data/lib/bcdice/game_system/TokumeiTenkousei.rb +1 -1
  229. data/lib/bcdice/game_system/TokyoGhostResearch.rb +2 -2
  230. data/lib/bcdice/game_system/Torg.rb +2 -2
  231. data/lib/bcdice/game_system/Torg1_5.rb +1 -1
  232. data/lib/bcdice/game_system/TorgEternity.rb +1 -1
  233. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  234. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  235. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -2
  236. data/lib/bcdice/game_system/UnsungDuet.rb +139 -0
  237. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  238. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  239. data/lib/bcdice/game_system/Villaciel.rb +1 -2
  240. data/lib/bcdice/game_system/Warhammer.rb +1 -1
  241. data/lib/bcdice/game_system/Warhammer4.rb +329 -0
  242. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  243. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  244. data/lib/bcdice/game_system/YankeeYogSothoth.rb +15 -15
  245. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  246. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  247. data/lib/bcdice/game_system/filled_with/cook_tables.rb +119 -0
  248. data/lib/bcdice/game_system/filled_with/lot_tables.rb +155 -0
  249. data/lib/bcdice/loader.rb +6 -8
  250. data/lib/bcdice/preprocessor.rb +15 -40
  251. data/lib/bcdice/repl.rb +1 -1
  252. data/lib/bcdice/result.rb +83 -0
  253. data/lib/bcdice/translate.rb +11 -0
  254. data/lib/bcdice/version.rb +1 -1
  255. metadata +80 -4
@@ -3,6 +3,7 @@ require "bcdice/common_command/barabara_dice"
3
3
  require "bcdice/common_command/calc"
4
4
  require "bcdice/common_command/choice"
5
5
  require "bcdice/common_command/d66_dice"
6
+ require "bcdice/common_command/repeat"
6
7
  require "bcdice/common_command/reroll_dice"
7
8
  require "bcdice/common_command/upper_dice"
8
9
  require "bcdice/common_command/version"
@@ -15,6 +16,7 @@ module BCDice
15
16
  Calc,
16
17
  Choice,
17
18
  D66Dice,
19
+ Repeat,
18
20
  RerollDice,
19
21
  UpperDice,
20
22
  Version,
@@ -4,50 +4,14 @@ require "bcdice/common_command/add_dice/randomizer"
4
4
 
5
5
  module BCDice
6
6
  module CommonCommand
7
- class AddDice
7
+ module AddDice
8
8
  PREFIX_PATTERN = /[\+\-\dD\(\[]+/.freeze
9
9
 
10
- def initialize(command, randomizer, game_system)
11
- @command = command
12
- @bcdice = randomizer
13
- @diceBot = game_system
14
-
15
- @dice_list = []
16
- @is_secret = false
17
- end
18
-
19
- def secret?
20
- @is_secret
21
- end
22
-
23
- def eval()
24
- parser = Parser.new(@command)
25
-
26
- command = parser.parse()
27
- if parser.error?
28
- return nil
10
+ class << self
11
+ def eval(command, game_system, randomizer)
12
+ cmd = Parser.parse(command)
13
+ cmd&.eval(game_system, randomizer)
29
14
  end
30
-
31
- randomizer = Randomizer.new(@bcdice, @diceBot, command.cmp_op)
32
- total = command.lhs.eval(randomizer)
33
-
34
- output =
35
- if randomizer.dice_list.size <= 1 && command.lhs.is_a?(Node::DiceRoll)
36
- "(#{command}) > #{total}"
37
- else
38
- "(#{command}) > #{command.lhs.output} > #{total}"
39
- end
40
-
41
- dice_list = randomizer.dice_list
42
-
43
- if command.cmp_op
44
- dice_total = dice_list.inject(&:+)
45
- output += @diceBot.check_result(total, dice_total, dice_list, randomizer.sides, command.cmp_op, command.rhs)
46
- end
47
-
48
- @is_secret = parser.secret?
49
-
50
- return output
51
15
  end
52
16
  end
53
17
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "singleton"
4
+
3
5
  module BCDice
4
6
  module CommonCommand
5
- class AddDice
7
+ module AddDice
6
8
  # 加算ロールの構文解析木のノードを格納するモジュール
7
9
  module Node
8
10
  # 加算ロールコマンドのノード。
@@ -24,7 +26,8 @@ module BCDice
24
26
  # @param [Object] lhs 左辺のノード
25
27
  # @param [Symbol] cmp_op 比較演算子
26
28
  # @param [Integer, String] rhs 右辺のノード
27
- def initialize(lhs, cmp_op, rhs)
29
+ def initialize(secret, lhs, cmp_op = nil, rhs = nil)
30
+ @secret = secret
28
31
  @lhs = lhs
29
32
  @cmp_op = cmp_op
30
33
  @rhs = rhs
@@ -33,19 +36,48 @@ module BCDice
33
36
  # 文字列に変換する
34
37
  # @return [String]
35
38
  def to_s
36
- @lhs.to_s + cmp_op_text + @rhs.to_s
39
+ @lhs.to_s + cmp_op_text + @rhs&.eval(nil).to_s
37
40
  end
38
41
 
39
42
  # ノードのS式を返す
40
43
  # @return [String]
41
44
  def s_exp
42
45
  if @cmp_op
43
- "(Command (#{@cmp_op} #{@lhs.s_exp} #{@rhs}))"
46
+ "(Command (#{@cmp_op} #{@lhs.s_exp} #{@rhs.s_exp}))"
44
47
  else
45
48
  "(Command #{@lhs.s_exp})"
46
49
  end
47
50
  end
48
51
 
52
+ def eval(game_system, randomizer)
53
+ randomizer = Randomizer.new(randomizer, game_system)
54
+ total = @lhs.eval(randomizer)
55
+
56
+ interrim_expr =
57
+ unless randomizer.rand_results.size <= 1 && @lhs.is_a?(Node::DiceRoll)
58
+ @lhs.output
59
+ end
60
+
61
+ result =
62
+ if @cmp_op
63
+ rhs = @rhs.eval(nil)
64
+ game_system.check_result(total, randomizer.rand_results, @cmp_op, rhs)
65
+ end
66
+ result ||= Result.new
67
+
68
+ sequence = [
69
+ "(#{self})",
70
+ interrim_expr,
71
+ total,
72
+ result&.text
73
+ ].compact
74
+
75
+ result.tap do |r|
76
+ r.secret = @secret
77
+ r.text = sequence.join(" > ")
78
+ end
79
+ end
80
+
49
81
  private
50
82
 
51
83
  # メッセージ中で比較演算子をどのように表示するかを返す
@@ -62,6 +94,25 @@ module BCDice
62
94
  end
63
95
  end
64
96
 
97
+ class UndecidedTarget
98
+ include Singleton
99
+
100
+ def eval(_randomizer)
101
+ "?"
102
+ end
103
+
104
+ def include_dice?
105
+ false
106
+ end
107
+
108
+ def to_s
109
+ "?"
110
+ end
111
+
112
+ alias output to_s
113
+ alias s_exp to_s
114
+ end
115
+
65
116
  # 二項演算子のノード
66
117
  class BinaryOp
67
118
  # ノードを初期化する
@@ -87,6 +138,11 @@ module BCDice
87
138
  return calc(lhs, rhs)
88
139
  end
89
140
 
141
+ # @return [Boolean]
142
+ def include_dice?
143
+ @lhs.include_dice? || @rhs.include_dice?
144
+ end
145
+
90
146
  # 文字列に変換する
91
147
  # @return [String]
92
148
  def to_s
@@ -258,6 +314,11 @@ module BCDice
258
314
  -@body.eval(randomizer)
259
315
  end
260
316
 
317
+ # @return [Boolean]
318
+ def include_dice?
319
+ @body.include_dice?
320
+ end
321
+
261
322
  # 文字列に変換する
262
323
  # @return [String]
263
324
  def to_s
@@ -283,8 +344,8 @@ module BCDice
283
344
  # @param [Number] times ダイスを振る回数のノード
284
345
  # @param [Number] sides ダイスの面数のノード
285
346
  def initialize(times, sides)
286
- @times = times.literal
287
- @sides = sides.literal
347
+ @times = times.eval(nil)
348
+ @sides = sides.eval(nil)
288
349
 
289
350
  # ダイスを振った結果の出力
290
351
  @text = nil
@@ -298,19 +359,19 @@ module BCDice
298
359
  # @param [Randomizer] randomizer ランダマイザ
299
360
  # @return [Integer] 評価結果(出目の合計値)
300
361
  def eval(randomizer)
301
- dice_groups = randomizer.roll(@times, @sides)
302
-
303
- # TODO: Ruby 2.4以降では Array#sum が使える
304
- total = dice_groups.flatten.reduce(0, &:+)
362
+ dice_list = randomizer.roll(@times, @sides)
305
363
 
306
- dice_str = dice_groups
307
- .map { |dice_list| "[#{dice_list.join(',')}]" }
308
- .join
309
- @text = "#{total}#{dice_str}"
364
+ total = dice_list.sum()
365
+ @text = "#{total}[#{dice_list.join(',')}]"
310
366
 
311
367
  return total
312
368
  end
313
369
 
370
+ # @return [Boolean]
371
+ def include_dice?
372
+ true
373
+ end
374
+
314
375
  # 文字列に変換する
315
376
  # @return [String]
316
377
  def to_s
@@ -391,16 +452,21 @@ module BCDice
391
452
  # @param [Randomizer] randomizer ランダマイザ
392
453
  # @return [Integer] 評価結果(出目の合計値)
393
454
  def eval(randomizer)
394
- sorted_values = randomizer.roll_once(@times, @sides).sort
455
+ sorted_values = randomizer.roll(@times, @sides).sort
395
456
  total = @filter
396
457
  .apply[sorted_values, @n_filtering]
397
- .reduce(0, &:+)
458
+ .sum()
398
459
 
399
460
  @text = "#{total}[#{sorted_values.join(',')}]"
400
461
 
401
462
  return total
402
463
  end
403
464
 
465
+ # @return [Boolean]
466
+ def include_dice?
467
+ true
468
+ end
469
+
404
470
  # 文字列に変換する
405
471
  # @return [String]
406
472
  def to_s
@@ -433,6 +499,11 @@ module BCDice
433
499
  @expr.eval(randomizer)
434
500
  end
435
501
 
502
+ # @return [Boolean]
503
+ def include_dice?
504
+ @expr.include_dice?
505
+ end
506
+
436
507
  # @return [String]
437
508
  def to_s
438
509
  "(#{@expr})"
@@ -473,6 +544,11 @@ module BCDice
473
544
  @literal
474
545
  end
475
546
 
547
+ # @return [Boolean]
548
+ def include_dice?
549
+ false
550
+ end
551
+
476
552
  # 文字列に変換する
477
553
  # @return [String]
478
554
  def to_s
@@ -1,282 +1,382 @@
1
- # frozen_string_literal: true
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.5.1
4
+ # from Racc grammar file "".
5
+ #
2
6
 
3
- require "bcdice/arithmetic_evaluator"
4
- require "bcdice/normalize"
7
+ require 'racc/parser.rb'
8
+
9
+
10
+ require "bcdice/common_command/lexer"
5
11
  require "bcdice/common_command/add_dice/node"
6
12
 
7
13
  module BCDice
8
14
  module CommonCommand
9
- class AddDice
10
- # 加算ロールの構文解析器のクラス
11
- class Parser
12
- # 構文解析器を初期化する
13
- # @param [String] expr 構文解析対象の文字列
14
- def initialize(expr)
15
- # 構文解析対象の文字列
16
- @expr = expr
17
- # 読み込んだトークンのインデックス
18
- @idx = 0
19
- # 構文解析エラーが発生したかどうか
20
- @error = false
21
- # 式にダイスロールが含まれるか
22
- @contain_dice_roll = false
23
-
24
- @is_secret = false
25
- end
26
-
27
- def secret?
28
- @is_secret
29
- end
30
-
31
- # 構文解析を実行する
32
- # @return [Node::Command, nil] 加算ロールコマンド
33
- def parse()
34
- lhs, cmp_op, rhs = @expr.partition(/[<>=]+/)
35
-
36
- cmp_op = Normalize.comparison_operator(cmp_op)
37
- if cmp_op && rhs.empty?
38
- @error = true
39
- return nil
40
- end
41
-
42
- if !rhs.empty? && rhs != "?"
43
- ae = ArithmeticEvaluator.new(rhs)
44
- rhs = ae.eval()
45
-
46
- @error = ae.error?
47
- end
48
-
49
- @tokens = tokenize(lhs)
50
- lhs = expr()
51
-
52
- if @idx != @tokens.size || !@contain_dice_roll
53
- @error = true
54
- end
55
-
56
- return AddDice::Node::Command.new(lhs, cmp_op, rhs)
57
- end
58
-
59
- # 構文解析エラーが発生したかどうかを返す
60
- # @return [Boolean]
61
- def error?
62
- @error
63
- end
64
-
65
- private
66
-
67
- # 構文解析対象の文字列をトークンの配列に変換する
68
- # @return [Array<String>]
69
- def tokenize(expr)
70
- expr.gsub(%r{[\+\-\*/DURSKHL@()]}) { |e| " #{e} " }.split(" ")
71
- end
72
-
73
- # 式
74
- def expr
75
- @is_secret = consume("S")
76
-
77
- return add()
78
- end
79
-
80
- # 加算、減算
81
- def add
82
- node = mul()
83
-
84
- loop do
85
- if consume("+")
86
- op, rhs = sub_negative_number(:+, mul())
87
- node = AddDice::Node::BinaryOp.new(node, op, rhs)
88
- elsif consume("-")
89
- op, rhs = sub_negative_number(:-, mul())
90
- node = AddDice::Node::BinaryOp.new(node, op, rhs)
91
- else
92
- break
93
- end
94
- end
95
-
96
- return node
97
- end
98
-
99
- # TODO: 処理の説明を書く
100
- def sub_negative_number(op, rhs)
101
- if rhs.is_a?(Node::Number) && rhs.literal < 0
102
- if op == :+
103
- return [:-, rhs.negate]
104
- elsif op == :-
105
- return [:+, rhs.negate]
106
- end
107
- end
108
-
109
- [op, rhs]
110
- end
111
-
112
- # 乗算、除算
113
- def mul
114
- node = unary()
115
-
116
- loop do
117
- if consume("*")
118
- node = AddDice::Node::BinaryOp.new(node, :*, unary())
119
- elsif consume("/")
120
- rhs = unary()
121
- klass = divide_node_class()
122
- node = klass.new(node, rhs)
123
- else
124
- break
125
- end
126
- end
127
-
128
- return node
129
- end
130
-
131
- # 端数処理方法を示す記号を読み込み、対応する除算ノードのクラスを返す
132
- # @return [Class] 除算ノードのクラス
133
- def divide_node_class
134
- if consume("U")
135
- # 切り上げ
136
- Node::DivideWithRoundingUp
137
- elsif consume("R")
138
- # 四捨五入
139
- Node::DivideWithRoundingOff
140
- else
141
- # 切り捨て
142
- Node::DivideWithRoundingDown
143
- end
144
- end
145
-
146
- # 単項演算
147
- def unary
148
- if consume("+")
149
- unary()
150
- elsif consume("-")
151
- node = unary()
152
-
153
- case node
154
- when Node::Negate
155
- node.body
156
- when Node::Number
157
- node.negate()
158
- else
159
- AddDice::Node::Negate.new(node)
160
- end
161
- else
162
- term()
163
- end
164
- end
165
-
166
- # カッコ、ダイスロール
167
- def term
168
- if consume("(")
169
- node = AddDice::Node::Parenthesis.new(add())
170
- expect(")")
171
-
172
- return node
173
- else
174
- dice_notation()
175
- end
176
- end
177
-
178
- # ダイスロール、数値
179
- def dice_notation
180
- num = expect_number()
181
- if consume("D")
182
- times = num
183
- sides = expect_number()
184
-
185
- filter = dice_roll_filter()
186
- if filter
187
- # ダイスロール後のフィルタリングあり
188
- n_filtering = expect_number()
189
- @contain_dice_roll = true
190
- return Node::DiceRollWithFilter.new(times, sides, n_filtering, filter)
191
- end
192
-
193
- # 通常のダイスロール
194
- @contain_dice_roll = true
195
- return Node::DiceRoll.new(times, sides)
196
- end
197
-
198
- return num
199
- end
200
-
201
- # ダイスロール:フィルタ処理
202
- def dice_roll_filter
203
- if consume("K", "H")
204
- # 大きな出目から複数個取る
205
- Node::DiceRollWithFilter::KEEP_HIGHEST
206
- elsif consume("K", "L")
207
- # 小さな出目から複数個取る
208
- Node::DiceRollWithFilter::KEEP_LOWEST
209
- elsif consume("D", "H")
210
- # 大きな出目から複数個除く
211
- Node::DiceRollWithFilter::DROP_HIGHEST
212
- elsif consume("D", "L")
213
- # 小さな出目から複数個除く
214
- Node::DiceRollWithFilter::DROP_LOWEST
215
- end
216
- end
217
-
218
- # トークンを消費する
219
- #
220
- # トークンと期待した文字列が合致していた場合、次のトークンに進む。
221
- # 合致していなかった場合は、進まない。
222
- #
223
- # @param [String] expected 期待する文字列
224
- # @return [true] トークンと期待した文字列が合致していた場合
225
- # @return [false] トークンと期待した文字列が合致していなかった場合
226
- def consume(*expected)
227
- target = @tokens.slice(@idx, expected.length)
228
- unless target == expected
229
- return false
230
- end
231
-
232
- @idx += expected.length
233
- return true
234
- end
235
-
236
- # 指定された文字列のトークンを要求する
237
- #
238
- # トークンと期待した文字列が合致していなかった場合、エラーとする。
239
- # エラーの有無にかかわらず、次のトークンに進む。
240
- #
241
- # @param [String] str 期待する文字列
242
- # @return [void]
243
- def expect(str)
244
- if @tokens[@idx] != str
245
- @error = true
246
- end
247
-
248
- @idx += 1
249
- end
250
-
251
- # 整数のトークンを要求する
252
- #
253
- # 整数のトークンならば、対応する整数のノードを返す。
254
- # そうでなければエラーとし、整数0のノードを返す。
255
- #
256
- # エラーの有無にかかわらず、次のトークンに進む。
257
- #
258
- # @return [Node::Number] 整数のノード
259
- def expect_number()
260
- unless integer?(@tokens[@idx])
261
- @error = true
262
- @idx += 1
263
- return AddDice::Node::Number.new(0)
264
- end
265
-
266
- ret = @tokens[@idx].to_i
267
- @idx += 1
268
- return AddDice::Node::Number.new(ret)
269
- end
270
-
271
- # 文字列が整数かどうかを返す
272
- # @param [String] str 対象文字列
273
- # @return [Boolean]
274
- def integer?(str)
275
- # Ruby 1.9 以降では Kernel.#Integer を使うべき
276
- # Ruby 1.8 にもあるが、基数を指定できない問題がある
277
- !/^\d+$/.match(str).nil?
278
- end
279
- end
15
+ module AddDice
16
+ class Parser < Racc::Parser
17
+
18
+
19
+ def self.parse(source)
20
+ new.parse(source)
21
+ end
22
+
23
+ def parse(source)
24
+ @lexer = Lexer.new(source)
25
+ do_parse()
26
+ rescue ParseError
27
+ nil
28
+ end
29
+
30
+ private
31
+
32
+ def next_token
33
+ @lexer.next_token
34
+ end
35
+
36
+ # 加減算の右辺が負数である場合に加減算を逆転させる
37
+ def expand_negate(op, rhs)
38
+ if rhs.is_a?(Node::Negate)
39
+ if op == :+
40
+ return [:-, rhs.body]
41
+ elsif op == :-
42
+ return [:+, rhs.body]
280
43
  end
281
44
  end
45
+
46
+ [op, rhs]
47
+ end
48
+ ##### State transition tables begin ###
49
+
50
+ racc_action_table = [
51
+ 13, 16, 17, 18, 19, 13, 32, 13, 3, 8,
52
+ 9, 4, 13, 12, 13, 26, 8, 9, 12, 13,
53
+ 12, 8, 9, 8, 9, 12, 13, 12, 8, 9,
54
+ 14, 13, 12, 13, 22, 8, 9, 13, 13, 12,
55
+ 8, 9, 8, 9, 12, 15, 12, 8, 9, nil,
56
+ 12, 12, nil, 16, 17, 16, 17, 18, 19, 18,
57
+ 19, 34, 35, 38, 37, 40, 41, 42, 43 ]
58
+
59
+ racc_action_check = [
60
+ 15, 23, 23, 6, 6, 22, 23, 2, 0, 15,
61
+ 15, 1, 8, 15, 9, 15, 2, 2, 22, 12,
62
+ 2, 8, 8, 9, 9, 8, 16, 9, 12, 12,
63
+ 4, 17, 12, 18, 11, 16, 16, 36, 19, 16,
64
+ 17, 17, 18, 18, 17, 5, 18, 19, 19, nil,
65
+ 36, 19, nil, 5, 5, 25, 25, 27, 27, 28,
66
+ 28, 30, 30, 31, 31, 37, 37, 38, 38 ]
67
+
68
+ racc_action_pointer = [
69
+ 4, 11, 5, nil, 30, 42, -10, nil, 10, 12,
70
+ nil, 29, 17, nil, nil, -2, 24, 29, 31, 36,
71
+ nil, nil, 3, -10, nil, 44, nil, 44, 46, nil,
72
+ 52, 58, nil, nil, nil, nil, 35, 58, 60, nil,
73
+ nil, nil, nil, nil ]
74
+
75
+ racc_action_default = [
76
+ -3, -29, -29, -4, -29, -1, -9, -12, -29, -29,
77
+ -18, -22, -29, -28, 44, -29, -29, -29, -29, -29,
78
+ -16, -17, -20, -29, -2, -5, -6, -7, -8, -10,
79
+ -13, -19, -27, -11, -14, -15, -29, -29, -29, -21,
80
+ -23, -24, -25, -26 ]
81
+
82
+ racc_goto_table = [
83
+ 31, 1, 5, 27, 28, 2, 20, 21, 24, 33,
84
+ 36, nil, 23, nil, 39, 25, 29, 30 ]
85
+
86
+ racc_goto_check = [
87
+ 9, 1, 3, 5, 5, 2, 6, 6, 4, 7,
88
+ 10, nil, 3, nil, 9, 3, 6, 6 ]
89
+
90
+ racc_goto_pointer = [
91
+ nil, 1, 5, 0, -7, -13, -2, -21, nil, -22,
92
+ -21 ]
93
+
94
+ racc_goto_default = [
95
+ nil, nil, nil, nil, nil, 6, 7, nil, 10, 11,
96
+ nil ]
97
+
98
+ racc_reduce_table = [
99
+ 0, 0, :racc_error,
100
+ 2, 19, :_reduce_1,
101
+ 4, 19, :_reduce_2,
102
+ 0, 20, :_reduce_3,
103
+ 1, 20, :_reduce_4,
104
+ 1, 22, :_reduce_none,
105
+ 1, 22, :_reduce_6,
106
+ 3, 21, :_reduce_7,
107
+ 3, 21, :_reduce_8,
108
+ 1, 21, :_reduce_none,
109
+ 3, 23, :_reduce_10,
110
+ 4, 23, :_reduce_11,
111
+ 1, 23, :_reduce_none,
112
+ 0, 25, :_reduce_13,
113
+ 1, 25, :_reduce_14,
114
+ 1, 25, :_reduce_15,
115
+ 2, 24, :_reduce_16,
116
+ 2, 24, :_reduce_17,
117
+ 1, 24, :_reduce_none,
118
+ 3, 26, :_reduce_19,
119
+ 2, 26, :_reduce_20,
120
+ 5, 26, :_reduce_21,
121
+ 1, 26, :_reduce_none,
122
+ 2, 28, :_reduce_23,
123
+ 2, 28, :_reduce_24,
124
+ 2, 28, :_reduce_25,
125
+ 2, 28, :_reduce_26,
126
+ 3, 27, :_reduce_27,
127
+ 1, 27, :_reduce_28 ]
128
+
129
+ racc_reduce_n = 29
130
+
131
+ racc_shift_n = 44
132
+
133
+ racc_token_table = {
134
+ false => 0,
135
+ :error => 1,
136
+ :NUMBER => 2,
137
+ :CMP_OP => 3,
138
+ :S => 4,
139
+ :D => 5,
140
+ :K => 6,
141
+ :H => 7,
142
+ :L => 8,
143
+ :U => 9,
144
+ :R => 10,
145
+ :PLUS => 11,
146
+ :MINUS => 12,
147
+ :ASTERISK => 13,
148
+ :SLASH => 14,
149
+ :PARENL => 15,
150
+ :PARENR => 16,
151
+ :QUESTION => 17 }
152
+
153
+ racc_nt_base = 18
154
+
155
+ racc_use_result_var = true
156
+
157
+ Racc_arg = [
158
+ racc_action_table,
159
+ racc_action_check,
160
+ racc_action_default,
161
+ racc_action_pointer,
162
+ racc_goto_table,
163
+ racc_goto_check,
164
+ racc_goto_default,
165
+ racc_goto_pointer,
166
+ racc_nt_base,
167
+ racc_reduce_table,
168
+ racc_token_table,
169
+ racc_shift_n,
170
+ racc_reduce_n,
171
+ racc_use_result_var ]
172
+
173
+ Racc_token_to_s_table = [
174
+ "$end",
175
+ "error",
176
+ "NUMBER",
177
+ "CMP_OP",
178
+ "S",
179
+ "D",
180
+ "K",
181
+ "H",
182
+ "L",
183
+ "U",
184
+ "R",
185
+ "PLUS",
186
+ "MINUS",
187
+ "ASTERISK",
188
+ "SLASH",
189
+ "PARENL",
190
+ "PARENR",
191
+ "QUESTION",
192
+ "$start",
193
+ "command",
194
+ "secret",
195
+ "add",
196
+ "target",
197
+ "mul",
198
+ "unary",
199
+ "round_type",
200
+ "dice",
201
+ "term",
202
+ "filter_type" ]
203
+
204
+ Racc_debug_parser = false
205
+
206
+ ##### State transition tables end #####
207
+
208
+ # reduce 0 omitted
209
+
210
+ def _reduce_1(val, _values, result)
211
+ secret, lhs = val
212
+ raise ParseError unless lhs.include_dice?
213
+
214
+ result = Node::Command.new(secret, lhs)
215
+
216
+ result
217
+ end
218
+
219
+ def _reduce_2(val, _values, result)
220
+ secret, lhs, cmp_op, rhs = val
221
+ raise ParseError if !lhs.include_dice? || rhs.include_dice? || cmp_op.nil?
222
+
223
+ result = Node::Command.new(secret, lhs, cmp_op, rhs)
224
+
225
+ result
226
+ end
227
+
228
+ def _reduce_3(val, _values, result)
229
+ result = false
230
+ result
231
+ end
232
+
233
+ def _reduce_4(val, _values, result)
234
+ result = true
235
+ result
236
+ end
237
+
238
+ # reduce 5 omitted
239
+
240
+ def _reduce_6(val, _values, result)
241
+ result = Node::UndecidedTarget.instance
242
+ result
243
+ end
244
+
245
+ def _reduce_7(val, _values, result)
246
+ lhs = val[0]
247
+ op, rhs = expand_negate(:+, val[2])
248
+ result = Node::BinaryOp.new(lhs, op, rhs)
249
+
250
+ result
251
+ end
252
+
253
+ def _reduce_8(val, _values, result)
254
+ lhs = val[0]
255
+ op, rhs = expand_negate(:-, val[2])
256
+ result = Node::BinaryOp.new(lhs, op, rhs)
257
+
258
+ result
259
+ end
260
+
261
+ # reduce 9 omitted
262
+
263
+ def _reduce_10(val, _values, result)
264
+ lhs = val[0]
265
+ rhs = val[2]
266
+ result = Node::BinaryOp.new(lhs, :*, rhs)
267
+
268
+ result
269
+ end
270
+
271
+ def _reduce_11(val, _values, result)
272
+ lhs = val[0]
273
+ rhs = val[2]
274
+ divied_class = val[3]
275
+ result = divied_class.new(lhs, rhs)
276
+
277
+ result
278
+ end
279
+
280
+ # reduce 12 omitted
281
+
282
+ def _reduce_13(val, _values, result)
283
+ result = Node::DivideWithRoundingDown
284
+ result
285
+ end
286
+
287
+ def _reduce_14(val, _values, result)
288
+ result = Node::DivideWithRoundingUp
289
+ result
290
+ end
291
+
292
+ def _reduce_15(val, _values, result)
293
+ result = Node::DivideWithRoundingOff
294
+ result
295
+ end
296
+
297
+ def _reduce_16(val, _values, result)
298
+ result = val[1]
299
+ result
300
+ end
301
+
302
+ def _reduce_17(val, _values, result)
303
+ body = val[1]
304
+ result = body.is_a?(Node::Negate) ? body.body : Node::Negate.new(body)
305
+
306
+ result
282
307
  end
308
+
309
+ # reduce 18 omitted
310
+
311
+ def _reduce_19(val, _values, result)
312
+ times = val[0]
313
+ sides = val[2]
314
+ raise ParseError if times.include_dice? || sides.include_dice?
315
+
316
+ result = Node::DiceRoll.new(times, sides)
317
+
318
+ result
319
+ end
320
+
321
+ def _reduce_20(val, _values, result)
322
+ times = val[0]
323
+ sides = Node::Number.new(6)
324
+ raise ParseError if times.include_dice?
325
+
326
+ result = Node::DiceRoll.new(times, sides)
327
+
328
+ result
329
+ end
330
+
331
+ def _reduce_21(val, _values, result)
332
+ times = val[0]
333
+ sides = val[2]
334
+ filter = val[3]
335
+ n_filtering = val[4]
336
+ raise ParseError if times.include_dice? || sides.include_dice? || n_filtering.include_dice?
337
+
338
+ result = Node::DiceRollWithFilter.new(times, sides, n_filtering, filter)
339
+
340
+ result
341
+ end
342
+
343
+ # reduce 22 omitted
344
+
345
+ def _reduce_23(val, _values, result)
346
+ result = Node::DiceRollWithFilter::KEEP_HIGHEST
347
+ result
348
+ end
349
+
350
+ def _reduce_24(val, _values, result)
351
+ result = Node::DiceRollWithFilter::KEEP_LOWEST
352
+ result
353
+ end
354
+
355
+ def _reduce_25(val, _values, result)
356
+ result = Node::DiceRollWithFilter::DROP_HIGHEST
357
+ result
358
+ end
359
+
360
+ def _reduce_26(val, _values, result)
361
+ result = Node::DiceRollWithFilter::DROP_LOWEST
362
+ result
363
+ end
364
+
365
+ def _reduce_27(val, _values, result)
366
+ result = Node::Parenthesis.new(val[1])
367
+ result
368
+ end
369
+
370
+ def _reduce_28(val, _values, result)
371
+ result = Node::Number.new(val[0])
372
+ result
373
+ end
374
+
375
+ def _reduce_none(val, _values, result)
376
+ val[0]
377
+ end
378
+
379
+ end # class Parser
380
+ end # module AddDice
381
+ end # module CommonCommand
382
+ end # module BCDice