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
@@ -5,7 +5,7 @@ require "bcdice/common_command/add_dice/randomizer"
5
5
  module BCDice
6
6
  module CommonCommand
7
7
  module AddDice
8
- PREFIX_PATTERN = /[\+\-\dD\(\[]+/.freeze
8
+ PREFIX_PATTERN = /[+\-\dD(\[]+/.freeze
9
9
 
10
10
  class << self
11
11
  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