bcdice 3.1.3 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +186 -76
  3. data/README.md +3 -2
  4. data/i18n/BeginningIdol/ja_jp.yml +2806 -0
  5. data/i18n/BeginningIdol/ko_kr.yml +1400 -0
  6. data/i18n/Cthulhu/zh_hans.yml +11 -0
  7. data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
  8. data/i18n/MagicaLogia/ja_jp.yml +1 -1
  9. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  10. data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
  11. data/i18n/StellarKnights/ja_jp.yml +498 -0
  12. data/i18n/StellarKnights/ko_kr.yml +498 -0
  13. data/i18n/zh_hans.yml +7 -0
  14. data/lib/bcdice/command/parsed.rb +11 -3
  15. data/lib/bcdice/command/parser.rb +179 -100
  16. data/lib/bcdice/common_command/add_dice.rb +1 -1
  17. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  18. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  19. data/lib/bcdice/common_command/calc.rb +1 -1
  20. data/lib/bcdice/common_command/choice.rb +82 -7
  21. data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
  22. data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
  23. data/lib/bcdice/common_command/tally_dice.rb +19 -0
  24. data/lib/bcdice/common_command.rb +2 -0
  25. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  26. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  27. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  28. data/lib/bcdice/dice_table/d66_table.rb +5 -1
  29. data/lib/bcdice/dice_table.rb +3 -0
  30. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  31. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  32. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  33. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  34. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  35. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  36. data/lib/bcdice/game_system/AngelGear.rb +10 -5
  37. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  38. data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
  39. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  40. data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
  41. data/lib/bcdice/game_system/Avandner.rb +1 -1
  42. data/lib/bcdice/game_system/BadLife.rb +264 -289
  43. data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
  44. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  45. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  46. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  47. data/lib/bcdice/game_system/BeginningIdol.rb +118 -2392
  48. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
  49. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  50. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  51. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  52. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  53. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  54. data/lib/bcdice/game_system/CastleInGray.rb +133 -0
  55. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  56. data/lib/bcdice/game_system/Chill.rb +10 -10
  57. data/lib/bcdice/game_system/Chill3.rb +9 -9
  58. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  59. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  60. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  61. data/lib/bcdice/game_system/Cthulhu.rb +3 -3
  62. data/lib/bcdice/game_system/Cthulhu7th.rb +56 -18
  63. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  64. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  65. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  66. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  67. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  68. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  69. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  70. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  71. data/lib/bcdice/game_system/DoubleCross.rb +8 -1
  72. data/lib/bcdice/game_system/Dracurouge.rb +3 -2
  73. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  74. data/lib/bcdice/game_system/Elric.rb +18 -14
  75. data/lib/bcdice/game_system/Elysion.rb +1 -1
  76. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  77. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  78. data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
  79. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  80. data/lib/bcdice/game_system/FilledWith.rb +4 -0
  81. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  82. data/lib/bcdice/game_system/GURPS.rb +17 -28
  83. data/lib/bcdice/game_system/Garako.rb +1 -1
  84. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  85. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  86. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  87. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  88. data/lib/bcdice/game_system/GranCrest.rb +189 -417
  89. data/lib/bcdice/game_system/Gundog.rb +9 -8
  90. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  91. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  92. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  93. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  94. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  95. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  96. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  97. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  98. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  99. data/lib/bcdice/game_system/Insane.rb +13 -20
  100. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  101. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  102. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  103. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  104. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  105. data/lib/bcdice/game_system/KanColle.rb +4 -9
  106. data/lib/bcdice/game_system/Karukami.rb +84 -0
  107. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  108. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  109. data/lib/bcdice/game_system/KurayamiCrying.rb +142 -3
  110. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  111. data/lib/bcdice/game_system/LogHorizon.rb +10 -7
  112. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  113. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  114. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  115. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -3
  116. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  117. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  118. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  119. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  120. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  121. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  122. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  123. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  124. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  125. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  126. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  127. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  128. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  129. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  130. data/lib/bcdice/game_system/Postman.rb +1 -1
  131. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  132. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  133. data/lib/bcdice/game_system/Revulture.rb +123 -0
  134. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  135. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  136. data/lib/bcdice/game_system/SRS.rb +17 -16
  137. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  138. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  139. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  140. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  141. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  142. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  143. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  144. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  145. data/lib/bcdice/game_system/SteamPunkers.rb +25 -7
  146. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  147. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  148. data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
  149. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  150. data/lib/bcdice/game_system/Strave.rb +1 -1
  151. data/lib/bcdice/game_system/SwordWorld.rb +22 -9
  152. data/lib/bcdice/game_system/SwordWorld2_0.rb +22 -7
  153. data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -2
  154. data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
  155. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  156. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  157. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  158. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  159. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  160. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  161. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  162. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  163. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  164. data/lib/bcdice/game_system/WARPS.rb +11 -9
  165. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  166. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  167. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  168. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  169. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  170. data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
  171. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  172. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  173. data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
  174. data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
  175. data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
  176. data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
  177. data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
  178. data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
  179. data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
  180. data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
  181. data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
  182. data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
  183. data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
  184. data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
  185. data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
  186. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  187. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
  188. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +50 -7
  189. data/lib/bcdice/game_system/sword_world/rating_parser.rb +148 -107
  190. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  191. data/lib/bcdice/game_system.rb +18 -1
  192. data/lib/bcdice/repl.rb +1 -1
  193. data/lib/bcdice/result.rb +26 -0
  194. data/lib/bcdice/version.rb +1 -1
  195. metadata +48 -6
@@ -37,10 +37,16 @@ module BCDice
37
37
  class Parser < Racc::Parser
38
38
 
39
39
 
40
+ # @param notations [Array<String, Regexp>] 反応するコマンドの表記
41
+ # @param round_type [Symbol] 除算での端数の扱い
40
42
  def initialize(*notations, round_type:)
41
43
  super()
42
44
  @notations = notations
43
45
  @round_type = round_type
46
+ @prefix_number = false
47
+ @suffix_number = false
48
+ @need_prefix_number = false
49
+ @need_suffix_number = false
44
50
  @modifier = true
45
51
  @critical = false
46
52
  @fumble = false
@@ -56,6 +62,36 @@ def disable_modifier
56
62
  self
57
63
  end
58
64
 
65
+ # リテラルの前に数値を許可する
66
+ # @return [BCDice::Command::Parser]
67
+ def enable_prefix_number
68
+ @prefix_number = true
69
+ self
70
+ end
71
+
72
+ # リテラルの後ろに数値を許可する
73
+ # @return [BCDice::Command::Parser]
74
+ def enable_suffix_number
75
+ @suffix_number = true
76
+ self
77
+ end
78
+
79
+ # リテラルの前に数値が必要であると設定する
80
+ # @return [BCDice::Command::Parser]
81
+ def has_prefix_number
82
+ @prefix_number = true
83
+ @need_prefix_number = true
84
+ self
85
+ end
86
+
87
+ # リテラルの後ろに数値が必要であると設定する
88
+ # @return [BCDice::Command::Parser]
89
+ def has_suffix_number
90
+ @suffix_number = true
91
+ @need_suffix_number = true
92
+ self
93
+ end
94
+
59
95
  # +@+によるクリティカル値の指定を許可する
60
96
  # @return [BCDice::Command::Parser]
61
97
  def enable_critical
@@ -106,7 +142,9 @@ private
106
142
 
107
143
  def parsed(notation, option, modifier, target)
108
144
  Parsed.new.tap do |p|
109
- p.command = notation
145
+ p.command = notation[:command]
146
+ p.prefix_number = notation[:prefix]&.eval(@round_type)
147
+ p.suffix_number = notation[:suffix]&.eval(@round_type)
110
148
  p.critical = option[:critical]&.eval(@round_type)
111
149
  p.fumble = option[:fumble]&.eval(@round_type)
112
150
  p.dollar = option[:dollar]&.eval(@round_type)
@@ -128,101 +166,111 @@ end
128
166
  ##### State transition tables begin ###
129
167
 
130
168
  racc_action_table = [
131
- 24, 6, 7, 16, 17, 20, 21, 16, 17, 23,
132
- 6, 7, 14, 36, 37, 31, 11, 12, 13, 14,
133
- 24, 2, 24, 36, 37, 20, 21, 20, 21, 23,
134
- 24, 23, 24, 41, 42, 20, 21, 20, 21, 23,
135
- 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
136
- 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
137
- 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
138
- 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
139
- 24, 23, 24, 36, 37, 20, 21, 20, 21, 23,
140
- 3, 23, 41, 42, 8, nil, nil, 45, 11, 12,
141
- 13, 14, 51, 49, 50, 52 ]
169
+ 6, 6, 6, 6, 7, 28, 29, 17, 18, 5,
170
+ 5, 5, 5, 6, 26, 12, 4, 45, 17, 18,
171
+ 10, 11, 5, 10, 11, 6, 23, 24, 25, 26,
172
+ 17, 18, 6, 20, 5, 33, 34, 17, 18, 6,
173
+ 35, 5, 28, 29, 17, 18, 6, nil, 5, 36,
174
+ 37, 17, 18, 6, nil, 5, 36, 37, 17, 18,
175
+ 6, nil, 5, 36, 37, 17, 18, 6, nil, 5,
176
+ 33, 34, 17, 18, 6, nil, 5, 36, 37, 17,
177
+ 18, 6, nil, 5, 36, 37, 17, 18, 6, nil,
178
+ 5, 36, 37, 17, 18, 6, nil, 5, 36, 37,
179
+ 17, 18, 6, nil, 5, nil, nil, 17, 18, 6,
180
+ nil, 5, nil, nil, 17, 18, nil, nil, 5, 23,
181
+ 24, 25, 26, 56, 54, 55, 57 ]
142
182
 
143
183
  racc_action_check = [
144
- 14, 2, 2, 9, 9, 14, 14, 5, 5, 14,
145
- 4, 4, 9, 18, 18, 14, 4, 4, 4, 4,
146
- 6, 0, 7, 25, 25, 6, 6, 7, 7, 6,
147
- 11, 7, 12, 30, 30, 11, 11, 12, 12, 11,
148
- 13, 12, 16, 32, 32, 13, 13, 16, 16, 13,
149
- 17, 16, 20, 34, 34, 17, 17, 20, 20, 17,
150
- 21, 20, 23, 35, 35, 21, 21, 23, 23, 21,
151
- 36, 23, 37, 46, 46, 36, 36, 37, 37, 36,
152
- 41, 37, 42, 47, 47, 41, 41, 42, 42, 41,
153
- 1, 42, 40, 40, 3, nil, nil, 40, 15, 15,
154
- 15, 15, 44, 44, 44, 44 ]
184
+ 0, 4, 26, 12, 1, 21, 21, 26, 26, 0,
185
+ 4, 26, 12, 5, 21, 3, 0, 26, 5, 5,
186
+ 8, 8, 5, 2, 2, 10, 8, 8, 8, 8,
187
+ 10, 10, 11, 7, 10, 14, 14, 11, 11, 17,
188
+ 14, 11, 9, 9, 17, 17, 18, nil, 17, 15,
189
+ 15, 18, 18, 23, nil, 18, 30, 30, 23, 23,
190
+ 24, nil, 23, 31, 31, 24, 24, 25, nil, 24,
191
+ 44, 44, 25, 25, 28, nil, 25, 47, 47, 28,
192
+ 28, 29, nil, 28, 48, 48, 29, 29, 33, nil,
193
+ 29, 49, 49, 33, 33, 34, nil, 33, 50, 50,
194
+ 34, 34, 36, nil, 34, nil, nil, 36, 36, 37,
195
+ nil, 36, nil, nil, 37, 37, nil, nil, 37, 27,
196
+ 27, 27, 27, 52, 52, 52, 52 ]
155
197
 
156
198
  racc_action_pointer = [
157
- 3, 90, -6, 94, 3, 0, 18, 20, nil, -4,
158
- nil, 28, 30, 38, -2, 85, 40, 48, 4, nil,
159
- 50, 58, nil, 60, nil, 14, nil, nil, nil, nil,
160
- 26, nil, 34, nil, 44, 54, 68, 70, nil, nil,
161
- 85, 78, 80, nil, 99, nil, 64, 74, nil, nil,
162
- nil, nil, nil ]
199
+ -2, 4, 16, -3, -1, 11, nil, 33, 13, 35,
200
+ 23, 30, 1, nil, 28, 40, nil, 37, 44, nil,
201
+ nil, -2, nil, 51, 58, 65, 0, 106, 72, 79,
202
+ 47, 54, nil, 86, 93, nil, 100, 107, nil, nil,
203
+ nil, nil, nil, nil, 63, nil, nil, 68, 75, 82,
204
+ 89, nil, 120, nil, nil, nil, nil, nil ]
163
205
 
164
206
  racc_action_default = [
165
- -31, -31, -4, -31, -12, -4, -31, -31, 53, -12,
166
- -3, -31, -31, -31, -31, -12, -31, -31, -8, -20,
167
- -31, -31, -28, -31, -30, -9, -1, -5, -6, -7,
168
- -13, -14, -17, -2, -10, -11, -31, -31, -26, -27,
169
- -31, -31, -31, -18, -21, -29, -15, -16, -19, -22,
170
- -23, -24, -25 ]
207
+ -35, -35, -8, -35, -7, -35, -34, -35, -16, -8,
208
+ -35, -35, -5, -6, -35, -21, -24, -35, -35, -32,
209
+ 58, -16, -3, -35, -35, -35, -35, -16, -35, -35,
210
+ -12, -13, -4, -35, -35, -33, -35, -35, -30, -31,
211
+ -1, -9, -10, -11, -17, -18, -2, -14, -15, -19,
212
+ -20, -22, -25, -23, -26, -27, -28, -29 ]
171
213
 
172
214
  racc_goto_table = [
173
- 18, 25, 1, 27, 28, 29, 30, 48, nil, 10,
174
- 34, 35, 38, 39, 26, 40, 4, nil, nil, 15,
175
- 33, 5, nil, 9, nil, nil, nil, nil, 43, 44,
176
- nil, nil, nil, nil, nil, 46, 47 ]
215
+ 30, 31, 38, 39, 14, 8, 1, 22, 41, 42,
216
+ 43, 9, 27, 2, 53, nil, nil, 21, 47, 48,
217
+ 40, 51, 52, 49, 50, 44, 46, 3, nil, nil,
218
+ nil, 13, nil, nil, nil, nil, nil, nil, nil, 32 ]
177
219
 
178
220
  racc_goto_check = [
179
- 6, 6, 1, 5, 5, 5, 7, 8, nil, 4,
180
- 6, 6, 5, 5, 4, 7, 2, nil, nil, 2,
181
- 4, 3, nil, 3, nil, nil, nil, nil, 5, 5,
182
- nil, nil, nil, nil, nil, 6, 6 ]
221
+ 8, 8, 7, 7, 9, 3, 1, 5, 7, 7,
222
+ 7, 4, 3, 2, 10, nil, nil, 4, 8, 8,
223
+ 5, 7, 7, 8, 8, 9, 5, 6, nil, nil,
224
+ nil, 6, nil, nil, nil, nil, nil, nil, nil, 6 ]
183
225
 
184
226
  racc_goto_pointer = [
185
- nil, 2, 14, 19, 5, -8, -6, -8, -37, nil ]
227
+ nil, 6, 13, 3, 9, -1, 27, -15, -10, -1,
228
+ -38 ]
186
229
 
187
230
  racc_goto_default = [
188
- nil, nil, nil, nil, nil, 19, 32, nil, nil, 22 ]
231
+ nil, nil, nil, nil, nil, nil, 19, 16, 15, nil,
232
+ nil ]
189
233
 
190
234
  racc_reduce_table = [
191
235
  0, 0, :racc_error,
192
236
  4, 20, :_reduce_1,
193
237
  4, 20, :_reduce_2,
194
238
  3, 20, :_reduce_3,
195
- 0, 21, :_reduce_4,
196
- 3, 21, :_reduce_5,
197
- 3, 21, :_reduce_6,
198
- 3, 21, :_reduce_7,
199
- 2, 22, :_reduce_8,
200
- 2, 22, :_reduce_9,
239
+ 3, 21, :_reduce_4,
240
+ 2, 21, :_reduce_5,
241
+ 2, 21, :_reduce_6,
242
+ 1, 21, :_reduce_7,
243
+ 0, 22, :_reduce_8,
244
+ 3, 22, :_reduce_9,
201
245
  3, 22, :_reduce_10,
202
246
  3, 22, :_reduce_11,
203
- 0, 23, :_reduce_12,
247
+ 2, 23, :_reduce_12,
204
248
  2, 23, :_reduce_13,
205
- 2, 23, :_reduce_14,
206
- 3, 26, :_reduce_15,
207
- 3, 26, :_reduce_16,
249
+ 3, 23, :_reduce_14,
250
+ 3, 23, :_reduce_15,
251
+ 0, 24, :_reduce_16,
252
+ 2, 24, :_reduce_17,
253
+ 2, 24, :_reduce_18,
254
+ 3, 28, :_reduce_19,
255
+ 3, 28, :_reduce_20,
256
+ 1, 28, :_reduce_none,
257
+ 3, 27, :_reduce_22,
258
+ 4, 27, :_reduce_23,
259
+ 1, 27, :_reduce_none,
260
+ 0, 29, :_reduce_25,
261
+ 1, 29, :_reduce_26,
262
+ 1, 29, :_reduce_27,
263
+ 1, 29, :_reduce_28,
264
+ 1, 29, :_reduce_29,
265
+ 2, 26, :_reduce_30,
266
+ 2, 26, :_reduce_31,
208
267
  1, 26, :_reduce_none,
209
- 3, 25, :_reduce_18,
210
- 4, 25, :_reduce_19,
211
- 1, 25, :_reduce_none,
212
- 0, 27, :_reduce_21,
213
- 1, 27, :_reduce_22,
214
- 1, 27, :_reduce_23,
215
- 1, 27, :_reduce_24,
216
- 1, 27, :_reduce_25,
217
- 2, 24, :_reduce_26,
218
- 2, 24, :_reduce_27,
219
- 1, 24, :_reduce_none,
220
- 3, 28, :_reduce_29,
221
- 1, 28, :_reduce_30 ]
222
-
223
- racc_reduce_n = 31
224
-
225
- racc_shift_n = 53
268
+ 3, 25, :_reduce_33,
269
+ 1, 25, :_reduce_34 ]
270
+
271
+ racc_reduce_n = 35
272
+
273
+ racc_shift_n = 58
226
274
 
227
275
  racc_token_table = {
228
276
  false => 0,
@@ -287,14 +335,15 @@ Racc_token_to_s_table = [
287
335
  "NOTATION",
288
336
  "$start",
289
337
  "expr",
338
+ "notation",
290
339
  "option",
291
340
  "modifier",
292
341
  "target",
342
+ "term",
293
343
  "unary",
294
344
  "mul",
295
345
  "add",
296
- "round_type",
297
- "term" ]
346
+ "round_type" ]
298
347
 
299
348
  Racc_debug_parser = false
300
349
 
@@ -326,12 +375,42 @@ def _reduce_3(val, _values, result)
326
375
  end
327
376
 
328
377
  def _reduce_4(val, _values, result)
329
- result = {}
378
+ raise ParseError unless @prefix_number && @suffix_number
379
+ result = { command: val[1], prefix: val[0], suffix: val[2] }
330
380
 
331
381
  result
332
382
  end
333
383
 
334
384
  def _reduce_5(val, _values, result)
385
+ raise ParseError unless @prefix_number
386
+ raise ParseError if @need_suffix_number
387
+ result = { command: val[1], prefix: val[0] }
388
+
389
+ result
390
+ end
391
+
392
+ def _reduce_6(val, _values, result)
393
+ raise ParseError unless @suffix_number
394
+ raise ParseError if @need_prefix_number
395
+ result = { command: val[0], suffix: val[1] }
396
+
397
+ result
398
+ end
399
+
400
+ def _reduce_7(val, _values, result)
401
+ raise ParseError if @need_prefix_number || @need_suffix_number
402
+ result = { command: val[0] }
403
+
404
+ result
405
+ end
406
+
407
+ def _reduce_8(val, _values, result)
408
+ result = {}
409
+
410
+ result
411
+ end
412
+
413
+ def _reduce_9(val, _values, result)
335
414
  option, _, term = val
336
415
  raise ParseError unless @critical && option[:critical].nil?
337
416
 
@@ -341,7 +420,7 @@ def _reduce_5(val, _values, result)
341
420
  result
342
421
  end
343
422
 
344
- def _reduce_6(val, _values, result)
423
+ def _reduce_10(val, _values, result)
345
424
  option, _, term = val
346
425
  raise ParseError unless @fumble && option[:fumble].nil?
347
426
 
@@ -351,7 +430,7 @@ def _reduce_6(val, _values, result)
351
430
  result
352
431
  end
353
432
 
354
- def _reduce_7(val, _values, result)
433
+ def _reduce_11(val, _values, result)
355
434
  option, _, term = val
356
435
  raise ParseError unless @dollar && option[:dollar].nil?
357
436
 
@@ -361,34 +440,34 @@ def _reduce_7(val, _values, result)
361
440
  result
362
441
  end
363
442
 
364
- def _reduce_8(val, _values, result)
443
+ def _reduce_12(val, _values, result)
365
444
  result = val[1]
366
445
  result
367
446
  end
368
447
 
369
- def _reduce_9(val, _values, result)
448
+ def _reduce_13(val, _values, result)
370
449
  result = Arithmetic::Node::Negative.new(val[1])
371
450
  result
372
451
  end
373
452
 
374
- def _reduce_10(val, _values, result)
453
+ def _reduce_14(val, _values, result)
375
454
  result = Arithmetic::Node::BinaryOp.new(val[0], :+, val[2])
376
455
  result
377
456
  end
378
457
 
379
- def _reduce_11(val, _values, result)
458
+ def _reduce_15(val, _values, result)
380
459
  result = Arithmetic::Node::BinaryOp.new(val[0], :-, val[2])
381
460
  result
382
461
  end
383
462
 
384
- def _reduce_12(val, _values, result)
463
+ def _reduce_16(val, _values, result)
385
464
  raise ParseError unless @allowed_cmp_op.include?(nil)
386
465
  result = {}
387
466
 
388
467
  result
389
468
  end
390
469
 
391
- def _reduce_13(val, _values, result)
470
+ def _reduce_17(val, _values, result)
392
471
  cmp_op, target = val
393
472
  raise ParseError unless @allowed_cmp_op.include?(cmp_op)
394
473
 
@@ -397,7 +476,7 @@ def _reduce_13(val, _values, result)
397
476
  result
398
477
  end
399
478
 
400
- def _reduce_14(val, _values, result)
479
+ def _reduce_18(val, _values, result)
401
480
  cmp_op = val[0]
402
481
  raise ParseError unless @question_target
403
482
  raise ParseError unless @allowed_cmp_op.include?(cmp_op)
@@ -407,75 +486,75 @@ def _reduce_14(val, _values, result)
407
486
  result
408
487
  end
409
488
 
410
- def _reduce_15(val, _values, result)
489
+ def _reduce_19(val, _values, result)
411
490
  result = Arithmetic::Node::BinaryOp.new(val[0], :+, val[2])
412
491
  result
413
492
  end
414
493
 
415
- def _reduce_16(val, _values, result)
494
+ def _reduce_20(val, _values, result)
416
495
  result = Arithmetic::Node::BinaryOp.new(val[0], :-, val[2])
417
496
  result
418
497
  end
419
498
 
420
- # reduce 17 omitted
499
+ # reduce 21 omitted
421
500
 
422
- def _reduce_18(val, _values, result)
501
+ def _reduce_22(val, _values, result)
423
502
  result = Arithmetic::Node::BinaryOp.new(val[0], :*, val[2])
424
503
  result
425
504
  end
426
505
 
427
- def _reduce_19(val, _values, result)
506
+ def _reduce_23(val, _values, result)
428
507
  divied_class = val[3]
429
508
  result = divied_class.new(val[0], val[2])
430
509
 
431
510
  result
432
511
  end
433
512
 
434
- # reduce 20 omitted
513
+ # reduce 24 omitted
435
514
 
436
- def _reduce_21(val, _values, result)
515
+ def _reduce_25(val, _values, result)
437
516
  result = Arithmetic::Node::DivideWithGameSystemDefault
438
517
  result
439
518
  end
440
519
 
441
- def _reduce_22(val, _values, result)
520
+ def _reduce_26(val, _values, result)
442
521
  result = Arithmetic::Node::DivideWithCeil
443
522
  result
444
523
  end
445
524
 
446
- def _reduce_23(val, _values, result)
525
+ def _reduce_27(val, _values, result)
447
526
  result = Arithmetic::Node::DivideWithCeil
448
527
  result
449
528
  end
450
529
 
451
- def _reduce_24(val, _values, result)
530
+ def _reduce_28(val, _values, result)
452
531
  result = Arithmetic::Node::DivideWithRound
453
532
  result
454
533
  end
455
534
 
456
- def _reduce_25(val, _values, result)
535
+ def _reduce_29(val, _values, result)
457
536
  result = Arithmetic::Node::DivideWithFloor
458
537
  result
459
538
  end
460
539
 
461
- def _reduce_26(val, _values, result)
540
+ def _reduce_30(val, _values, result)
462
541
  result = val[1]
463
542
  result
464
543
  end
465
544
 
466
- def _reduce_27(val, _values, result)
545
+ def _reduce_31(val, _values, result)
467
546
  result = Arithmetic::Node::Negative.new(val[1])
468
547
  result
469
548
  end
470
549
 
471
- # reduce 28 omitted
550
+ # reduce 32 omitted
472
551
 
473
- def _reduce_29(val, _values, result)
552
+ def _reduce_33(val, _values, result)
474
553
  result = val[1]
475
554
  result
476
555
  end
477
556
 
478
- def _reduce_30(val, _values, result)
557
+ def _reduce_34(val, _values, result)
479
558
  result = Arithmetic::Node::Number.new(val[0])
480
559
  result
481
560
  end
@@ -7,7 +7,7 @@ require "bcdice/common_command/add_dice/randomizer"
7
7
  module BCDice
8
8
  module CommonCommand
9
9
  module AddDice
10
- PREFIX_PATTERN = /[+\-\dD(]+/.freeze
10
+ PREFIX_PATTERN = /[+\-(]*\d+/.freeze
11
11
 
12
12
  class << self
13
13
  def eval(command, game_system, randomizer)
@@ -43,8 +43,8 @@ module BCDice
43
43
  Result.new.tap do |r|
44
44
  r.secret = @secret
45
45
  r.text = sequence.join(" > ")
46
- r.rands = randomizer.rand_results
47
- r.detailed_rands = randomizer.detailed_rand_results
46
+ r.last_dice_list_list = dice_list_list
47
+ r.last_dice_list = dice_list
48
48
  r.success_num = success_num
49
49
  end
50
50
  end
@@ -7,6 +7,10 @@ module BCDice
7
7
  module BarabaraDice
8
8
  # バラバラロールの結果を表すクラス
9
9
  class Result < ::BCDice::Result
10
+ # @return [Array<Array<Integer>>] 出目のグループの配列
11
+ attr_accessor :last_dice_list_list
12
+ # @return [Array<Integer>] すべての出目が格納される配列
13
+ attr_accessor :last_dice_list
10
14
  # @return [Integer] 成功数
11
15
  attr_accessor :success_num
12
16
 
@@ -14,6 +18,8 @@ module BCDice
14
18
  def initialize(text = nil)
15
19
  super(text)
16
20
 
21
+ @last_dice_list_list = []
22
+ @last_dice_list = []
17
23
  @success_num = 0
18
24
  end
19
25
  end
@@ -5,7 +5,7 @@ require "bcdice/common_command/calc/parser"
5
5
  module BCDice
6
6
  module CommonCommand
7
7
  module Calc
8
- PREFIX_PATTERN = /C/.freeze
8
+ PREFIX_PATTERN = /C[+\-(]*\d+/.freeze
9
9
 
10
10
  class << self
11
11
  def eval(command, game_system, _randomizer)
@@ -29,6 +29,17 @@ module BCDice
29
29
  # choice A,B X,Y -> "A,B" と "X,Y" から選ぶ
30
30
  # choice(A[], B[], C[]) -> "A[]", "B[]", "C[]" から選ぶ
31
31
  # choice[A(), B(), C()] -> "A()", "B()", "C()" から選ぶ
32
+ #
33
+ # "choice"の後に数を指定することで、列挙した要素から重複なしで複数個を選ぶ
34
+ # choice2[A,B,C] -> "A", "B", "C" から重複なしで2個選ぶ
35
+ #
36
+ # 指定したい要素が「AからD」のように連続する項目の場合に「A-D」と省略して記述できる
37
+ # 略記の展開はアルファベット1文字もしくは数字の範囲に限り、略記1つを指定したときのみ展開される
38
+ # choice[A-D] -> choice[A,B,C,D] と等価
39
+ # choice[b-g] -> choice[b,c,d,e,f,g] と等価
40
+ # choice[3-7] -> choice[3,4,5,6,7] と等価
41
+ # choice[A-D,Z] -> 展開されない。 "A-D", "Z" から選ぶ
42
+ # choice[D-A] -> 展開されない。
32
43
  class Choice
33
44
  PREFIX_PATTERN = /choice/.freeze
34
45
 
@@ -44,6 +55,12 @@ module BCDice
44
55
  space: /\s+/,
45
56
  }.freeze
46
57
 
58
+ DELIMITER_CHAR = {
59
+ bracket: ", ",
60
+ paren: ", ",
61
+ space: " ",
62
+ }.freeze
63
+
47
64
  TERMINATION = {
48
65
  bracket: /\]/,
49
66
  paren: /\)/,
@@ -77,6 +94,11 @@ module BCDice
77
94
  return nil
78
95
  end
79
96
 
97
+ takes = scanner.scan(/\d+/)&.to_i || 1
98
+ if takes == 0
99
+ return nil
100
+ end
101
+
80
102
  type =
81
103
  case scanner.scan(/\(|\[|\s+/)
82
104
  when "["
@@ -105,47 +127,100 @@ module BCDice
105
127
  items.push(last_item.delete_suffix(SUFFIX[type]))
106
128
 
107
129
  items = items.map(&:strip).reject(&:empty?)
108
- if items.empty?
130
+ if items.size == 1
131
+ items = parse_multi_item_shorthand(items.first)
132
+ end
133
+
134
+ if items.empty? || items.size < takes
109
135
  return nil
110
136
  end
111
137
 
112
138
  new(
113
139
  secret: secret,
114
140
  block_delimiter: type,
141
+ takes: takes,
115
142
  items: items
116
143
  )
117
144
  end
145
+
146
+ def parse_multi_item_shorthand(str)
147
+ parse_multi_nums_shorthand(str) || parse_multi_chars_shorthand(str) || []
148
+ end
149
+
150
+ def parse_multi_nums_shorthand(str)
151
+ m = /^(\d+)-(\d+)$/.match(str)
152
+ unless m
153
+ return nil
154
+ end
155
+
156
+ first = m[1].to_i
157
+ last = m[2].to_i
158
+ if first > last
159
+ return nil
160
+ end
161
+
162
+ return first.upto(last).to_a
163
+ end
164
+
165
+ def parse_multi_chars_shorthand(str)
166
+ m = /^([a-z])-([a-z])$/.match(str) || /^([A-Z])-([A-Z])$/.match(str)
167
+ unless m
168
+ return nil
169
+ end
170
+
171
+ first = m[1]
172
+ last = m[2]
173
+ if first > last
174
+ return nil
175
+ end
176
+
177
+ return first.upto(last).to_a
178
+ end
118
179
  end
119
180
 
120
181
  # @param secret [Boolean]
121
182
  # @param block_delimiter [BlockDelimiter::BRACKET, BlockDelimiter::PAREN, BlockDelimiter::SPACE]
183
+ # @param takes [Integer] 何個チョイスするか
122
184
  # @param items [Array<String>]
123
- def initialize(secret:, block_delimiter:, items:)
185
+ def initialize(secret:, block_delimiter:, takes:, items:)
124
186
  @secret = secret
125
187
  @block_delimiter = block_delimiter
188
+ @takes = takes
126
189
  @items = items
127
190
  end
128
191
 
129
192
  # @param randomizer [Randomizer]
130
193
  # @return [Result]
131
194
  def roll(randomizer)
132
- index = randomizer.roll_index(@items.size)
133
- chosen = @items[index]
195
+ if @items.size > 100
196
+ return Result.new("項目数は100以下としてください")
197
+ end
198
+
199
+ items = @items.dup
200
+ chosens = []
201
+ @takes.times do
202
+ index = randomizer.roll_index(items.size)
203
+ chosens << items.delete_at(index)
204
+ end
134
205
 
135
206
  Result.new.tap do |r|
207
+ chosen = chosens.join(DELIMITER_CHAR[@block_delimiter])
208
+
136
209
  r.secret = @secret
137
210
  r.text = "(#{expr()}) > #{chosen}"
138
211
  end
139
212
  end
140
213
 
141
214
  def expr
215
+ takes = @takes == 1 ? nil : @takes
216
+
142
217
  case @block_delimiter
143
218
  when BlockDelimiter::SPACE
144
- "choice #{@items.join(' ')}"
219
+ "choice#{takes} #{@items.join(' ')}"
145
220
  when BlockDelimiter::BRACKET
146
- "choice[#{@items.join(',')}]"
221
+ "choice#{takes}[#{@items.join(',')}]"
147
222
  when BlockDelimiter::PAREN
148
- "choice(#{@items.join(',')})"
223
+ "choice#{takes}(#{@items.join(',')})"
149
224
  end
150
225
  end
151
226
  end