bcdice 3.0.0.pre.alpha.2 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -1
  3. data/README.md +34 -7
  4. data/i18n/DetatokoSaga/ja_jp.yml +3 -2
  5. data/i18n/DetatokoSaga/ko_kr.yml +1 -0
  6. data/i18n/KillDeathBusiness/ja_jp.yml +4 -4
  7. data/i18n/KillDeathBusiness/ko_kr.yml +5 -4
  8. data/i18n/MagicaLogia/ko_kr.yml +564 -0
  9. data/i18n/MonotoneMuseum/ja_jp.yml +40 -4
  10. data/i18n/StratoShout/ja_jp.yml +4 -4
  11. data/i18n/StratoShout/ko_kr.yml +4 -4
  12. data/lib/bcdice.rb +4 -1
  13. data/lib/bcdice/arithmetic.rb +22 -0
  14. data/lib/bcdice/arithmetic/node.rb +112 -43
  15. data/lib/bcdice/arithmetic/parser.rb +240 -0
  16. data/lib/bcdice/arithmetic_evaluator.rb +7 -156
  17. data/lib/bcdice/base.rb +8 -1
  18. data/lib/bcdice/command/lexer.rb +57 -0
  19. data/lib/bcdice/command/parsed.rb +65 -0
  20. data/lib/bcdice/command/parser.rb +489 -0
  21. data/lib/bcdice/common_command.rb +2 -0
  22. data/lib/bcdice/common_command/add_dice.rb +3 -1
  23. data/lib/bcdice/common_command/add_dice/node.rb +142 -69
  24. data/lib/bcdice/common_command/add_dice/parser.rb +100 -83
  25. data/lib/bcdice/common_command/add_dice/randomizer.rb +2 -0
  26. data/lib/bcdice/common_command/barabara_dice.rb +2 -0
  27. data/lib/bcdice/common_command/barabara_dice/node.rb +9 -1
  28. data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
  29. data/lib/bcdice/common_command/calc.rb +2 -0
  30. data/lib/bcdice/common_command/calc/node.rb +10 -1
  31. data/lib/bcdice/common_command/calc/parser.rb +1 -1
  32. data/lib/bcdice/common_command/d66_dice.rb +5 -1
  33. data/lib/bcdice/common_command/lexer.rb +2 -1
  34. data/lib/bcdice/common_command/upper_dice.rb +2 -0
  35. data/lib/bcdice/common_command/upper_dice/parser.rb +118 -97
  36. data/lib/bcdice/common_command/version.rb +3 -1
  37. data/lib/bcdice/deprecated/checker.rb +6 -6
  38. data/lib/bcdice/dice_table.rb +3 -0
  39. data/lib/bcdice/dice_table/chain_table.rb +2 -0
  40. data/lib/bcdice/dice_table/d66_grid_table.rb +2 -0
  41. data/lib/bcdice/dice_table/d66_parity_table.rb +36 -0
  42. data/lib/bcdice/dice_table/d66_range_table.rb +2 -0
  43. data/lib/bcdice/dice_table/d66_table.rb +2 -0
  44. data/lib/bcdice/dice_table/roll_result.rb +2 -0
  45. data/lib/bcdice/dice_table/table.rb +2 -0
  46. data/lib/bcdice/enum.rb +2 -0
  47. data/lib/bcdice/format.rb +2 -0
  48. data/lib/bcdice/game_system.rb +10 -0
  49. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  50. data/lib/bcdice/game_system/AlchemiaStruggle.rb +346 -0
  51. data/lib/bcdice/game_system/Alshard.rb +1 -2
  52. data/lib/bcdice/game_system/Amadeus.rb +1 -1
  53. data/lib/bcdice/game_system/AngelGear.rb +123 -0
  54. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -5
  55. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  56. data/lib/bcdice/game_system/BBN.rb +7 -5
  57. data/lib/bcdice/game_system/BadLife.rb +2 -2
  58. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  59. data/lib/bcdice/game_system/BeastBindTrinity.rb +3 -12
  60. data/lib/bcdice/game_system/BeginningIdol.rb +4 -4
  61. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +4 -4
  62. data/lib/bcdice/game_system/BladeOfArcana.rb +4 -4
  63. data/lib/bcdice/game_system/BlindMythos.rb +12 -10
  64. data/lib/bcdice/game_system/BloodCrusade.rb +54 -80
  65. data/lib/bcdice/game_system/BloodMoon.rb +43 -2
  66. data/lib/bcdice/game_system/CardRanker.rb +24 -64
  67. data/lib/bcdice/game_system/ChaosFlare.rb +4 -4
  68. data/lib/bcdice/game_system/Chill.rb +1 -1
  69. data/lib/bcdice/game_system/CodeLayerd.rb +37 -67
  70. data/lib/bcdice/game_system/ColossalHunter.rb +2 -2
  71. data/lib/bcdice/game_system/Cthulhu.rb +8 -4
  72. data/lib/bcdice/game_system/Cthulhu7th.rb +42 -336
  73. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  74. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  75. data/lib/bcdice/game_system/CthulhuTech.rb +1 -2
  76. data/lib/bcdice/game_system/DarkBlaze.rb +5 -5
  77. data/lib/bcdice/game_system/DeadlineHeroes.rb +1 -1
  78. data/lib/bcdice/game_system/DesperateRun.rb +163 -0
  79. data/lib/bcdice/game_system/DetatokoSaga.rb +25 -7
  80. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +3 -3
  81. data/lib/bcdice/game_system/DiceBot.rb +22 -4
  82. data/lib/bcdice/game_system/DiceOfTheDead.rb +1 -1
  83. data/lib/bcdice/game_system/DoubleCross.rb +61 -94
  84. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  85. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  86. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  87. data/lib/bcdice/game_system/Elysion.rb +2 -2
  88. data/lib/bcdice/game_system/EmbryoMachine.rb +6 -6
  89. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -2
  90. data/lib/bcdice/game_system/FilledWith.rb +3 -3
  91. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -2
  92. data/lib/bcdice/game_system/GURPS.rb +1 -1
  93. data/lib/bcdice/game_system/Garako.rb +14 -5
  94. data/lib/bcdice/game_system/GardenOrder.rb +1 -1
  95. data/lib/bcdice/game_system/GehennaAn.rb +4 -4
  96. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  97. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  98. data/lib/bcdice/game_system/Gundog.rb +1 -1
  99. data/lib/bcdice/game_system/GundogRevised.rb +3 -3
  100. data/lib/bcdice/game_system/GundogZero.rb +2 -2
  101. data/lib/bcdice/game_system/GurpsFW.rb +2 -5
  102. data/lib/bcdice/game_system/HarnMaster.rb +1 -1
  103. data/lib/bcdice/game_system/HatsuneMiku.rb +2 -2
  104. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  105. data/lib/bcdice/game_system/HuntersMoon.rb +17 -110
  106. data/lib/bcdice/game_system/Illusio.rb +25 -34
  107. data/lib/bcdice/game_system/InfiniteBabeL.rb +518 -0
  108. data/lib/bcdice/game_system/JekyllAndHyde.rb +42 -0
  109. data/lib/bcdice/game_system/JuinKansen.rb +251 -0
  110. data/lib/bcdice/game_system/KanColle.rb +17 -166
  111. data/lib/bcdice/game_system/KillDeathBusiness.rb +35 -44
  112. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +2 -1
  113. data/lib/bcdice/game_system/LogHorizon.rb +8 -8
  114. data/lib/bcdice/game_system/LostRoyal.rb +2 -4
  115. data/lib/bcdice/game_system/MagicaLogia.rb +3 -3
  116. data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
  117. data/lib/bcdice/game_system/MeikyuDays.rb +2 -2
  118. data/lib/bcdice/game_system/MeikyuKingdom.rb +3 -3
  119. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +3 -3
  120. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  121. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -2
  122. data/lib/bcdice/game_system/MonotoneMuseum.rb +4 -3
  123. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +1 -1
  124. data/lib/bcdice/game_system/NSSQ.rb +2 -2
  125. data/lib/bcdice/game_system/Nechronica.rb +3 -3
  126. data/lib/bcdice/game_system/NeverCloud.rb +540 -5
  127. data/lib/bcdice/game_system/NightWizard.rb +2 -2
  128. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  129. data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
  130. data/lib/bcdice/game_system/NinjaSlayer.rb +30 -41
  131. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  132. data/lib/bcdice/game_system/OracleEngine.rb +14 -18
  133. data/lib/bcdice/game_system/OrgaRain.rb +17 -25
  134. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  135. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  136. data/lib/bcdice/game_system/Peekaboo.rb +1 -1
  137. data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
  138. data/lib/bcdice/game_system/Postman.rb +1 -1
  139. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  140. data/lib/bcdice/game_system/Raisondetre.rb +1 -1
  141. data/lib/bcdice/game_system/RecordOfLodossWar.rb +8 -7
  142. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  143. data/lib/bcdice/game_system/RokumonSekai2.rb +3 -3
  144. data/lib/bcdice/game_system/RuinBreakers.rb +1 -1
  145. data/lib/bcdice/game_system/RyuTuber.rb +6 -4
  146. data/lib/bcdice/game_system/Ryutama.rb +2 -2
  147. data/lib/bcdice/game_system/SRS.rb +1 -6
  148. data/lib/bcdice/game_system/SamsaraBallad.rb +5 -4
  149. data/lib/bcdice/game_system/Satasupe.rb +90 -865
  150. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  151. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  152. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  153. data/lib/bcdice/game_system/ShinkuuGakuen.rb +3 -3
  154. data/lib/bcdice/game_system/ShinobiGami.rb +75 -39
  155. data/lib/bcdice/game_system/ShoujoTenrankai.rb +1 -1
  156. data/lib/bcdice/game_system/Skynauts.rb +2 -2
  157. data/lib/bcdice/game_system/SteamPunkers.rb +7 -5
  158. data/lib/bcdice/game_system/StellarKnights.rb +1 -3
  159. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  160. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +2 -2
  161. data/lib/bcdice/game_system/StratoShout.rb +10 -36
  162. data/lib/bcdice/game_system/StratoShout_Korean.rb +2 -1
  163. data/lib/bcdice/game_system/SwordWorld.rb +46 -182
  164. data/lib/bcdice/game_system/SwordWorld2_0.rb +21 -149
  165. data/lib/bcdice/game_system/SwordWorld2_5.rb +126 -40
  166. data/lib/bcdice/game_system/TherapieSein.rb +2 -2
  167. data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
  168. data/lib/bcdice/game_system/Torg.rb +2 -2
  169. data/lib/bcdice/game_system/TorgEternity.rb +5 -8
  170. data/lib/bcdice/game_system/TrinitySeven.rb +2 -2
  171. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +7 -7
  172. data/lib/bcdice/game_system/TwilightGunsmoke.rb +2 -2
  173. data/lib/bcdice/game_system/UnsungDuet.rb +1 -1
  174. data/lib/bcdice/game_system/Utakaze.rb +2 -2
  175. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  176. data/lib/bcdice/game_system/Warhammer.rb +7 -7
  177. data/lib/bcdice/game_system/Warhammer4.rb +10 -13
  178. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  179. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  180. data/lib/bcdice/game_system/Yggdrasill.rb +605 -0
  181. data/lib/bcdice/game_system/ZettaiReido.rb +2 -2
  182. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +294 -0
  183. data/lib/bcdice/game_system/cthulhu7th/rollable.rb +41 -0
  184. data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +2 -0
  185. data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +2 -0
  186. data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +2 -0
  187. data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +2 -0
  188. data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +2 -0
  189. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +2 -0
  190. data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +2 -0
  191. data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +2 -0
  192. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +2 -0
  193. data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +2 -0
  194. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +2 -0
  195. data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +2 -0
  196. data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +2 -0
  197. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +2 -0
  198. data/lib/bcdice/game_system/one_way_heroics/tables.rb +2 -0
  199. data/lib/bcdice/game_system/satasupe/tables.rb +723 -0
  200. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +47 -0
  201. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +99 -0
  202. data/lib/bcdice/game_system/sword_world/rating_parser.rb +457 -0
  203. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +104 -0
  204. data/lib/bcdice/loader.rb +11 -4
  205. data/lib/bcdice/normalize.rb +3 -1
  206. data/lib/bcdice/preprocessor.rb +12 -8
  207. data/lib/bcdice/randomizer.rb +14 -0
  208. data/lib/bcdice/repl.rb +3 -1
  209. data/lib/bcdice/result.rb +4 -0
  210. data/lib/bcdice/translate.rb +2 -0
  211. data/lib/bcdice/user_defined_dice_table.rb +28 -15
  212. data/lib/bcdice/version.rb +3 -1
  213. metadata +28 -27
  214. data/.editorconfig +0 -21
  215. data/.github/.codecov.yaml +0 -10
  216. data/.github/workflows/coverage.yaml +0 -21
  217. data/.github/workflows/lint.yaml +0 -13
  218. data/.github/workflows/test.yml +0 -20
  219. data/.gitignore +0 -14
  220. data/.rubocop.yml +0 -108
  221. data/.rubocop_todo.yml +0 -114
  222. data/Gemfile +0 -14
  223. data/ROADMAP.md +0 -30
  224. data/Rakefile +0 -152
  225. data/bcdice.gemspec +0 -29
  226. data/bin/repl.rb +0 -21
  227. data/docs/README.txt +0 -2028
  228. data/docs/dicebot_sort_key.md +0 -72
  229. data/docs/how_to_make_dicebot.md +0 -453
  230. data/lib/bcdice/command_parser.rb +0 -242
  231. data/lib/bcdice/common_command/add_dice/parser.y +0 -153
  232. data/lib/bcdice/common_command/barabara_dice/parser.y +0 -107
  233. data/lib/bcdice/common_command/calc/parser.y +0 -79
  234. data/lib/bcdice/common_command/reroll_dice/parser.y +0 -158
  235. data/lib/bcdice/common_command/upper_dice/parser.y +0 -143
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bcdice/common_command/add_dice"
2
4
  require "bcdice/common_command/barabara_dice"
3
5
  require "bcdice/common_command/calc"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bcdice/normalize"
2
4
  require "bcdice/common_command/add_dice/parser"
3
5
  require "bcdice/common_command/add_dice/randomizer"
@@ -5,7 +7,7 @@ require "bcdice/common_command/add_dice/randomizer"
5
7
  module BCDice
6
8
  module CommonCommand
7
9
  module AddDice
8
- PREFIX_PATTERN = /[\+\-\dD\(\[]+/.freeze
10
+ PREFIX_PATTERN = /[+\-\dD(\[]+/.freeze
9
11
 
10
12
  class << self
11
13
  def eval(command, game_system, randomizer)
@@ -34,9 +34,10 @@ module BCDice
34
34
  end
35
35
 
36
36
  # 文字列に変換する
37
+ # @param game_system [BCDice::Base]
37
38
  # @return [String]
38
- def to_s
39
- @lhs.to_s + cmp_op_text + @rhs&.eval(nil).to_s
39
+ def expr(game_system)
40
+ @lhs.expr(game_system) + cmp_op_text + @rhs&.eval(game_system, nil).to_s
40
41
  end
41
42
 
42
43
  # ノードのS式を返す
@@ -51,7 +52,7 @@ module BCDice
51
52
 
52
53
  def eval(game_system, randomizer)
53
54
  randomizer = Randomizer.new(randomizer, game_system)
54
- total = @lhs.eval(randomizer)
55
+ total = @lhs.eval(game_system, randomizer)
55
56
 
56
57
  interrim_expr =
57
58
  unless randomizer.rand_results.size <= 1 && @lhs.is_a?(Node::DiceRoll)
@@ -60,13 +61,13 @@ module BCDice
60
61
 
61
62
  result =
62
63
  if @cmp_op
63
- rhs = @rhs.eval(nil)
64
+ rhs = @rhs.eval(game_system, nil)
64
65
  game_system.check_result(total, randomizer.rand_results, @cmp_op, rhs)
65
66
  end
66
67
  result ||= Result.new
67
68
 
68
69
  sequence = [
69
- "(#{self})",
70
+ "(#{expr(game_system)})",
70
71
  interrim_expr,
71
72
  total,
72
73
  result&.text
@@ -97,7 +98,7 @@ module BCDice
97
98
  class UndecidedTarget
98
99
  include Singleton
99
100
 
100
- def eval(_randomizer)
101
+ def eval(_game_system, _randomizer)
101
102
  "?"
102
103
  end
103
104
 
@@ -105,12 +106,15 @@ module BCDice
105
106
  false
106
107
  end
107
108
 
108
- def to_s
109
+ def expr(_game_system)
109
110
  "?"
110
111
  end
111
112
 
112
- alias output to_s
113
- alias s_exp to_s
113
+ def output
114
+ "?"
115
+ end
116
+
117
+ alias s_exp output
114
118
  end
115
119
 
116
120
  # 二項演算子のノード
@@ -129,13 +133,14 @@ module BCDice
129
133
  #
130
134
  # 左右のオペランドをそれぞれ再帰的に評価した後で、演算を行う。
131
135
  #
132
- # @param [Randomizer] randomizer ランダマイザ
136
+ # @param game_system [BCDice::Base]
137
+ # @param randomizer [Randomizer] ランダマイザ
133
138
  # @return [Integer] 評価結果
134
- def eval(randomizer)
135
- lhs = @lhs.eval(randomizer)
136
- rhs = @rhs.eval(randomizer)
139
+ def eval(game_system, randomizer)
140
+ lhs = @lhs.eval(game_system, randomizer)
141
+ rhs = @rhs.eval(game_system, randomizer)
137
142
 
138
- return calc(lhs, rhs)
143
+ return calc(lhs, rhs, game_system.round_type)
139
144
  end
140
145
 
141
146
  # @return [Boolean]
@@ -145,8 +150,11 @@ module BCDice
145
150
 
146
151
  # 文字列に変換する
147
152
  # @return [String]
148
- def to_s
149
- "#{@lhs}#{@op}#{@rhs}"
153
+ def expr(game_system)
154
+ lhs = @lhs.expr(game_system)
155
+ rhs = @rhs.expr(game_system)
156
+
157
+ "#{lhs}#{@op}#{rhs}"
150
158
  end
151
159
 
152
160
  # メッセージへの出力を返す
@@ -164,10 +172,11 @@ module BCDice
164
172
  private
165
173
 
166
174
  # 演算を行う
167
- # @param [Integer] lhs 左のオペランド
168
- # @param [Integer] rhs 右のオペランド
175
+ # @param lhs [Integer] lhs 左のオペランド
176
+ # @param rhs [Integer] 右のオペランド
177
+ # @param _round_type [Symbol] ゲームシステムの端数処理設定
169
178
  # @return [Integer] 演算の結果
170
- def calc(lhs, rhs)
179
+ def calc(lhs, rhs, _round_type)
171
180
  lhs.send(@op, rhs)
172
181
  end
173
182
 
@@ -196,8 +205,8 @@ module BCDice
196
205
  # 通常の結果の末尾に、端数処理方法を示す記号を付加する。
197
206
  #
198
207
  # @return [String]
199
- def to_s
200
- "#{super}#{rounding_method}"
208
+ def expr(game_system)
209
+ "#{super(game_system)}#{rounding_method}"
201
210
  end
202
211
 
203
212
  # メッセージへの出力を返す
@@ -224,26 +233,51 @@ module BCDice
224
233
  end
225
234
 
226
235
  # 演算を行う
227
- # @param [Integer] lhs 左のオペランド
228
- # @param [Integer] rhs 右のオペランド
236
+ # @param lhs [Integer] 左のオペランド
237
+ # @param rhs [Integer] 右のオペランド
238
+ # @param round_type [Symbol] ゲームシステムの端数処理設定
229
239
  # @return [Integer] 演算の結果
230
- def calc(lhs, rhs)
240
+ def calc(lhs, rhs, round_type)
231
241
  if rhs.zero?
232
242
  return 1
233
243
  end
234
244
 
235
- return divide_and_round(lhs, rhs)
245
+ return divide_and_round(lhs, rhs, round_type)
236
246
  end
237
247
 
238
248
  # 除算および端数処理を行う
239
- # @param [Integer] _dividend 被除数
240
- # @param [Integer] _divisor 除数(0以外)
249
+ # @param dividend [Integer] 被除数
250
+ # @param divisor [Integer] 除数(0以外)
251
+ # @param round_type [Symbol] ゲームシステムの端数処理設定
241
252
  # @return [Integer]
242
- def divide_and_round(_dividend, _divisor)
253
+ def divide_and_round(dividend, divisor, round_type)
243
254
  raise NotImplementedError
244
255
  end
245
256
  end
246
257
 
258
+ # 除算(端数処理はゲームシステム依存)のノード
259
+ class DivideWithGameSystemDefault < DivideBase
260
+ ROUNDING_METHOD = ""
261
+
262
+ private
263
+
264
+ # 除算および端数処理を行う
265
+ # @param dividend [Integer] 被除数
266
+ # @param divisor [Integer] 除数(0以外)
267
+ # @param round_type [Symbol] ゲームシステムの端数処理設定
268
+ # @return [Integer]
269
+ def divide_and_round(dividend, divisor, round_type)
270
+ case round_type
271
+ when RoundType::CEIL
272
+ (dividend.to_f / divisor).ceil
273
+ when RoundType::ROUND
274
+ (dividend.to_f / divisor).round
275
+ else # RoundType::FLOOR
276
+ dividend / divisor
277
+ end
278
+ end
279
+ end
280
+
247
281
  # 除算(切り上げ)のノード
248
282
  class DivideWithRoundingUp < DivideBase
249
283
  # 端数処理方法を示す記号
@@ -252,10 +286,9 @@ module BCDice
252
286
  private
253
287
 
254
288
  # 除算および端数処理を行う
255
- # @param [Integer] dividend 被除数
256
- # @param [Integer] divisor 除数(0以外)
289
+ # @param (see DivideWithGameSystemDefault#divide_and_round)
257
290
  # @return [Integer]
258
- def divide_and_round(dividend, divisor)
291
+ def divide_and_round(dividend, divisor, _round_type)
259
292
  (dividend.to_f / divisor).ceil
260
293
  end
261
294
  end
@@ -268,10 +301,9 @@ module BCDice
268
301
  private
269
302
 
270
303
  # 除算および端数処理を行う
271
- # @param [Integer] dividend 被除数
272
- # @param [Integer] divisor 除数(0以外)
304
+ # @param (see DivideWithGameSystemDefault#divide_and_round)
273
305
  # @return [Integer]
274
- def divide_and_round(dividend, divisor)
306
+ def divide_and_round(dividend, divisor, _round_type)
275
307
  (dividend.to_f / divisor).round
276
308
  end
277
309
  end
@@ -279,15 +311,14 @@ module BCDice
279
311
  # 除算(切り捨て)のノード
280
312
  class DivideWithRoundingDown < DivideBase
281
313
  # 端数処理方法を示す記号
282
- ROUNDING_METHOD = ""
314
+ ROUNDING_METHOD = "F"
283
315
 
284
316
  private
285
317
 
286
318
  # 除算および端数処理を行う
287
- # @param [Integer] dividend 被除数
288
- # @param [Integer] divisor 除数(0以外)
319
+ # @param (see DivideWithGameSystemDefault#divide_and_round)
289
320
  # @return [Integer]
290
- def divide_and_round(dividend, divisor)
321
+ def divide_and_round(dividend, divisor, _round_type)
291
322
  dividend / divisor
292
323
  end
293
324
  end
@@ -310,8 +341,8 @@ module BCDice
310
341
  #
311
342
  # @param [Randomizer] randomizer ランダマイザ
312
343
  # @return [Integer] 評価結果
313
- def eval(randomizer)
314
- -@body.eval(randomizer)
344
+ def eval(game_system, randomizer)
345
+ -@body.eval(game_system, randomizer)
315
346
  end
316
347
 
317
348
  # @return [Boolean]
@@ -321,8 +352,8 @@ module BCDice
321
352
 
322
353
  # 文字列に変換する
323
354
  # @return [String]
324
- def to_s
325
- "-#{@body}"
355
+ def expr(game_system)
356
+ "-#{@body.expr(game_system)}"
326
357
  end
327
358
 
328
359
  # メッセージへの出力を返す
@@ -344,8 +375,8 @@ module BCDice
344
375
  # @param [Number] times ダイスを振る回数のノード
345
376
  # @param [Number] sides ダイスの面数のノード
346
377
  def initialize(times, sides)
347
- @times = times.eval(nil)
348
- @sides = sides.eval(nil)
378
+ @times = times
379
+ @sides = sides
349
380
 
350
381
  # ダイスを振った結果の出力
351
382
  @text = nil
@@ -358,8 +389,11 @@ module BCDice
358
389
  #
359
390
  # @param [Randomizer] randomizer ランダマイザ
360
391
  # @return [Integer] 評価結果(出目の合計値)
361
- def eval(randomizer)
362
- dice_list = randomizer.roll(@times, @sides)
392
+ def eval(game_system, randomizer)
393
+ times = @times.eval(game_system, nil)
394
+ sides = eval_sides(game_system)
395
+
396
+ dice_list = randomizer.roll(times, sides)
363
397
 
364
398
  total = dice_list.sum()
365
399
  @text = "#{total}[#{dice_list.join(',')}]"
@@ -374,8 +408,11 @@ module BCDice
374
408
 
375
409
  # 文字列に変換する
376
410
  # @return [String]
377
- def to_s
378
- "#{@times}D#{@sides}"
411
+ def expr(game_system)
412
+ times = @times.eval(game_system, nil)
413
+ sides = eval_sides(game_system)
414
+
415
+ "#{times}D#{sides}"
379
416
  end
380
417
 
381
418
  # メッセージへの出力を返す
@@ -387,7 +424,32 @@ module BCDice
387
424
  # ノードのS式を返す
388
425
  # @return [String]
389
426
  def s_exp
390
- "(DiceRoll #{@times} #{@sides})"
427
+ "(DiceRoll #{@times.s_exp} #{@sides.s_exp})"
428
+ end
429
+
430
+ private
431
+
432
+ def eval_sides(game_system)
433
+ @sides.eval(game_system, nil)
434
+ end
435
+ end
436
+
437
+ class ImplicitSidesDiceRoll < DiceRoll
438
+ # @param [Number] times ダイスを振る回数のノード
439
+ def initialize(times)
440
+ @times = times
441
+ @text = nil
442
+ end
443
+
444
+ # @return [String]
445
+ def s_exp
446
+ "(ImplicitSidesDiceRoll #{@times.s_exp})"
447
+ end
448
+
449
+ private
450
+
451
+ def eval_sides(game_system)
452
+ game_system.sides_implicit_d
391
453
  end
392
454
  end
393
455
 
@@ -430,14 +492,14 @@ module BCDice
430
492
  ).freeze
431
493
 
432
494
  # ノードを初期化する
433
- # @param [Number] times ダイスを振る回数のノード
434
- # @param [Number] sides ダイスの面数のノード
435
- # @param [Number] n_filtering ダイスを残す/減らす個数のノード
495
+ # @param [Object] times ダイスを振る回数のノード
496
+ # @param [Object] sides ダイスの面数のノード
497
+ # @param [Object] n_filtering ダイスを残す/減らす個数のノード
436
498
  # @param [Filter] filter フィルタ
437
499
  def initialize(times, sides, n_filtering, filter)
438
- @times = times.literal
439
- @sides = sides.literal
440
- @n_filtering = n_filtering.literal
500
+ @times = times
501
+ @sides = sides
502
+ @n_filtering = n_filtering
441
503
  @filter = filter
442
504
 
443
505
  # ダイスを振った結果の出力
@@ -451,10 +513,14 @@ module BCDice
451
513
  #
452
514
  # @param [Randomizer] randomizer ランダマイザ
453
515
  # @return [Integer] 評価結果(出目の合計値)
454
- def eval(randomizer)
455
- sorted_values = randomizer.roll(@times, @sides).sort
516
+ def eval(game_system, randomizer)
517
+ times = @times.eval(game_system, nil)
518
+ sides = @sides.eval(game_system, nil)
519
+ n_filtering = @n_filtering.eval(game_system, nil)
520
+
521
+ sorted_values = randomizer.roll(times, sides).sort
456
522
  total = @filter
457
- .apply[sorted_values, @n_filtering]
523
+ .apply[sorted_values, n_filtering]
458
524
  .sum()
459
525
 
460
526
  @text = "#{total}[#{sorted_values.join(',')}]"
@@ -469,8 +535,12 @@ module BCDice
469
535
 
470
536
  # 文字列に変換する
471
537
  # @return [String]
472
- def to_s
473
- "#{@times}D#{@sides}#{@filter.abbr}#{@n_filtering}"
538
+ def expr(game_system)
539
+ times = @times.eval(game_system, nil)
540
+ sides = @sides.eval(game_system, nil)
541
+ n_filtering = @n_filtering.eval(game_system, nil)
542
+
543
+ "#{times}D#{sides}#{@filter.abbr}#{n_filtering}"
474
544
  end
475
545
 
476
546
  # メッセージへの出力を返す
@@ -482,7 +552,7 @@ module BCDice
482
552
  # ノードのS式を返す
483
553
  # @return [String]
484
554
  def s_exp
485
- "(DiceRollWithFilter #{@times} #{@sides} #{@filter.abbr.inspect} #{@n_filtering})"
555
+ "(DiceRollWithFilter #{@times.s_exp} #{@sides.s_exp} #{@filter.abbr.inspect} #{@n_filtering.s_exp})"
486
556
  end
487
557
  end
488
558
 
@@ -495,8 +565,8 @@ module BCDice
495
565
 
496
566
  # @param randomizer [Randomizer]
497
567
  # @return [integer]
498
- def eval(randomizer)
499
- @expr.eval(randomizer)
568
+ def eval(game_system, randomizer)
569
+ @expr.eval(game_system, randomizer)
500
570
  end
501
571
 
502
572
  # @return [Boolean]
@@ -505,8 +575,8 @@ module BCDice
505
575
  end
506
576
 
507
577
  # @return [String]
508
- def to_s
509
- "(#{@expr})"
578
+ def expr(game_system)
579
+ "(#{@expr.expr(game_system)})"
510
580
  end
511
581
 
512
582
  # @return [String]
@@ -540,7 +610,7 @@ module BCDice
540
610
 
541
611
  # ノードを評価する
542
612
  # @return [Integer] 格納している値
543
- def eval(_randomizer)
613
+ def eval(_game_system, _randomizer)
544
614
  @literal
545
615
  end
546
616
 
@@ -551,12 +621,15 @@ module BCDice
551
621
 
552
622
  # 文字列に変換する
553
623
  # @return [String]
554
- def to_s
624
+ def expr(_game_system)
625
+ @literal.to_s
626
+ end
627
+
628
+ def output
555
629
  @literal.to_s
556
630
  end
557
631
 
558
- alias output to_s
559
- alias s_exp to_s
632
+ alias s_exp output
560
633
  end
561
634
  end
562
635
  end
@@ -48,47 +48,49 @@ end
48
48
  ##### State transition tables begin ###
49
49
 
50
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 ]
51
+ 13, 16, 17, 18, 19, 3, 32, 13, 4, 13,
52
+ 14, 8, 9, 22, 13, 12, 13, 26, 8, 9,
53
+ 8, 9, 12, 13, 12, 8, 9, 8, 9, 12,
54
+ 13, 12, 13, nil, 8, 9, 13, 13, 12, 13,
55
+ nil, 8, 9, 8, 9, 12, 15, 12, 8, 9,
56
+ nil, 12, 12, nil, 12, nil, 16, 17, 35, 37,
57
+ 34, 36, 16, 17, 18, 19, 18, 19, 40, 39,
58
+ 42, 43, 44, 45 ]
58
59
 
59
60
  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 ]
61
+ 15, 23, 23, 6, 6, 0, 23, 2, 1, 8,
62
+ 4, 15, 15, 11, 9, 15, 12, 15, 2, 2,
63
+ 8, 8, 2, 16, 8, 9, 9, 12, 12, 9,
64
+ 17, 12, 18, nil, 16, 16, 22, 19, 16, 38,
65
+ nil, 17, 17, 18, 18, 17, 5, 18, 19, 19,
66
+ nil, 22, 19, nil, 38, nil, 5, 5, 30, 30,
67
+ 30, 30, 25, 25, 27, 27, 28, 28, 31, 31,
68
+ 39, 39, 40, 40 ]
67
69
 
68
70
  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 ]
71
+ 1, 8, 5, nil, 10, 43, -12, nil, 7, 12,
72
+ nil, 8, 14, nil, nil, -2, 21, 28, 30, 35,
73
+ nil, nil, 34, -12, nil, 49, nil, 49, 51, nil,
74
+ 49, 63, nil, nil, nil, nil, nil, nil, 37, 63,
75
+ 65, nil, nil, nil, nil, nil ]
74
76
 
75
77
  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 ]
78
+ -3, -31, -31, -4, -31, -1, -9, -12, -31, -31,
79
+ -20, -24, -31, -30, 46, -31, -31, -31, -31, -31,
80
+ -18, -19, -22, -31, -2, -5, -6, -7, -8, -10,
81
+ -13, -21, -29, -11, -14, -15, -16, -17, -31, -31,
82
+ -31, -23, -25, -26, -27, -28 ]
81
83
 
82
84
  racc_goto_table = [
83
- 31, 1, 5, 27, 28, 2, 20, 21, 24, 33,
84
- 36, nil, 23, nil, 39, 25, 29, 30 ]
85
+ 31, 5, 20, 21, 27, 28, 1, 2, 24, 33,
86
+ 38, 23, 29, 30, 25, nil, 41 ]
85
87
 
86
88
  racc_goto_check = [
87
- 9, 1, 3, 5, 5, 2, 6, 6, 4, 7,
88
- 10, nil, 3, nil, 9, 3, 6, 6 ]
89
+ 9, 3, 6, 6, 5, 5, 1, 2, 4, 7,
90
+ 10, 3, 6, 6, 3, nil, 9 ]
89
91
 
90
92
  racc_goto_pointer = [
91
- nil, 1, 5, 0, -7, -13, -2, -21, nil, -22,
93
+ nil, 6, 7, -1, -7, -12, -6, -21, nil, -22,
92
94
  -21 ]
93
95
 
94
96
  racc_goto_default = [
@@ -97,38 +99,40 @@ racc_goto_default = [
97
99
 
98
100
  racc_reduce_table = [
99
101
  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,
102
+ 2, 21, :_reduce_1,
103
+ 4, 21, :_reduce_2,
104
+ 0, 22, :_reduce_3,
105
+ 1, 22, :_reduce_4,
117
106
  1, 24, :_reduce_none,
118
- 3, 26, :_reduce_19,
119
- 2, 26, :_reduce_20,
120
- 5, 26, :_reduce_21,
107
+ 1, 24, :_reduce_6,
108
+ 3, 23, :_reduce_7,
109
+ 3, 23, :_reduce_8,
110
+ 1, 23, :_reduce_none,
111
+ 3, 25, :_reduce_10,
112
+ 4, 25, :_reduce_11,
113
+ 1, 25, :_reduce_none,
114
+ 0, 27, :_reduce_13,
115
+ 1, 27, :_reduce_14,
116
+ 1, 27, :_reduce_15,
117
+ 1, 27, :_reduce_16,
118
+ 1, 27, :_reduce_17,
119
+ 2, 26, :_reduce_18,
120
+ 2, 26, :_reduce_19,
121
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 ]
122
+ 3, 28, :_reduce_21,
123
+ 2, 28, :_reduce_22,
124
+ 5, 28, :_reduce_23,
125
+ 1, 28, :_reduce_none,
126
+ 2, 30, :_reduce_25,
127
+ 2, 30, :_reduce_26,
128
+ 2, 30, :_reduce_27,
129
+ 2, 30, :_reduce_28,
130
+ 3, 29, :_reduce_29,
131
+ 1, 29, :_reduce_30 ]
128
132
 
129
- racc_reduce_n = 29
133
+ racc_reduce_n = 31
130
134
 
131
- racc_shift_n = 44
135
+ racc_shift_n = 46
132
136
 
133
137
  racc_token_table = {
134
138
  false => 0,
@@ -142,15 +146,17 @@ racc_token_table = {
142
146
  :L => 8,
143
147
  :U => 9,
144
148
  :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
149
+ :F => 11,
150
+ :C => 12,
151
+ :PLUS => 13,
152
+ :MINUS => 14,
153
+ :ASTERISK => 15,
154
+ :SLASH => 16,
155
+ :PARENL => 17,
156
+ :PARENR => 18,
157
+ :QUESTION => 19 }
158
+
159
+ racc_nt_base = 20
154
160
 
155
161
  racc_use_result_var = true
156
162
 
@@ -182,6 +188,8 @@ Racc_token_to_s_table = [
182
188
  "L",
183
189
  "U",
184
190
  "R",
191
+ "F",
192
+ "C",
185
193
  "PLUS",
186
194
  "MINUS",
187
195
  "ASTERISK",
@@ -280,35 +288,45 @@ end
280
288
  # reduce 12 omitted
281
289
 
282
290
  def _reduce_13(val, _values, result)
283
- result = Node::DivideWithRoundingDown
291
+ result = Node::DivideWithGameSystemDefault
284
292
  result
285
293
  end
286
294
 
287
295
  def _reduce_14(val, _values, result)
288
- result = Node::DivideWithRoundingUp
296
+ result = Node::DivideWithRoundingDown
289
297
  result
290
298
  end
291
299
 
292
300
  def _reduce_15(val, _values, result)
293
- result = Node::DivideWithRoundingOff
301
+ result = Node::DivideWithRoundingUp
294
302
  result
295
303
  end
296
304
 
297
305
  def _reduce_16(val, _values, result)
298
- result = val[1]
306
+ result = Node::DivideWithRoundingUp
299
307
  result
300
308
  end
301
309
 
302
310
  def _reduce_17(val, _values, result)
311
+ result = Node::DivideWithRoundingOff
312
+ result
313
+ end
314
+
315
+ def _reduce_18(val, _values, result)
316
+ result = val[1]
317
+ result
318
+ end
319
+
320
+ def _reduce_19(val, _values, result)
303
321
  body = val[1]
304
322
  result = body.is_a?(Node::Negate) ? body.body : Node::Negate.new(body)
305
323
 
306
324
  result
307
325
  end
308
326
 
309
- # reduce 18 omitted
327
+ # reduce 20 omitted
310
328
 
311
- def _reduce_19(val, _values, result)
329
+ def _reduce_21(val, _values, result)
312
330
  times = val[0]
313
331
  sides = val[2]
314
332
  raise ParseError if times.include_dice? || sides.include_dice?
@@ -318,17 +336,16 @@ def _reduce_19(val, _values, result)
318
336
  result
319
337
  end
320
338
 
321
- def _reduce_20(val, _values, result)
339
+ def _reduce_22(val, _values, result)
322
340
  times = val[0]
323
- sides = Node::Number.new(6)
324
341
  raise ParseError if times.include_dice?
325
342
 
326
- result = Node::DiceRoll.new(times, sides)
343
+ result = Node::ImplicitSidesDiceRoll.new(times)
327
344
 
328
345
  result
329
346
  end
330
347
 
331
- def _reduce_21(val, _values, result)
348
+ def _reduce_23(val, _values, result)
332
349
  times = val[0]
333
350
  sides = val[2]
334
351
  filter = val[3]
@@ -340,34 +357,34 @@ def _reduce_21(val, _values, result)
340
357
  result
341
358
  end
342
359
 
343
- # reduce 22 omitted
360
+ # reduce 24 omitted
344
361
 
345
- def _reduce_23(val, _values, result)
362
+ def _reduce_25(val, _values, result)
346
363
  result = Node::DiceRollWithFilter::KEEP_HIGHEST
347
364
  result
348
365
  end
349
366
 
350
- def _reduce_24(val, _values, result)
367
+ def _reduce_26(val, _values, result)
351
368
  result = Node::DiceRollWithFilter::KEEP_LOWEST
352
369
  result
353
370
  end
354
371
 
355
- def _reduce_25(val, _values, result)
372
+ def _reduce_27(val, _values, result)
356
373
  result = Node::DiceRollWithFilter::DROP_HIGHEST
357
374
  result
358
375
  end
359
376
 
360
- def _reduce_26(val, _values, result)
377
+ def _reduce_28(val, _values, result)
361
378
  result = Node::DiceRollWithFilter::DROP_LOWEST
362
379
  result
363
380
  end
364
381
 
365
- def _reduce_27(val, _values, result)
382
+ def _reduce_29(val, _values, result)
366
383
  result = Node::Parenthesis.new(val[1])
367
384
  result
368
385
  end
369
386
 
370
- def _reduce_28(val, _values, result)
387
+ def _reduce_30(val, _values, result)
371
388
  result = Node::Number.new(val[0])
372
389
  result
373
390
  end