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,158 @@
1
+ class BCDice::CommonCommand::RerollDice::Parser
2
+ token NUMBER R U C F S PLUS MINUS ASTERISK SLASH PARENL PARENR BRACKETL BRACKETR LESS GREATER EQUAL NOT AT CMP_OP
3
+
4
+ rule
5
+ expr: secret notations target
6
+ {
7
+ result = Node::Command.new(
8
+ secret: val[0],
9
+ notations: val[1],
10
+ cmp_op: val[2][:cmp_op],
11
+ target_number: val[2][:target],
12
+ source: @lexer.source
13
+ )
14
+ }
15
+ | secret notations bracket target
16
+ {
17
+ target = val[3]
18
+ threshold = val[2]
19
+ result = Node::Command.new(
20
+ secret: val[0],
21
+ notations: val[1],
22
+ cmp_op: target[:cmp_op],
23
+ target_number: target[:target],
24
+ reroll_cmp_op: threshold[:cmp_op],
25
+ reroll_threshold: threshold[:threshold],
26
+ source: @lexer.source
27
+ )
28
+ }
29
+ | secret notations target at
30
+ {
31
+ target = val[2]
32
+ threshold = val[3]
33
+ result = Node::Command.new(
34
+ secret: val[0],
35
+ notations: val[1],
36
+ cmp_op: target[:cmp_op],
37
+ target_number: target[:target],
38
+ reroll_cmp_op: threshold[:cmp_op],
39
+ reroll_threshold: threshold[:threshold],
40
+ source: @lexer.source
41
+ )
42
+ }
43
+
44
+ secret: /* none */
45
+ { result = false }
46
+ | S
47
+ { result = true }
48
+
49
+ target: /* none */
50
+ { result = {} }
51
+ | CMP_OP add
52
+ {
53
+ cmp_op, target = val
54
+ raise ParseError unless cmp_op
55
+
56
+ result = {cmp_op: cmp_op, target: target}
57
+ }
58
+
59
+ bracket: BRACKETL add BRACKETR
60
+ { result = {threshold: val[1]} }
61
+ | BRACKETL CMP_OP add BRACKETR
62
+ {
63
+ cmp_op = val[1]
64
+ threshold = val[2]
65
+ raise ParseError unless cmp_op
66
+
67
+ result = {cmp_op: cmp_op, threshold: threshold}
68
+ }
69
+
70
+ at: AT add
71
+ { result = {threshold: val[1]} }
72
+ | AT CMP_OP add
73
+ {
74
+ cmp_op = val[1]
75
+ threshold = val[2]
76
+ raise ParseError unless cmp_op
77
+
78
+ result = {cmp_op: cmp_op, threshold: threshold}
79
+ }
80
+
81
+ notations: notations PLUS dice
82
+ {
83
+ notations = val[0]
84
+ notations.push(val[2])
85
+ result = notations
86
+ }
87
+ | dice
88
+ { result = [val[0]] }
89
+
90
+ dice: term R term
91
+ {
92
+ times = val[0]
93
+ sides = val[2]
94
+ result = Node::Notation.new(times, sides)
95
+ }
96
+
97
+ add: add PLUS mul
98
+ { result = Arithmetic::Node::BinaryOp.new(val[0], :+, val[2]) }
99
+ | add MINUS mul
100
+ { result = Arithmetic::Node::BinaryOp.new(val[0], :-, val[2]) }
101
+ | mul
102
+
103
+ mul: mul ASTERISK unary
104
+ { result = Arithmetic::Node::BinaryOp.new(val[0], :*, val[2]) }
105
+ | mul SLASH unary round_type
106
+ {
107
+ divied_class = val[3]
108
+ result = divied_class.new(val[0], val[2])
109
+ }
110
+ | unary
111
+
112
+ round_type: /* none */
113
+ { result = Arithmetic::Node::DivideWithGameSystemDefault }
114
+ | U
115
+ { result = Arithmetic::Node::DivideWithCeil }
116
+ | C
117
+ { result = Arithmetic::Node::DivideWithCeil }
118
+ | R
119
+ { result = Arithmetic::Node::DivideWithRound }
120
+ | F
121
+ { result = Arithmetic::Node::DivideWithFloor }
122
+
123
+ unary: PLUS unary
124
+ { result = val[1] }
125
+ | MINUS unary
126
+ { result = Arithmetic::Node::Negative.new(val[1]) }
127
+ | term
128
+
129
+ term: PARENL add PARENR
130
+ { result = val[1] }
131
+ | NUMBER
132
+ { result = Arithmetic::Node::Number.new(val[0]) }
133
+ end
134
+
135
+ ---- header
136
+
137
+ require "bcdice/common_command/lexer"
138
+ require "bcdice/common_command/barabara_dice/node"
139
+ require "bcdice/arithmetic/node"
140
+
141
+ ---- inner
142
+
143
+ def self.parse(source)
144
+ new.parse(source)
145
+ end
146
+
147
+ def parse(source)
148
+ @lexer = Lexer.new(source)
149
+ do_parse()
150
+ rescue ParseError
151
+ nil
152
+ end
153
+
154
+ private
155
+
156
+ def next_token
157
+ @lexer.next_token
158
+ end
@@ -1,6 +1,4 @@
1
- require "bcdice/arithmetic_evaluator"
2
- require "bcdice/normalize"
3
- require "bcdice/format"
1
+ require "bcdice/common_command/upper_dice/parser"
4
2
 
5
3
  module BCDice
6
4
  module CommonCommand
@@ -30,135 +28,18 @@ module BCDice
30
28
  # "2U4" -> 3[3]+10=13, 10[4,4,2]+10=20
31
29
  # 最大値:20
32
30
  # 合計値:23 = 3[3]+10[4,4,2]+10
33
- class UpperDice
31
+ module UpperDice
34
32
  PREFIX_PATTERN = /\d+U\d+/.freeze
35
33
 
36
- def initialize(command, bcdice, diceBot)
37
- @string = command
38
- @bcdice = bcdice
39
- @diceBot = diceBot
40
-
41
- @is_secret = false
42
- end
43
-
44
- def secret?
45
- @is_secret
46
- end
47
-
48
- # 上方無限ロールを実行する
49
- #
50
- # @return [String, nil]
51
- def eval
52
- unless (m = /^S?(\d+U\d+(?:\+\d+U\d+)*)(?:\[(\d+)\])?([\+\-\d]*)(?:([<>=]+)(\d+))?(?:@(\d+))?/i.match(@string))
53
- return nil
34
+ class << self
35
+ # @param command [String]
36
+ # @param game_system [BCDice::Base]
37
+ # @param randomizer [BCDice::Randomizer]
38
+ # @return [UpperDice, nil]
39
+ def eval(command, game_system, randomizer)
40
+ cmd = Parser.parse(command)
41
+ cmd&.eval(game_system, randomizer)
54
42
  end
55
-
56
- @is_secret = @string.start_with?("S")
57
-
58
- @command = m[1]
59
- @cmp_op = Normalize.comparison_operator(m[4])
60
- @target_number = @cmp_op ? m[5].to_i : nil
61
- @reroll_threshold = reroll_threshold(m[2] || m[6])
62
-
63
- @modify_number = ArithmeticEvaluator.eval(m[3], round_type: @diceBot.round_type)
64
-
65
- if @reroll_threshold <= 1
66
- return "(#{expr()}) > 無限ロールの条件がまちがっています"
67
- end
68
-
69
- roll_list = []
70
- @command.split("+").each do |u|
71
- times, sides = u.split("U", 2).map(&:to_i)
72
- roll_list.concat(roll(times, sides))
73
- end
74
-
75
- result =
76
- if @cmp_op
77
- success_count = roll_list.count do |e|
78
- x = e[:sum] + @modify_number
79
- x.send(@cmp_op, @target_number)
80
- end
81
- "成功数#{success_count}"
82
- else
83
- sum_list = roll_list.map { |e| e[:sum] }
84
- total = sum_list.inject(0, :+) + @modify_number
85
- max = sum_list.map { |i| i + @modify_number }.max
86
- "#{max}/#{total}(最大/合計)"
87
- end
88
-
89
- sequence = [
90
- "(#{expr()})",
91
- dice_text(roll_list) + Format.modifier(@modify_number),
92
- result
93
- ]
94
-
95
- return sequence.join(" > ")
96
- end
97
-
98
- private
99
-
100
- # ダイスロールし、ダイスボットのソート設定に応じてソートする
101
- #
102
- # @param times [Integer] ダイスの個数
103
- # @param sides [Integer] ダイスの面数
104
- # @return [Array<Hash>]
105
- def roll(times, sides)
106
- ret = Array.new(times) do
107
- list = roll_ones(sides)
108
- {sum: list.inject(0, :+), list: list}
109
- end
110
-
111
- if @diceBot.sort_barabara_dice?
112
- ret = ret.sort_by { |e| e[:sum] }
113
- end
114
-
115
- return ret
116
- end
117
-
118
- # 一つだけダイスロールする
119
- #
120
- # @param sides [Integer] ダイスの面数
121
- # @return [Array<Integer>]
122
- def roll_ones(sides)
123
- dice_list = []
124
-
125
- loop do
126
- value = @bcdice.roll_once(sides)
127
- dice_list.push(value)
128
- break if value < @reroll_threshold
129
- end
130
-
131
- return dice_list
132
- end
133
-
134
- # ダイスロールの結果を文字列に変換する
135
- # 振り足しがなければその数値、振り足しがあれば合計と各ダイスの出目を出力する
136
- #
137
- # @param roll_list [Array<Hash>]
138
- # @return [String]
139
- def dice_text(roll_list)
140
- roll_list.map do |e|
141
- if e[:list].size == 1
142
- e[:sum]
143
- else
144
- "#{e[:sum]}[#{e[:list].join(',')}]"
145
- end
146
- end.join(",")
147
- end
148
-
149
- # 振り足しの閾値を得る
150
- #
151
- # @param target [String]
152
- # @return [Integer]
153
- def reroll_threshold(target)
154
- target&.to_i || @diceBot.upper_dice_reroll_threshold.to_i
155
- end
156
-
157
- # パース済みのコマンドを文字列で表示する
158
- #
159
- # @return [String]
160
- def expr
161
- "#{@command}[#{@reroll_threshold}]#{Format.modifier(@modify_number)}#{Format.comparison_operator(@cmp_op)}#{@target_number}"
162
43
  end
163
44
  end
164
45
  end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module CommonCommand
5
+ module UpperDice
6
+ module Node
7
+ class Command
8
+ # @param secret [Boolean]
9
+ # @param notations [Array<Notation>]
10
+ # @param modifier [Integer]
11
+ # @param cmp_op [Symbol, nil]
12
+ # @param target_number [Integer, nil]
13
+ # @param reroll_threshold [Integer]
14
+ def initialize(secret:, notations:, modifier:, cmp_op:, target_number:, reroll_threshold: nil)
15
+ @secret = secret
16
+ @notations = notations
17
+ @modifier = modifier
18
+ @cmp_op = cmp_op
19
+ @target_number = target_number
20
+ @reroll_threshold = reroll_threshold
21
+ end
22
+
23
+ # 上方無限ロールを実行する
24
+ #
25
+ # @param randomizer [Randomizer]
26
+ # @return [Result, nil]
27
+ def eval(game_system, randomizer)
28
+ round_type = game_system.round_type
29
+
30
+ dice_list = @notations.map { |n| n.to_dice(round_type) }
31
+ reroll_threshold = @reroll_threshold&.eval(round_type) || game_system.upper_dice_reroll_threshold || 0
32
+ modifier = @modifier&.eval(round_type) || 0
33
+ target_number = @target_number&.eval(round_type)
34
+
35
+ expr = expr(dice_list, reroll_threshold, modifier, target_number)
36
+
37
+ if reroll_threshold <= 1
38
+ return result_with_text("(#{expr}) > 無限ロールの条件がまちがっています")
39
+ end
40
+
41
+ roll_list = dice_list.map do |n|
42
+ n.roll(randomizer, reroll_threshold, game_system.sort_barabara_dice?)
43
+ end.reduce([], :concat)
44
+
45
+ result =
46
+ if @cmp_op
47
+ result_success_count(roll_list, modifier, target_number)
48
+ else
49
+ result_max_sum(roll_list, modifier)
50
+ end
51
+
52
+ sequence = [
53
+ "(#{expr})",
54
+ interlim_expr(roll_list, modifier),
55
+ result
56
+ ]
57
+
58
+ result_with_text(sequence.join(" > "))
59
+ end
60
+
61
+ private
62
+
63
+ def result_success_count(roll_list, modifier, target_number)
64
+ success_count = roll_list.count do |e|
65
+ x = e[:sum] + modifier
66
+ x.send(@cmp_op, target_number)
67
+ end
68
+
69
+ "成功数#{success_count}"
70
+ end
71
+
72
+ def result_max_sum(roll_list, modifier)
73
+ sum_list = roll_list.map { |e| e[:sum] }
74
+ total = sum_list.sum() + modifier
75
+ max = sum_list.map { |i| i + modifier }.max
76
+
77
+ "#{max}/#{total}(最大/合計)"
78
+ end
79
+
80
+ # ダイスロールの結果を文字列に変換する
81
+ # 振り足しがなければその数値、振り足しがあれば合計と各ダイスの出目を出力する
82
+ #
83
+ # @param roll_list [Array<Hash>]
84
+ # @param modifier [Integer]
85
+ # @return [String]
86
+ def interlim_expr(roll_list, modifier)
87
+ dice = roll_list.map do |e|
88
+ if e[:list].size == 1
89
+ e[:sum]
90
+ else
91
+ "#{e[:sum]}[#{e[:list].join(',')}]"
92
+ end
93
+ end.join(",")
94
+
95
+ dice + Format.modifier(modifier)
96
+ end
97
+
98
+ # パース済みのコマンドを文字列で表示する
99
+ #
100
+ # @return [String]
101
+ def expr(dice_list, reroll_threshold, modifier, target_number)
102
+ formated_cmp_op = Format.comparison_operator(@cmp_op)
103
+ formated_modifier = Format.modifier(modifier)
104
+
105
+ "#{dice_list.join('+')}[#{reroll_threshold}]#{formated_modifier}#{formated_cmp_op}#{target_number}"
106
+ end
107
+
108
+ def result_with_text(text)
109
+ Result.new.tap do |r|
110
+ r.secret = @secret
111
+ r.text = text
112
+ end
113
+ end
114
+ end
115
+
116
+ class Notation
117
+ # @param roll_times [Object]
118
+ # @param sides [Object]
119
+ def initialize(roll_times, sides)
120
+ @roll_times = roll_times
121
+ @sides = sides
122
+ end
123
+
124
+ # @param round_type [Symbol]
125
+ # @return [Dice]
126
+ def to_dice(round_type)
127
+ roll_times = @roll_times.eval(round_type)
128
+ sides = @sides.eval(round_type)
129
+
130
+ Dice.new(roll_times, sides)
131
+ end
132
+ end
133
+
134
+ class Dice
135
+ # @param roll_times [Integer]
136
+ # @param sides [Integer]
137
+ def initialize(roll_times, sides)
138
+ @roll_times = roll_times
139
+ @sides = sides
140
+ end
141
+
142
+ # @param randomizer [BCDice::Randomizer]
143
+ # @param reroll_threshold [Integer]
144
+ # @param sort [Boolean]
145
+ # @return [Array<Hash>]
146
+ def roll(randomizer, reroll_threshold, sort)
147
+ ret = Array.new(@roll_times) do
148
+ list = roll_ones(randomizer, reroll_threshold)
149
+ {sum: list.sum(), list: list}
150
+ end
151
+
152
+ if sort
153
+ ret = ret.sort_by { |e| e[:sum] }
154
+ end
155
+
156
+ return ret
157
+ end
158
+
159
+ # @return [String]
160
+ def to_s
161
+ "#{@roll_times}U#{@sides}"
162
+ end
163
+
164
+ private
165
+
166
+ def roll_ones(randomizer, reroll_threshold)
167
+ dice_list = []
168
+
169
+ loop do
170
+ value = randomizer.roll_once(@sides)
171
+ dice_list.push(value)
172
+ break if value < reroll_threshold
173
+ end
174
+
175
+ return dice_list
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end