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

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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -1
  3. data/.rubocop.yml +12 -0
  4. data/.rubocop_todo.yml +1 -0
  5. data/CHANGELOG.md +34 -0
  6. data/Gemfile +6 -3
  7. data/Rakefile +52 -18
  8. data/bcdice.gemspec +2 -0
  9. data/i18n/Amadeus/ja_jp.yml +386 -0
  10. data/i18n/Amadeus/ko_kr.yml +148 -0
  11. data/i18n/Cthulhu/ja_jp.yml +11 -0
  12. data/i18n/Cthulhu/ko_kr.yml +11 -0
  13. data/i18n/Cthulhu/zh_hant.yml +11 -0
  14. data/i18n/DetatokoSaga/ja_jp.yml +74 -0
  15. data/i18n/DetatokoSaga/ko_kr.yml +74 -0
  16. data/i18n/DoubleCross/ja_jp.yml +53 -0
  17. data/i18n/DoubleCross/ko_kr.yml +53 -0
  18. data/i18n/Dracurouge/ja_jp.yml +1374 -0
  19. data/i18n/Dracurouge/ko_kr.yml +295 -0
  20. data/i18n/Fiasco/ja_jp.yml +10 -0
  21. data/i18n/Fiasco/ko_kr.yml +10 -0
  22. data/i18n/FutariSousa/ja_jp.yml +720 -0
  23. data/i18n/FutariSousa/ko_kr.yml +746 -0
  24. data/i18n/Insane/ja_jp.yml +454 -0
  25. data/i18n/Insane/ko_kr.yml +502 -0
  26. data/i18n/Kamigakari/ja_jp.yml +276 -0
  27. data/i18n/Kamigakari/ko_kr.yml +204 -0
  28. data/i18n/KillDeathBusiness/ja_jp.yml +1092 -0
  29. data/i18n/KillDeathBusiness/ko_kr.yml +1062 -0
  30. data/i18n/LogHorizon/ja_jp.yml +3082 -0
  31. data/i18n/LogHorizon/ko_kr.yml +923 -0
  32. data/i18n/MagicaLogia/ja_jp.yml +564 -0
  33. data/i18n/MonotoneMuseum/ja_jp.yml +525 -0
  34. data/i18n/MonotoneMuseum/ko_kr.yml +89 -0
  35. data/i18n/Nechronica/ja_jp.yml +57 -0
  36. data/i18n/Nechronica/ko_kr.yml +14 -0
  37. data/i18n/StratoShout/ja_jp.yml +160 -0
  38. data/i18n/StratoShout/ko_kr.yml +160 -0
  39. data/i18n/ja_jp.yml +5 -0
  40. data/i18n/ko_kr.yml +7 -0
  41. data/i18n/zh_hant.yml +3 -0
  42. data/lib/bcdice/arithmetic/node.rb +154 -0
  43. data/lib/bcdice/base.rb +87 -101
  44. data/lib/bcdice/common_command.rb +2 -0
  45. data/lib/bcdice/common_command/add_dice.rb +5 -41
  46. data/lib/bcdice/common_command/add_dice/node.rb +92 -16
  47. data/lib/bcdice/common_command/add_dice/parser.rb +374 -274
  48. data/lib/bcdice/common_command/add_dice/parser.y +153 -0
  49. data/lib/bcdice/common_command/add_dice/randomizer.rb +25 -33
  50. data/lib/bcdice/common_command/barabara_dice.rb +6 -47
  51. data/lib/bcdice/common_command/barabara_dice/node.rb +84 -0
  52. data/lib/bcdice/common_command/barabara_dice/parser.rb +336 -0
  53. data/lib/bcdice/common_command/barabara_dice/parser.y +107 -0
  54. data/lib/bcdice/common_command/calc.rb +7 -30
  55. data/lib/bcdice/common_command/calc/node.rb +30 -0
  56. data/lib/bcdice/common_command/calc/parser.rb +271 -0
  57. data/lib/bcdice/common_command/calc/parser.y +79 -0
  58. data/lib/bcdice/common_command/choice.rb +137 -19
  59. data/lib/bcdice/common_command/d66_dice.rb +48 -34
  60. data/lib/bcdice/common_command/lexer.rb +46 -0
  61. data/lib/bcdice/common_command/repeat.rb +102 -0
  62. data/lib/bcdice/common_command/reroll_dice.rb +8 -158
  63. data/lib/bcdice/common_command/reroll_dice/node.rb +198 -0
  64. data/lib/bcdice/common_command/reroll_dice/parser.rb +421 -0
  65. data/lib/bcdice/common_command/reroll_dice/parser.y +158 -0
  66. data/lib/bcdice/common_command/upper_dice.rb +10 -129
  67. data/lib/bcdice/common_command/upper_dice/node.rb +181 -0
  68. data/lib/bcdice/common_command/upper_dice/parser.rb +412 -0
  69. data/lib/bcdice/common_command/upper_dice/parser.y +143 -0
  70. data/lib/bcdice/common_command/version.rb +9 -17
  71. data/lib/bcdice/deprecated/checker.rb +78 -0
  72. data/lib/bcdice/dice_table/d66_grid_table.rb +8 -0
  73. data/lib/bcdice/dice_table/d66_table.rb +10 -0
  74. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +75 -17
  75. data/lib/bcdice/dice_table/sai_fic_skill_table/category.rb +25 -0
  76. data/lib/bcdice/dice_table/sai_fic_skill_table/skill.rb +23 -0
  77. data/lib/bcdice/dice_table/table.rb +8 -0
  78. data/lib/bcdice/game_system.rb +7 -1
  79. data/lib/bcdice/game_system/AFF2e.rb +1 -1
  80. data/lib/bcdice/game_system/AceKillerGene.rb +2 -2
  81. data/lib/bcdice/game_system/Airgetlamh.rb +3 -3
  82. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  83. data/lib/bcdice/game_system/Alshard.rb +1 -1
  84. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  85. data/lib/bcdice/game_system/Amadeus.rb +46 -507
  86. data/lib/bcdice/game_system/Amadeus_Korean.rb +12 -456
  87. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -1
  88. data/lib/bcdice/game_system/Arianrhod.rb +0 -1
  89. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  90. data/lib/bcdice/game_system/Avandner.rb +1 -1
  91. data/lib/bcdice/game_system/BBN.rb +1 -1
  92. data/lib/bcdice/game_system/BadLife.rb +1 -1
  93. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  94. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -2
  95. data/lib/bcdice/game_system/BeginningIdol.rb +2 -3
  96. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +2 -3
  97. data/lib/bcdice/game_system/BladeOfArcana.rb +2 -2
  98. data/lib/bcdice/game_system/BlindMythos.rb +1 -1
  99. data/lib/bcdice/game_system/BloodCrusade.rb +0 -1
  100. data/lib/bcdice/game_system/BloodMoon.rb +0 -1
  101. data/lib/bcdice/game_system/CardRanker.rb +1 -2
  102. data/lib/bcdice/game_system/ChaosFlare.rb +1 -1
  103. data/lib/bcdice/game_system/Chill.rb +1 -1
  104. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  105. data/lib/bcdice/game_system/ColossalHunter.rb +1 -2
  106. data/lib/bcdice/game_system/Comes.rb +50 -0
  107. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  108. data/lib/bcdice/game_system/Cthulhu.rb +94 -97
  109. data/lib/bcdice/game_system/Cthulhu7th.rb +108 -67
  110. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  111. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  112. data/lib/bcdice/game_system/CthulhuTech.rb +8 -14
  113. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +7 -190
  114. data/lib/bcdice/game_system/Cthulhu_Korean.rb +5 -186
  115. data/lib/bcdice/game_system/DarkBlaze.rb +9 -5
  116. data/lib/bcdice/game_system/DarkDaysDrive.rb +17 -15
  117. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  118. data/lib/bcdice/game_system/DeadlineHeroes.rb +2 -2
  119. data/lib/bcdice/game_system/DemonParasite.rb +1 -2
  120. data/lib/bcdice/game_system/DetatokoSaga.rb +48 -149
  121. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +6 -274
  122. data/lib/bcdice/game_system/DiceOfTheDead.rb +9 -6
  123. data/lib/bcdice/game_system/DoubleCross.rb +102 -81
  124. data/lib/bcdice/game_system/DoubleCross_Korean.rb +13 -330
  125. data/lib/bcdice/game_system/Dracurouge.rb +376 -1678
  126. data/lib/bcdice/game_system/Dracurouge_Korean.rb +16 -271
  127. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  128. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  129. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  130. data/lib/bcdice/game_system/Elysion.rb +3 -4
  131. data/lib/bcdice/game_system/EmbryoMachine.rb +1 -1
  132. data/lib/bcdice/game_system/Emoklore.rb +131 -0
  133. data/lib/bcdice/game_system/EndBreaker.rb +1 -2
  134. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -1
  135. data/lib/bcdice/game_system/Fiasco.rb +87 -70
  136. data/lib/bcdice/game_system/Fiasco_Korean.rb +7 -95
  137. data/lib/bcdice/game_system/FilledWith.rb +462 -566
  138. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -1
  139. data/lib/bcdice/game_system/FutariSousa.rb +103 -938
  140. data/lib/bcdice/game_system/FutariSousa_Korean.rb +7 -948
  141. data/lib/bcdice/game_system/{Gurps.rb → GURPS.rb} +184 -217
  142. data/lib/bcdice/game_system/Garako.rb +131 -39
  143. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  144. data/lib/bcdice/game_system/GehennaAn.rb +1 -1
  145. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  146. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  147. data/lib/bcdice/game_system/GoldenSkyStories.rb +1 -1
  148. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  149. data/lib/bcdice/game_system/GranCrest.rb +2 -3
  150. data/lib/bcdice/game_system/GundogRevised.rb +1 -1
  151. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  152. data/lib/bcdice/game_system/GurpsFW.rb +2 -3
  153. data/lib/bcdice/game_system/HarnMaster.rb +2 -2
  154. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -2
  155. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  156. data/lib/bcdice/game_system/HuntersMoon.rb +1 -2
  157. data/lib/bcdice/game_system/Illusio.rb +2 -2
  158. data/lib/bcdice/game_system/Insane.rb +90 -717
  159. data/lib/bcdice/game_system/Insane_Korean.rb +7 -719
  160. data/lib/bcdice/game_system/Kamigakari.rb +47 -242
  161. data/lib/bcdice/game_system/Kamigakari_Korean.rb +6 -394
  162. data/lib/bcdice/game_system/KanColle.rb +3 -3
  163. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  164. data/lib/bcdice/game_system/KillDeathBusiness.rb +162 -1144
  165. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +6 -1459
  166. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  167. data/lib/bcdice/game_system/LiveraDoll.rb +2 -2
  168. data/lib/bcdice/game_system/LogHorizon.rb +350 -3379
  169. data/lib/bcdice/game_system/LogHorizon_Korean.rb +55 -1357
  170. data/lib/bcdice/game_system/LostRecord.rb +0 -1
  171. data/lib/bcdice/game_system/LostRoyal.rb +1 -2
  172. data/lib/bcdice/game_system/MagicaLogia.rb +158 -1044
  173. data/lib/bcdice/game_system/MeikyuDays.rb +1 -2
  174. data/lib/bcdice/game_system/MeikyuKingdom.rb +4 -4
  175. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -5
  176. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  177. data/lib/bcdice/game_system/MetalHeadExtream.rb +2 -2
  178. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -1
  179. data/lib/bcdice/game_system/MonotoneMuseum.rb +38 -239
  180. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +10 -270
  181. data/lib/bcdice/game_system/NSSQ.rb +159 -0
  182. data/lib/bcdice/game_system/Nechronica.rb +34 -73
  183. data/lib/bcdice/game_system/Nechronica_Korean.rb +11 -128
  184. data/lib/bcdice/game_system/NeverCloud.rb +1 -1
  185. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  186. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  187. data/lib/bcdice/game_system/NinjaSlayer.rb +12 -11
  188. data/lib/bcdice/game_system/NjslyrBattle.rb +1 -1
  189. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -2
  190. data/lib/bcdice/game_system/OracleEngine.rb +1 -1
  191. data/lib/bcdice/game_system/OrgaRain.rb +2 -2
  192. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  193. data/lib/bcdice/game_system/Paranoia.rb +1 -1
  194. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  195. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  196. data/lib/bcdice/game_system/Peekaboo.rb +22 -122
  197. data/lib/bcdice/game_system/Postman.rb +2 -2
  198. data/lib/bcdice/game_system/PulpCthulhu.rb +3 -3
  199. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  200. data/lib/bcdice/game_system/RecordOfLodossWar.rb +1 -1
  201. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  202. data/lib/bcdice/game_system/RokumonSekai2.rb +1 -1
  203. data/lib/bcdice/game_system/RuinBreakers.rb +296 -0
  204. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  205. data/lib/bcdice/game_system/SRS.rb +1 -2
  206. data/lib/bcdice/game_system/SamsaraBallad.rb +1 -1
  207. data/lib/bcdice/game_system/Satasupe.rb +1 -2
  208. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  209. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  210. data/lib/bcdice/game_system/ShadowRun5.rb +2 -2
  211. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  212. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +1 -1
  213. data/lib/bcdice/game_system/ShinkuuGakuen.rb +2 -2
  214. data/lib/bcdice/game_system/ShinobiGami.rb +1 -2
  215. data/lib/bcdice/game_system/ShoujoTenrankai.rb +2 -2
  216. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  217. data/lib/bcdice/game_system/SteamPunkers.rb +1 -1
  218. data/lib/bcdice/game_system/StellarKnights.rb +1 -2
  219. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  220. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -2
  221. data/lib/bcdice/game_system/StratoShout.rb +44 -247
  222. data/lib/bcdice/game_system/StratoShout_Korean.rb +6 -282
  223. data/lib/bcdice/game_system/Strave.rb +2 -2
  224. data/lib/bcdice/game_system/SwordWorld.rb +8 -9
  225. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -3
  226. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -3
  227. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  228. data/lib/bcdice/game_system/TokumeiTenkousei.rb +1 -1
  229. data/lib/bcdice/game_system/TokyoGhostResearch.rb +2 -2
  230. data/lib/bcdice/game_system/Torg.rb +2 -2
  231. data/lib/bcdice/game_system/Torg1_5.rb +1 -1
  232. data/lib/bcdice/game_system/TorgEternity.rb +1 -1
  233. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  234. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  235. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -2
  236. data/lib/bcdice/game_system/UnsungDuet.rb +139 -0
  237. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  238. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  239. data/lib/bcdice/game_system/Villaciel.rb +1 -2
  240. data/lib/bcdice/game_system/Warhammer.rb +1 -1
  241. data/lib/bcdice/game_system/Warhammer4.rb +329 -0
  242. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  243. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  244. data/lib/bcdice/game_system/YankeeYogSothoth.rb +15 -15
  245. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  246. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  247. data/lib/bcdice/game_system/filled_with/cook_tables.rb +119 -0
  248. data/lib/bcdice/game_system/filled_with/lot_tables.rb +155 -0
  249. data/lib/bcdice/loader.rb +6 -8
  250. data/lib/bcdice/preprocessor.rb +15 -40
  251. data/lib/bcdice/repl.rb +1 -1
  252. data/lib/bcdice/result.rb +83 -0
  253. data/lib/bcdice/translate.rb +11 -0
  254. data/lib/bcdice/version.rb +1 -1
  255. metadata +80 -4
@@ -0,0 +1,153 @@
1
+ class BCDice::CommonCommand::AddDice::Parser
2
+ token NUMBER CMP_OP S D K H L U R PLUS MINUS ASTERISK SLASH PARENL PARENR QUESTION
3
+
4
+ rule
5
+ command: secret add
6
+ {
7
+ secret, lhs = val
8
+ raise ParseError unless lhs.include_dice?
9
+
10
+ result = Node::Command.new(secret, lhs)
11
+ }
12
+ | secret add CMP_OP target
13
+ {
14
+ secret, lhs, cmp_op, rhs = val
15
+ raise ParseError if !lhs.include_dice? || rhs.include_dice? || cmp_op.nil?
16
+
17
+ result = Node::Command.new(secret, lhs, cmp_op, rhs)
18
+ }
19
+
20
+ secret: /* none */
21
+ { result = false }
22
+ | S
23
+ { result = true }
24
+
25
+ target: add
26
+ | QUESTION
27
+ { result = Node::UndecidedTarget.instance }
28
+
29
+ add: add PLUS mul
30
+ {
31
+ lhs = val[0]
32
+ op, rhs = expand_negate(:+, val[2])
33
+ result = Node::BinaryOp.new(lhs, op, rhs)
34
+ }
35
+ | add MINUS mul
36
+ {
37
+ lhs = val[0]
38
+ op, rhs = expand_negate(:-, val[2])
39
+ result = Node::BinaryOp.new(lhs, op, rhs)
40
+ }
41
+ | mul
42
+
43
+ mul: mul ASTERISK unary
44
+ {
45
+ lhs = val[0]
46
+ rhs = val[2]
47
+ result = Node::BinaryOp.new(lhs, :*, rhs)
48
+ }
49
+ | mul SLASH unary round_type
50
+ {
51
+ lhs = val[0]
52
+ rhs = val[2]
53
+ divied_class = val[3]
54
+ result = divied_class.new(lhs, rhs)
55
+ }
56
+ | unary
57
+
58
+ round_type: /* none */
59
+ { result = Node::DivideWithRoundingDown }
60
+ | U
61
+ { result = Node::DivideWithRoundingUp }
62
+ | R
63
+ { result = Node::DivideWithRoundingOff }
64
+
65
+ unary: PLUS unary
66
+ { result = val[1] }
67
+ | MINUS unary
68
+ {
69
+ body = val[1]
70
+ result = body.is_a?(Node::Negate) ? body.body : Node::Negate.new(body)
71
+ }
72
+ | dice
73
+
74
+ dice: term D term
75
+ {
76
+ times = val[0]
77
+ sides = val[2]
78
+ raise ParseError if times.include_dice? || sides.include_dice?
79
+
80
+ result = Node::DiceRoll.new(times, sides)
81
+ }
82
+ | term D
83
+ {
84
+ times = val[0]
85
+ sides = Node::Number.new(6)
86
+ raise ParseError if times.include_dice?
87
+
88
+ result = Node::DiceRoll.new(times, sides)
89
+ }
90
+ | term D term filter_type term
91
+ {
92
+ times = val[0]
93
+ sides = val[2]
94
+ filter = val[3]
95
+ n_filtering = val[4]
96
+ raise ParseError if times.include_dice? || sides.include_dice? || n_filtering.include_dice?
97
+
98
+ result = Node::DiceRollWithFilter.new(times, sides, n_filtering, filter)
99
+ }
100
+ | term
101
+
102
+ filter_type: K H
103
+ { result = Node::DiceRollWithFilter::KEEP_HIGHEST }
104
+ | K L
105
+ { result = Node::DiceRollWithFilter::KEEP_LOWEST }
106
+ | D H
107
+ { result = Node::DiceRollWithFilter::DROP_HIGHEST }
108
+ | D L
109
+ { result = Node::DiceRollWithFilter::DROP_LOWEST }
110
+
111
+ term: PARENL add PARENR
112
+ { result = Node::Parenthesis.new(val[1]) }
113
+ | NUMBER
114
+ { result = Node::Number.new(val[0]) }
115
+ end
116
+
117
+ ---- header
118
+
119
+ require "bcdice/common_command/lexer"
120
+ require "bcdice/common_command/add_dice/node"
121
+
122
+ ---- inner
123
+
124
+ def self.parse(source)
125
+ new.parse(source)
126
+ end
127
+
128
+ def parse(source)
129
+ @lexer = Lexer.new(source)
130
+ do_parse()
131
+ rescue ParseError
132
+ nil
133
+ end
134
+
135
+ private
136
+
137
+ def next_token
138
+ @lexer.next_token
139
+ end
140
+
141
+ # 加減算の右辺が負数である場合に加減算を逆転させる
142
+ def expand_negate(op, rhs)
143
+ if rhs.is_a?(Node::Negate)
144
+ if op == :+
145
+ return [:-, rhs.body]
146
+ elsif op == :-
147
+ return [:+, rhs.body]
148
+ end
149
+ end
150
+
151
+ [op, rhs]
152
+ end
153
+
@@ -1,46 +1,38 @@
1
1
  module BCDice
2
2
  module CommonCommand
3
- class AddDice
3
+ module AddDice
4
4
  class Randomizer
5
- attr_reader :dicebot, :cmp_op, :dice_list, :sides
5
+ attr_reader :rand_results
6
6
 
7
- def initialize(bcdice, dicebot, cmp_op)
8
- @bcdice = bcdice
9
- @dicebot = dicebot
10
- @cmp_op = cmp_op
11
- @sides = 0
12
- @dice_list = []
13
- end
7
+ RandResult = Struct.new(:sides, :value)
14
8
 
15
- # ダイスを振る
16
- # @param [Integer] times ダイス数
17
- # @param [Integer] sides 面数
18
- # @return [Array<Array<Integer>>] 出目のグループの配列
19
- def roll(times, sides)
20
- # 振り足し分も含めた出目グループの配列
21
- @dice_list = roll_once(times, sides)
22
- return [@dice_list]
9
+ # @param rand_source [BCDice::Randomizer]
10
+ # @param game_system [BCDice::Base]
11
+ def initialize(rand_source, game_system)
12
+ @rand_source = rand_source
13
+ @game_system = game_system
14
+ @rand_results = []
23
15
  end
24
16
 
25
- # ダイスを振る(振り足しなしの1回分)
26
- # @param [Integer] times ダイス数
27
- # @param [Integer] sides 面数
17
+ # ダイスを振る
18
+ # @param times [Integer] ダイス数
19
+ # @param sides [Integer] 面数
28
20
  # @return [Array<Integer>] 出目の配列
29
- def roll_once(times, sides)
30
- @sides = sides if @sides < sides
31
-
32
- if sides == 66 && @dicebot.enabled_d66?
33
- return Array.new(times) { @bcdice.roll_d66(@dicebot.d66_sort_type) }
34
- end
35
-
36
- if sides == 9 && @dicebot.enabled_d9?
37
- return Array.new(times) { @bcdice.roll_d9() }
38
- end
21
+ def roll(times, sides)
22
+ dice_list =
23
+ if sides == 66
24
+ Array.new(times) { @rand_source.roll_d66(@game_system.d66_sort_type) }
25
+ elsif sides == 9 && @game_system.enabled_d9?
26
+ Array.new(times) { @rand_source.roll_d9() }
27
+ else
28
+ @rand_source.roll_barabara(times, sides)
29
+ end
39
30
 
40
- dice_list = @bcdice.roll_barabara(times, sides)
41
- dice_list.sort! if @dicebot.sort_add_dice?
31
+ dice_list.sort! if @game_system.sort_add_dice?
32
+ rand_results = dice_list.map { |value| RandResult.new(sides, value) }
33
+ @rand_results.concat(rand_results)
42
34
 
43
- return dice_list
35
+ dice_list
44
36
  end
45
37
  end
46
38
  end
@@ -1,56 +1,15 @@
1
- require "bcdice/format"
1
+ require "bcdice/common_command/barabara_dice/parser"
2
2
 
3
3
  module BCDice
4
4
  module CommonCommand
5
- class BarabaraDice
5
+ module BarabaraDice
6
6
  PREFIX_PATTERN = /\d+B\d+/.freeze
7
7
 
8
- def initialize(command, randomizer, game_system)
9
- @command = command
10
- @randomizer = randomizer
11
- @game_system = game_system
12
-
13
- @is_secret = false
14
- end
15
-
16
- def secret?
17
- @is_secret
18
- end
19
-
20
- # @return [String, nil]
21
- def eval()
22
- m = /^(S)?(\d+B\d+(?:\+\d+B\d+)*)(?:([<>=]+)(\d+))?$/i.match(@command)
23
- unless m
24
- return nil
25
- end
26
-
27
- @is_secret = !m[1].nil?
28
- lhs = m[2]
29
- b_list = lhs.split("+")
30
-
31
- cmp_op = Normalize.comparison_operator(m[3]) || @game_system.default_cmp_op
32
- target_number = m[4]&.to_i || @game_system.default_target_number
33
-
34
- dice_list = []
35
- b_list.each do |literal|
36
- times, sides = literal.split("B", 2).map(&:to_i)
37
- list = @randomizer.roll_barabara(times, sides)
38
- list.sort! if @game_system.sort_barabara_dice?
39
- dice_list.concat(list)
8
+ class << self
9
+ def eval(command, game_system, randomizer)
10
+ cmd = Parser.parse(command)
11
+ cmd&.eval(game_system, randomizer)
40
12
  end
41
-
42
- count_of_1 = dice_list.count(1)
43
- success_num = cmp_op ? dice_list.count { |dice| dice.send(cmp_op, target_number) } : 0
44
- success_num_text = "成功数#{success_num}" if cmp_op
45
-
46
- sequence = [
47
- "(#{lhs}#{Format.comparison_operator(cmp_op)}#{target_number})",
48
- dice_list.join(","),
49
- success_num_text,
50
- @game_system.grich_text(count_of_1, dice_list.size, success_num)
51
- ].compact
52
-
53
- return sequence.join(" > ")
54
13
  end
55
14
  end
56
15
  end
@@ -0,0 +1,84 @@
1
+ require "bcdice/format"
2
+
3
+ module BCDice
4
+ module CommonCommand
5
+ module BarabaraDice
6
+ module Node
7
+ class Command
8
+ def initialize(secret:, notations:, cmp_op:, target_number:)
9
+ @secret = secret
10
+ @notations = notations
11
+ @cmp_op = cmp_op
12
+ @target_number = target_number
13
+ end
14
+
15
+ # @return [String, nil]
16
+ def eval(game_system, randomizer)
17
+ round_type = game_system.round_type
18
+ notations = @notations.map { |n| n.to_dice(round_type) }
19
+ cmp_op = @cmp_op || game_system.default_cmp_op
20
+ target_number = @target_number&.eval(round_type) || game_system.default_target_number
21
+
22
+ dice_list_list = notations.map { |d| d.roll(randomizer) }
23
+ dice_list_list.map!(&:sort) if game_system.sort_barabara_dice?
24
+
25
+ dice_list = dice_list_list.flatten
26
+
27
+ count_of_1 = dice_list.count(1)
28
+ success_num = cmp_op ? dice_list.count { |d| d.send(cmp_op, target_number) } : 0
29
+ success_num_text = "成功数#{success_num}" if cmp_op
30
+
31
+ sequence = [
32
+ "(#{notations.join('+')}#{Format.comparison_operator(cmp_op)}#{target_number})",
33
+ dice_list.join(","),
34
+ success_num_text,
35
+ game_system.grich_text(count_of_1, dice_list.size, success_num)
36
+ ].compact
37
+
38
+ Result.new.tap do |r|
39
+ r.secret = @secret
40
+ r.text = sequence.join(" > ")
41
+ end
42
+ end
43
+ end
44
+
45
+ class Notation
46
+ # @param times [#eval]
47
+ # @param sides [#eval]
48
+ def initialize(times, sides)
49
+ @times = times
50
+ @sides = sides
51
+ end
52
+
53
+ # @param round_type [Symbol]
54
+ def to_dice(round_type)
55
+ times = @times.eval(round_type)
56
+ sides = @sides.eval(round_type)
57
+
58
+ Dice.new(times, sides)
59
+ end
60
+ end
61
+
62
+ class Dice
63
+ # @param times [Integer]
64
+ # @param sides [Integer]
65
+ def initialize(times, sides)
66
+ @times = times
67
+ @sides = sides
68
+ end
69
+
70
+ # @param randomizer [BCDice::Randomizer]
71
+ # @return [Array<Integer>]
72
+ def roll(randomizer)
73
+ randomizer.roll_barabara(@times, @sides)
74
+ end
75
+
76
+ # @return [String]
77
+ def to_s
78
+ "#{@times}B#{@sides}"
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,336 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.5.1
4
+ # from Racc grammar file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+
9
+
10
+ require "bcdice/common_command/lexer"
11
+ require "bcdice/common_command/reroll_dice/node"
12
+ require "bcdice/arithmetic/node"
13
+
14
+ module BCDice
15
+ module CommonCommand
16
+ module BarabaraDice
17
+ class Parser < Racc::Parser
18
+
19
+
20
+ def self.parse(source)
21
+ new.parse(source)
22
+ end
23
+
24
+ def parse(source)
25
+ @lexer = Lexer.new(source)
26
+ do_parse()
27
+ rescue ParseError
28
+ nil
29
+ end
30
+
31
+ private
32
+
33
+ def next_token
34
+ @lexer.next_token
35
+ end
36
+ ##### State transition tables begin ###
37
+
38
+ racc_action_table = [
39
+ 13, 9, 3, 9, 24, 25, 9, 9, 9, 26,
40
+ 18, 19, 8, 12, 8, 18, 19, 8, 8, 8,
41
+ 9, 4, 9, 38, 36, 37, 39, 18, 19, 18,
42
+ 19, 8, 9, 8, 9, 27, 28, 24, 25, 18,
43
+ 19, 18, 19, 8, 9, 8, 9, 27, 28, 27,
44
+ 28, 18, 19, 18, 19, 8, 10, 8, 14 ]
45
+
46
+ racc_action_check = [
47
+ 5, 2, 0, 8, 15, 15, 13, 14, 12, 15,
48
+ 8, 8, 2, 5, 8, 12, 12, 13, 14, 12,
49
+ 18, 1, 19, 34, 34, 34, 34, 18, 18, 19,
50
+ 19, 18, 24, 19, 25, 16, 16, 21, 21, 24,
51
+ 24, 25, 25, 24, 27, 25, 28, 31, 31, 32,
52
+ 32, 27, 27, 28, 28, 27, 4, 28, 7 ]
53
+
54
+ racc_action_pointer = [
55
+ -6, 21, -1, nil, 56, -9, nil, 55, 1, nil,
56
+ nil, nil, 6, 4, 5, -5, 24, nil, 18, 20,
57
+ nil, 28, nil, nil, 30, 32, nil, 42, 44, nil,
58
+ nil, 36, 38, nil, 19, nil, nil, nil, nil, nil ]
59
+
60
+ racc_action_default = [
61
+ -2, -25, -25, -3, -25, -4, -7, -25, -25, -24,
62
+ 40, -1, -25, -25, -25, -25, -11, -14, -25, -25,
63
+ -22, -5, -6, -8, -25, -25, -23, -25, -25, -20,
64
+ -21, -9, -10, -12, -15, -13, -16, -17, -18, -19 ]
65
+
66
+ racc_goto_table = [
67
+ 7, 1, 6, 15, 2, 29, 30, 21, 31, 32,
68
+ 5, 7, 23, 22, 33, 34, 11, 35 ]
69
+
70
+ racc_goto_check = [
71
+ 7, 1, 6, 5, 2, 9, 9, 5, 8, 8,
72
+ 3, 7, 7, 6, 9, 9, 4, 10 ]
73
+
74
+ racc_goto_pointer = [
75
+ nil, 1, 4, 8, 11, -5, 0, -2, -16, -13,
76
+ -17 ]
77
+
78
+ racc_goto_default = [
79
+ nil, nil, nil, nil, nil, nil, nil, 20, 16, 17,
80
+ nil ]
81
+
82
+ racc_reduce_table = [
83
+ 0, 0, :racc_error,
84
+ 3, 24, :_reduce_1,
85
+ 0, 25, :_reduce_2,
86
+ 1, 25, :_reduce_3,
87
+ 0, 27, :_reduce_4,
88
+ 2, 27, :_reduce_5,
89
+ 3, 26, :_reduce_6,
90
+ 1, 26, :_reduce_7,
91
+ 3, 29, :_reduce_8,
92
+ 3, 28, :_reduce_9,
93
+ 3, 28, :_reduce_10,
94
+ 1, 28, :_reduce_none,
95
+ 3, 31, :_reduce_12,
96
+ 4, 31, :_reduce_13,
97
+ 1, 31, :_reduce_none,
98
+ 0, 33, :_reduce_15,
99
+ 1, 33, :_reduce_16,
100
+ 1, 33, :_reduce_17,
101
+ 1, 33, :_reduce_18,
102
+ 1, 33, :_reduce_19,
103
+ 2, 32, :_reduce_20,
104
+ 2, 32, :_reduce_21,
105
+ 1, 32, :_reduce_none,
106
+ 3, 30, :_reduce_23,
107
+ 1, 30, :_reduce_24 ]
108
+
109
+ racc_reduce_n = 25
110
+
111
+ racc_shift_n = 40
112
+
113
+ racc_token_table = {
114
+ false => 0,
115
+ :error => 1,
116
+ :NUMBER => 2,
117
+ :B => 3,
118
+ :R => 4,
119
+ :U => 5,
120
+ :C => 6,
121
+ :F => 7,
122
+ :S => 8,
123
+ :PLUS => 9,
124
+ :MINUS => 10,
125
+ :ASTERISK => 11,
126
+ :SLASH => 12,
127
+ :PARENL => 13,
128
+ :PARENR => 14,
129
+ :BRACKETL => 15,
130
+ :BRACKETR => 16,
131
+ :LESS => 17,
132
+ :GREATER => 18,
133
+ :EQUAL => 19,
134
+ :NOT => 20,
135
+ :AT => 21,
136
+ :CMP_OP => 22 }
137
+
138
+ racc_nt_base = 23
139
+
140
+ racc_use_result_var = true
141
+
142
+ Racc_arg = [
143
+ racc_action_table,
144
+ racc_action_check,
145
+ racc_action_default,
146
+ racc_action_pointer,
147
+ racc_goto_table,
148
+ racc_goto_check,
149
+ racc_goto_default,
150
+ racc_goto_pointer,
151
+ racc_nt_base,
152
+ racc_reduce_table,
153
+ racc_token_table,
154
+ racc_shift_n,
155
+ racc_reduce_n,
156
+ racc_use_result_var ]
157
+
158
+ Racc_token_to_s_table = [
159
+ "$end",
160
+ "error",
161
+ "NUMBER",
162
+ "B",
163
+ "R",
164
+ "U",
165
+ "C",
166
+ "F",
167
+ "S",
168
+ "PLUS",
169
+ "MINUS",
170
+ "ASTERISK",
171
+ "SLASH",
172
+ "PARENL",
173
+ "PARENR",
174
+ "BRACKETL",
175
+ "BRACKETR",
176
+ "LESS",
177
+ "GREATER",
178
+ "EQUAL",
179
+ "NOT",
180
+ "AT",
181
+ "CMP_OP",
182
+ "$start",
183
+ "expr",
184
+ "secret",
185
+ "notations",
186
+ "target",
187
+ "add",
188
+ "dice",
189
+ "term",
190
+ "mul",
191
+ "unary",
192
+ "round_type" ]
193
+
194
+ Racc_debug_parser = false
195
+
196
+ ##### State transition tables end #####
197
+
198
+ # reduce 0 omitted
199
+
200
+ def _reduce_1(val, _values, result)
201
+ result = Node::Command.new(
202
+ secret: val[0],
203
+ notations: val[1],
204
+ cmp_op: val[2][:cmp_op],
205
+ target_number: val[2][:target]
206
+ )
207
+
208
+ result
209
+ end
210
+
211
+ def _reduce_2(val, _values, result)
212
+ result = false
213
+ result
214
+ end
215
+
216
+ def _reduce_3(val, _values, result)
217
+ result = true
218
+ result
219
+ end
220
+
221
+ def _reduce_4(val, _values, result)
222
+ result = {}
223
+ result
224
+ end
225
+
226
+ def _reduce_5(val, _values, result)
227
+ cmp_op, target = val
228
+ raise ParseError unless cmp_op
229
+
230
+ result = {cmp_op: cmp_op, target: target}
231
+
232
+ result
233
+ end
234
+
235
+ def _reduce_6(val, _values, result)
236
+ notations = val[0]
237
+ notations.push(val[2])
238
+ result = notations
239
+
240
+ result
241
+ end
242
+
243
+ def _reduce_7(val, _values, result)
244
+ result = [val[0]]
245
+ result
246
+ end
247
+
248
+ def _reduce_8(val, _values, result)
249
+ times = val[0]
250
+ sides = val[2]
251
+ result = Node::Notation.new(times, sides)
252
+
253
+ result
254
+ end
255
+
256
+ def _reduce_9(val, _values, result)
257
+ result = Arithmetic::Node::BinaryOp.new(val[0], :+, val[2])
258
+ result
259
+ end
260
+
261
+ def _reduce_10(val, _values, result)
262
+ result = Arithmetic::Node::BinaryOp.new(val[0], :-, val[2])
263
+ result
264
+ end
265
+
266
+ # reduce 11 omitted
267
+
268
+ def _reduce_12(val, _values, result)
269
+ result = Arithmetic::Node::BinaryOp.new(val[0], :*, val[2])
270
+ result
271
+ end
272
+
273
+ def _reduce_13(val, _values, result)
274
+ divied_class = val[3]
275
+ result = divied_class.new(val[0], val[2])
276
+
277
+ result
278
+ end
279
+
280
+ # reduce 14 omitted
281
+
282
+ def _reduce_15(val, _values, result)
283
+ result = Arithmetic::Node::DivideWithGameSystemDefault
284
+ result
285
+ end
286
+
287
+ def _reduce_16(val, _values, result)
288
+ result = Arithmetic::Node::DivideWithCeil
289
+ result
290
+ end
291
+
292
+ def _reduce_17(val, _values, result)
293
+ result = Arithmetic::Node::DivideWithCeil
294
+ result
295
+ end
296
+
297
+ def _reduce_18(val, _values, result)
298
+ result = Arithmetic::Node::DivideWithRound
299
+ result
300
+ end
301
+
302
+ def _reduce_19(val, _values, result)
303
+ result = Arithmetic::Node::DivideWithFloor
304
+ result
305
+ end
306
+
307
+ def _reduce_20(val, _values, result)
308
+ result = val[1]
309
+ result
310
+ end
311
+
312
+ def _reduce_21(val, _values, result)
313
+ result = Arithmetic::Node::Negative.new(val[1])
314
+ result
315
+ end
316
+
317
+ # reduce 22 omitted
318
+
319
+ def _reduce_23(val, _values, result)
320
+ result = val[1]
321
+ result
322
+ end
323
+
324
+ def _reduce_24(val, _values, result)
325
+ result = Arithmetic::Node::Number.new(val[0])
326
+ result
327
+ end
328
+
329
+ def _reduce_none(val, _values, result)
330
+ val[0]
331
+ end
332
+
333
+ end # class Parser
334
+ end # module BarabaraDice
335
+ end # module CommonCommand
336
+ end # module BCDice