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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +1 -0
- data/i18n/KillDeathBusiness/ja_jp.yml +4 -4
- data/i18n/KillDeathBusiness/ko_kr.yml +5 -4
- data/i18n/MagicaLogia/ko_kr.yml +564 -0
- data/i18n/MonotoneMuseum/ja_jp.yml +37 -1
- data/i18n/StratoShout/ja_jp.yml +4 -4
- data/i18n/StratoShout/ko_kr.yml +4 -4
- data/lib/bcdice.rb +2 -1
- data/lib/bcdice/arithmetic.rb +22 -0
- data/lib/bcdice/arithmetic/node.rb +112 -43
- data/lib/bcdice/arithmetic/parser.rb +240 -0
- data/lib/bcdice/arithmetic_evaluator.rb +5 -156
- data/lib/bcdice/base.rb +8 -1
- data/lib/bcdice/command/lexer.rb +57 -0
- data/lib/bcdice/command/parsed.rb +65 -0
- data/lib/bcdice/command/parser.rb +489 -0
- data/lib/bcdice/common_command/add_dice.rb +1 -1
- data/lib/bcdice/common_command/add_dice/node.rb +142 -69
- data/lib/bcdice/common_command/add_dice/parser.rb +100 -83
- data/lib/bcdice/common_command/barabara_dice/node.rb +7 -1
- data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
- data/lib/bcdice/common_command/calc/node.rb +10 -1
- data/lib/bcdice/common_command/calc/parser.rb +1 -1
- data/lib/bcdice/common_command/d66_dice.rb +3 -1
- data/lib/bcdice/common_command/lexer.rb +2 -1
- data/lib/bcdice/common_command/upper_dice/parser.rb +118 -97
- data/lib/bcdice/common_command/version.rb +1 -1
- data/lib/bcdice/deprecated/checker.rb +6 -6
- data/lib/bcdice/dice_table.rb +1 -0
- data/lib/bcdice/dice_table/d66_parity_table.rb +34 -0
- data/lib/bcdice/game_system.rb +3 -0
- data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
- data/lib/bcdice/game_system/AlchemiaStruggle.rb +312 -0
- data/lib/bcdice/game_system/Alshard.rb +0 -1
- data/lib/bcdice/game_system/Amadeus.rb +1 -1
- data/lib/bcdice/game_system/AnimaAnimus.rb +1 -5
- data/lib/bcdice/game_system/BadLife.rb +1 -1
- data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -10
- data/lib/bcdice/game_system/BeginningIdol.rb +4 -4
- data/lib/bcdice/game_system/BeginningIdol_Korean.rb +4 -4
- data/lib/bcdice/game_system/BladeOfArcana.rb +4 -4
- data/lib/bcdice/game_system/BlindMythos.rb +12 -9
- data/lib/bcdice/game_system/BloodCrusade.rb +12 -38
- data/lib/bcdice/game_system/BloodMoon.rb +2 -2
- data/lib/bcdice/game_system/CardRanker.rb +23 -63
- data/lib/bcdice/game_system/ChaosFlare.rb +3 -3
- data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
- data/lib/bcdice/game_system/ColossalHunter.rb +2 -2
- data/lib/bcdice/game_system/Cthulhu7th.rb +2 -2
- data/lib/bcdice/game_system/CthulhuTech.rb +0 -1
- data/lib/bcdice/game_system/DarkBlaze.rb +4 -4
- data/lib/bcdice/game_system/DeadlineHeroes.rb +1 -1
- data/lib/bcdice/game_system/DoubleCross.rb +60 -93
- data/lib/bcdice/game_system/EmbryoMachine.rb +5 -5
- data/lib/bcdice/game_system/EtrianOdysseySRS.rb +0 -1
- data/lib/bcdice/game_system/FilledWith.rb +3 -3
- data/lib/bcdice/game_system/FullMetalPanic.rb +0 -1
- data/lib/bcdice/game_system/GURPS.rb +1 -1
- data/lib/bcdice/game_system/Garako.rb +3 -2
- data/lib/bcdice/game_system/GardenOrder.rb +1 -1
- data/lib/bcdice/game_system/GehennaAn.rb +3 -3
- data/lib/bcdice/game_system/Gundog.rb +1 -1
- data/lib/bcdice/game_system/GundogRevised.rb +3 -3
- data/lib/bcdice/game_system/GundogZero.rb +2 -2
- data/lib/bcdice/game_system/GurpsFW.rb +2 -5
- data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
- data/lib/bcdice/game_system/HuntersMoon.rb +17 -110
- data/lib/bcdice/game_system/JuinKansen.rb +251 -0
- data/lib/bcdice/game_system/KanColle.rb +17 -166
- data/lib/bcdice/game_system/KillDeathBusiness.rb +35 -44
- data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +2 -1
- data/lib/bcdice/game_system/LogHorizon.rb +8 -8
- data/lib/bcdice/game_system/LostRoyal.rb +1 -3
- data/lib/bcdice/game_system/MagicaLogia.rb +3 -3
- data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
- data/lib/bcdice/game_system/MeikyuDays.rb +1 -1
- data/lib/bcdice/game_system/MeikyuKingdom.rb +1 -1
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +1 -1
- data/lib/bcdice/game_system/MetalHeadExtream.rb +4 -4
- data/lib/bcdice/game_system/MetallicGuardian.rb +0 -1
- data/lib/bcdice/game_system/MonotoneMuseum.rb +3 -2
- data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +1 -1
- data/lib/bcdice/game_system/NSSQ.rb +2 -2
- data/lib/bcdice/game_system/Nechronica.rb +3 -3
- data/lib/bcdice/game_system/NightWizard.rb +1 -1
- data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
- data/lib/bcdice/game_system/NinjaSlayer.rb +26 -28
- data/lib/bcdice/game_system/OracleEngine.rb +13 -17
- data/lib/bcdice/game_system/Paradiso.rb +2 -2
- data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
- data/lib/bcdice/game_system/Raisondetre.rb +1 -1
- data/lib/bcdice/game_system/RecordOfLodossWar.rb +2 -3
- data/lib/bcdice/game_system/RokumonSekai2.rb +2 -2
- data/lib/bcdice/game_system/RuinBreakers.rb +1 -1
- data/lib/bcdice/game_system/Ryutama.rb +1 -1
- data/lib/bcdice/game_system/SRS.rb +0 -5
- data/lib/bcdice/game_system/SamsaraBallad.rb +4 -3
- data/lib/bcdice/game_system/Satasupe.rb +22 -14
- data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
- data/lib/bcdice/game_system/ShinkuuGakuen.rb +1 -1
- data/lib/bcdice/game_system/ShinobiGami.rb +75 -39
- data/lib/bcdice/game_system/StellarKnights.rb +1 -3
- data/lib/bcdice/game_system/SterileLife.rb +1 -1
- data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
- data/lib/bcdice/game_system/StratoShout.rb +10 -36
- data/lib/bcdice/game_system/StratoShout_Korean.rb +2 -1
- data/lib/bcdice/game_system/SwordWorld.rb +5 -5
- data/lib/bcdice/game_system/SwordWorld2_5.rb +1 -1
- data/lib/bcdice/game_system/TherapieSein.rb +2 -2
- data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
- data/lib/bcdice/game_system/Torg.rb +1 -1
- data/lib/bcdice/game_system/TorgEternity.rb +4 -7
- data/lib/bcdice/game_system/TrinitySeven.rb +2 -2
- data/lib/bcdice/game_system/TunnelsAndTrolls.rb +6 -6
- data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -1
- data/lib/bcdice/game_system/Utakaze.rb +1 -1
- data/lib/bcdice/game_system/Warhammer.rb +6 -6
- data/lib/bcdice/game_system/Warhammer4.rb +9 -12
- data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
- data/lib/bcdice/normalize.rb +1 -1
- data/lib/bcdice/preprocessor.rb +12 -8
- data/lib/bcdice/randomizer.rb +12 -0
- data/lib/bcdice/repl.rb +1 -1
- data/lib/bcdice/result.rb +2 -0
- data/lib/bcdice/user_defined_dice_table.rb +26 -15
- data/lib/bcdice/version.rb +1 -1
- metadata +14 -25
- data/.editorconfig +0 -21
- data/.github/.codecov.yaml +0 -10
- data/.github/workflows/coverage.yaml +0 -21
- data/.github/workflows/lint.yaml +0 -13
- data/.github/workflows/test.yml +0 -20
- data/.gitignore +0 -14
- data/.rubocop.yml +0 -108
- data/.rubocop_todo.yml +0 -114
- data/Gemfile +0 -14
- data/ROADMAP.md +0 -30
- data/Rakefile +0 -152
- data/bcdice.gemspec +0 -29
- data/bin/repl.rb +0 -21
- data/docs/README.txt +0 -2028
- data/docs/dicebot_sort_key.md +0 -72
- data/docs/how_to_make_dicebot.md +0 -453
- data/lib/bcdice/command_parser.rb +0 -242
- data/lib/bcdice/common_command/add_dice/parser.y +0 -153
- data/lib/bcdice/common_command/barabara_dice/parser.y +0 -107
- data/lib/bcdice/common_command/calc/parser.y +0 -79
- data/lib/bcdice/common_command/reroll_dice/parser.y +0 -158
- data/lib/bcdice/common_command/upper_dice/parser.y +0 -143
|
@@ -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
|
|
39
|
-
@lhs.
|
|
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
|
-
"(#{
|
|
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
|
|
109
|
+
def expr(_game_system)
|
|
109
110
|
"?"
|
|
110
111
|
end
|
|
111
112
|
|
|
112
|
-
|
|
113
|
-
|
|
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 [
|
|
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
|
|
149
|
-
|
|
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]
|
|
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
|
|
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]
|
|
228
|
-
# @param [Integer]
|
|
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]
|
|
240
|
-
# @param [Integer]
|
|
249
|
+
# @param dividend [Integer] 被除数
|
|
250
|
+
# @param divisor [Integer] 除数(0以外)
|
|
251
|
+
# @param round_type [Symbol] ゲームシステムの端数処理設定
|
|
241
252
|
# @return [Integer]
|
|
242
|
-
def divide_and_round(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
348
|
-
@sides = sides
|
|
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
|
-
|
|
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
|
|
378
|
-
|
|
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 [
|
|
434
|
-
# @param [
|
|
435
|
-
# @param [
|
|
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
|
|
439
|
-
@sides = sides
|
|
440
|
-
@n_filtering = n_filtering
|
|
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
|
-
|
|
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,
|
|
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
|
|
473
|
-
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
8, 9, 8, 9, 12, 15, 12, 8, 9,
|
|
56
|
-
12, 12, nil,
|
|
57
|
-
|
|
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,
|
|
61
|
-
15,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
17, 17, 18, 18, 17, 5, 18, 19, 19,
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
70
|
-
nil,
|
|
71
|
-
nil, nil,
|
|
72
|
-
|
|
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, -
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-13, -
|
|
80
|
-
-
|
|
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,
|
|
84
|
-
|
|
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,
|
|
88
|
-
10,
|
|
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,
|
|
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,
|
|
101
|
-
4,
|
|
102
|
-
0,
|
|
103
|
-
1,
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
123
|
-
2, 28, :
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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 =
|
|
133
|
+
racc_reduce_n = 31
|
|
130
134
|
|
|
131
|
-
racc_shift_n =
|
|
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
|
-
:
|
|
146
|
-
:
|
|
147
|
-
:
|
|
148
|
-
:
|
|
149
|
-
:
|
|
150
|
-
:
|
|
151
|
-
:
|
|
152
|
-
|
|
153
|
-
|
|
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::
|
|
291
|
+
result = Node::DivideWithGameSystemDefault
|
|
284
292
|
result
|
|
285
293
|
end
|
|
286
294
|
|
|
287
295
|
def _reduce_14(val, _values, result)
|
|
288
|
-
result = Node::
|
|
296
|
+
result = Node::DivideWithRoundingDown
|
|
289
297
|
result
|
|
290
298
|
end
|
|
291
299
|
|
|
292
300
|
def _reduce_15(val, _values, result)
|
|
293
|
-
result = Node::
|
|
301
|
+
result = Node::DivideWithRoundingUp
|
|
294
302
|
result
|
|
295
303
|
end
|
|
296
304
|
|
|
297
305
|
def _reduce_16(val, _values, result)
|
|
298
|
-
result =
|
|
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
|
|
327
|
+
# reduce 20 omitted
|
|
310
328
|
|
|
311
|
-
def
|
|
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
|
|
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::
|
|
343
|
+
result = Node::ImplicitSidesDiceRoll.new(times)
|
|
327
344
|
|
|
328
345
|
result
|
|
329
346
|
end
|
|
330
347
|
|
|
331
|
-
def
|
|
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
|
|
360
|
+
# reduce 24 omitted
|
|
344
361
|
|
|
345
|
-
def
|
|
362
|
+
def _reduce_25(val, _values, result)
|
|
346
363
|
result = Node::DiceRollWithFilter::KEEP_HIGHEST
|
|
347
364
|
result
|
|
348
365
|
end
|
|
349
366
|
|
|
350
|
-
def
|
|
367
|
+
def _reduce_26(val, _values, result)
|
|
351
368
|
result = Node::DiceRollWithFilter::KEEP_LOWEST
|
|
352
369
|
result
|
|
353
370
|
end
|
|
354
371
|
|
|
355
|
-
def
|
|
372
|
+
def _reduce_27(val, _values, result)
|
|
356
373
|
result = Node::DiceRollWithFilter::DROP_HIGHEST
|
|
357
374
|
result
|
|
358
375
|
end
|
|
359
376
|
|
|
360
|
-
def
|
|
377
|
+
def _reduce_28(val, _values, result)
|
|
361
378
|
result = Node::DiceRollWithFilter::DROP_LOWEST
|
|
362
379
|
result
|
|
363
380
|
end
|
|
364
381
|
|
|
365
|
-
def
|
|
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
|
|
387
|
+
def _reduce_30(val, _values, result)
|
|
371
388
|
result = Node::Number.new(val[0])
|
|
372
389
|
result
|
|
373
390
|
end
|