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,5 @@
1
+ ja_jp:
2
+ success: 成功
3
+ failure: 失敗
4
+ critical: クリティカル
5
+ fumble: ファンブル
@@ -0,0 +1,7 @@
1
+ ko_kr:
2
+ success: 성공
3
+ failure: 실패
4
+ fumble: 펌블
5
+ RTT:
6
+ rtt_format: '랜덤 특기 결정표(%<category_dice>d,%<row_dice>d) > %<text>s'
7
+ rttn_format: '지정특기(%<category_name>s)표(%<row_dice>d) > %<text>s'
@@ -0,0 +1,3 @@
1
+ zh_hant:
2
+ success: 成功
3
+ failure: 失敗
@@ -0,0 +1,154 @@
1
+ module BCDice
2
+ module Arithmetic
3
+ module Node
4
+ class BinaryOp
5
+ def initialize(lhs, op, rhs)
6
+ @lhs = lhs
7
+ @op = op
8
+ @rhs = rhs
9
+ end
10
+
11
+ def eval(round_type)
12
+ l = lhs.eval(round_type)
13
+ r = rhs.eval(round_type)
14
+ l.send(op, r)
15
+ end
16
+
17
+ def s_exp
18
+ "(#{op} #{lhs.s_exp} #{rhs.s_exp}}"
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :op, :lhs, :rhs
24
+ end
25
+
26
+ # 除算ノードの基底クラス
27
+ class DivideBase < BinaryOp
28
+ def initialize(lhs, rhs)
29
+ super(lhs, :/, rhs)
30
+ end
31
+
32
+ def eval(round_type)
33
+ l = lhs.eval(round_type)
34
+ r = rhs.eval(round_type)
35
+ divide_and_round(l, r, round_type)
36
+ end
37
+
38
+ private
39
+
40
+ # 除算および端数処理を行う
41
+ # @param [Integer] _dividend 被除数
42
+ # @param [Integer] _divisor 除数(0以外)
43
+ # @param [Symbol] _round_type ゲームシステムの端数処理設定
44
+ # @return [Integer]
45
+ def divide_and_round(_dividend, _divisor, _round_type)
46
+ raise NotImplementedError
47
+ end
48
+ end
49
+
50
+ # 除算(切り上げ)のノード
51
+ class DivideWithCeil < DivideBase
52
+ private
53
+
54
+ def op
55
+ "/C"
56
+ end
57
+
58
+ # 除算および端数処理を行う
59
+ # @param [Integer] dividend 被除数
60
+ # @param [Integer] divisor 除数(0以外)
61
+ # @param [Symbol] _round_type ゲームシステムの端数処理設定
62
+ # @return [Integer]
63
+ def divide_and_round(dividend, divisor, _round_type)
64
+ (dividend.to_f / divisor).ceil
65
+ end
66
+ end
67
+
68
+ # 除算(四捨五入)のノード
69
+ class DivideWithRound < DivideBase
70
+ private
71
+
72
+ def op
73
+ "/R"
74
+ end
75
+
76
+ # 除算および端数処理を行う
77
+ # @param [Integer] dividend 被除数
78
+ # @param [Integer] divisor 除数(0以外)
79
+ # @param [Symbol] _round_type ゲームシステムの端数処理設定
80
+ # @return [Integer]
81
+ def divide_and_round(dividend, divisor, _round_type)
82
+ (dividend.to_f / divisor).round
83
+ end
84
+ end
85
+
86
+ # 除算(切り捨て)のノード
87
+ class DivideWithFloor < DivideBase
88
+ private
89
+
90
+ def op
91
+ "/F"
92
+ end
93
+
94
+ # 除算および端数処理を行う
95
+ # @param [Integer] dividend 被除数
96
+ # @param [Integer] divisor 除数(0以外)
97
+ # @param [Symbol] _round_type ゲームシステムの端数処理設定
98
+ # @return [Integer]
99
+ def divide_and_round(dividend, divisor, _round_type)
100
+ dividend / divisor
101
+ end
102
+ end
103
+
104
+ # 除算(端数処理はゲームシステム依存)のノード
105
+ class DivideWithGameSystemDefault < DivideBase
106
+ private
107
+
108
+ # 除算および端数処理を行う
109
+ # @param [Integer] dividend 被除数
110
+ # @param [Integer] divisor 除数(0以外)
111
+ # @param [Symbol] round_type ゲームシステムの端数処理設定
112
+ # @return [Integer]
113
+ def divide_and_round(dividend, divisor, round_type)
114
+ case round_type
115
+ when RoundType::CEIL
116
+ (dividend.to_f / divisor).ceil
117
+ when RoundType::ROUND
118
+ (dividend.to_f / divisor).round
119
+ else # RoundType::FLOOR
120
+ dividend / divisor
121
+ end
122
+ end
123
+ end
124
+
125
+ class Negative
126
+ def initialize(body)
127
+ @body = body
128
+ end
129
+
130
+ def eval(round_type)
131
+ -@body.eval(round_type)
132
+ end
133
+
134
+ def s_exp
135
+ "(- #{@body.s_exp})"
136
+ end
137
+ end
138
+
139
+ class Number
140
+ def initialize(value)
141
+ @value = value
142
+ end
143
+
144
+ def eval(_round_type)
145
+ @value
146
+ end
147
+
148
+ def s_exp
149
+ @value.to_s
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -1,8 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "i18n"
4
+ require "i18n/backend/fallbacks"
3
5
  require "bcdice/randomizer"
4
6
  require "bcdice/dice_table"
5
7
  require "bcdice/enum"
8
+ require "bcdice/translate"
9
+ require "bcdice/result"
10
+ require "bcdice/command_parser"
11
+ require "bcdice/deprecated/checker"
6
12
 
7
13
  module BCDice
8
14
  class Base
@@ -18,6 +24,10 @@ module BCDice
18
24
  @prefixes.concat(prefixes.flatten)
19
25
  end
20
26
 
27
+ def register_prefix_from_super_class
28
+ register_prefix(superclass.prefixes)
29
+ end
30
+
21
31
  # ゲームシステム固有のコマンドにマッチする正規表現を返す
22
32
  # 正規表現を一度生成したら、以後コマンドの登録はできないようにする
23
33
  #
@@ -50,15 +60,23 @@ module BCDice
50
60
 
51
61
  @command_pattern = /^S?(#{pattarns.join("|")})/i.freeze
52
62
  end
63
+
64
+ # @param command [String]
65
+ # @return [Result]
66
+ def eval(command)
67
+ new(command).eval
68
+ end
53
69
  end
54
70
 
71
+ include Translate
72
+ include Deprecated::Checker
73
+
55
74
  def initialize(command)
56
75
  @raw_input = command
57
76
 
58
77
  @sort_add_dice = false # 加算ダイスでダイス目をソートするかどうか
59
78
  @sort_barabara_dice = false # バラバラダイスでダイス目をソートするかどうか
60
79
 
61
- @enabled_d66 = true # D66ダイスを利用するかどうか
62
80
  @d66_sort_type = D66SortType::NO_SORT # 入れ替えの種類 詳しくはBCDice::D66SortTypeを参照すること
63
81
 
64
82
  @enabled_d9 = false # D9ダイスを有効にするか(ガンドッグ)で使用
@@ -73,11 +91,7 @@ module BCDice
73
91
 
74
92
  @enabled_upcase_input = true # 入力を String#upcase するかどうか
75
93
 
76
- @is_secret = false
77
- @is_success = false
78
- @is_failure = false
79
- @is_critical = false
80
- @is_fumble = false
94
+ @locale = :ja_jp # i18n用の言語設定
81
95
 
82
96
  @randomizer = BCDice::Randomizer.new
83
97
  @debug = false
@@ -129,13 +143,6 @@ module BCDice
129
143
  @sort_barabara_dice
130
144
  end
131
145
 
132
- # D66ダイスが有効か
133
- #
134
- # @return [Boolean]
135
- def enabled_d66?
136
- @enabled_d66
137
- end
138
-
139
146
  # D9ダイスが有効か
140
147
  #
141
148
  # @return [Boolean]
@@ -143,50 +150,21 @@ module BCDice
143
150
  @enabled_d9
144
151
  end
145
152
 
146
- # シークレットコマンドか
147
- #
148
- # @return [Boolean]
149
- def secret?
150
- @is_secret
151
- end
152
-
153
- # 結果が成功か
154
- # @return [Boolean]
155
- def success?
156
- @is_success
157
- end
158
-
159
- # 結果が失敗か
160
- # @return [Boolean]
161
- def failure?
162
- @is_failure
163
- end
164
-
165
- # 結果がクリティカルか
166
- # @return [Boolean]
167
- def critical?
168
- @is_critical
169
- end
170
-
171
- # 結果がファンブルか
172
- # @return [Boolean]
173
- def fumble?
174
- @is_fumble
175
- end
176
-
177
153
  # デバッグを有用にする
178
154
  def enable_debug
179
155
  @debug = true
180
156
  end
181
157
 
182
158
  # コマンドを評価する
183
- # @return [String, nil] コマンド実行結果。コマンドが実行できなかった場合はnilを返す
159
+ # @return [Result, nil] コマンド実行結果。コマンドが実行できなかった場合はnilを返す
184
160
  def eval
185
- command = BCDice::Preprocessor.process(@raw_input, @randomizer, self)
186
- upcased_command = command.upcase
161
+ command = BCDice::Preprocessor.process(@raw_input, self)
187
162
 
188
- result = dice_command(command)
189
- result ||= eval_common_command(upcased_command)
163
+ result = dice_command(command) || eval_common_command(@raw_input)
164
+ return nil unless result
165
+
166
+ result.rands = @randomizer.rand_results
167
+ result.detailed_rands = @randomizer.detailed_rand_results
190
168
 
191
169
  return result
192
170
  end
@@ -200,36 +178,43 @@ module BCDice
200
178
  end
201
179
 
202
180
  # @param total [Integer] コマンド合計値
203
- # @param dice_total [Integer] ダイス目の合計値
204
- # @param dice_list [Array<Integer>] ダイスの一覧
205
- # @param sides [Integer] 振ったダイスの面数
181
+ # @param rand_results [Array<CommonCommand::AddDice::Randomizer::RandResult>] ダイスの一覧
206
182
  # @param cmp_op [Symbol] 比較演算子
207
183
  # @param target [Integer, String] 目標値の整数か'?'
208
- # @return [String]
209
- def check_result(total, dice_total, dice_list, sides, cmp_op, target)
184
+ # @return [Result, nil]
185
+ def check_result(total, rand_results, cmp_op, target)
186
+ ret = check_result_legacy(total, rand_results, cmp_op, target)
187
+ return ret if ret
188
+
189
+ sides_list = rand_results.map(&:sides)
190
+ value_list = rand_results.map(&:value)
191
+ dice_total = value_list.sum()
192
+
210
193
  ret =
211
- case [dice_list.size, sides]
212
- when [1, 100]
213
- check_1D100(total, dice_total, cmp_op, target)
214
- when [1, 20]
215
- check_1D20(total, dice_total, cmp_op, target)
216
- when [2, 6]
217
- check_2D6(total, dice_total, dice_list, cmp_op, target)
194
+ case sides_list
195
+ when [100]
196
+ result_1d100(total, dice_total, cmp_op, target)
197
+ when [20]
198
+ result_1d20(total, dice_total, cmp_op, target)
199
+ when [6, 6]
200
+ result_2d6(total, dice_total, value_list, cmp_op, target)
218
201
  end
219
202
 
220
- return ret unless ret.nil? || ret.empty?
203
+ return nil if ret == Result.nothing
204
+ return ret if ret
221
205
 
222
206
  ret =
223
- case sides
224
- when 10
225
- check_nD10(total, dice_total, dice_list, cmp_op, target)
226
- when 6
227
- check_nD6(total, dice_total, dice_list, cmp_op, target)
207
+ case sides_list.uniq
208
+ when [10]
209
+ result_nd10(total, dice_total, value_list, cmp_op, target)
210
+ when [6]
211
+ result_nd6(total, dice_total, value_list, cmp_op, target)
228
212
  end
229
213
 
230
- return ret unless ret.nil? || ret.empty?
214
+ return nil if ret == Result.nothing
215
+ return ret if ret
231
216
 
232
- check_nDx(total, cmp_op, target)
217
+ return result_ndx(total, cmp_op, target)
233
218
  end
234
219
 
235
220
  # シャドウラン用グリッチ判定
@@ -242,12 +227,10 @@ module BCDice
242
227
  private
243
228
 
244
229
  def eval_common_command(command)
230
+ command = change_text(command)
245
231
  CommonCommand::COMMANDS.each do |klass|
246
- cmd = klass.new(command, @randomizer, self)
247
- out = cmd.eval()
248
-
249
- @is_secret = cmd.secret?
250
- return out if out
232
+ result = klass.eval(command, self, @randomizer)
233
+ return result if result
251
234
  end
252
235
 
253
236
  return nil
@@ -265,11 +248,17 @@ module BCDice
265
248
  command = command[1..-1] if secret # 先頭の 'S' をとる
266
249
 
267
250
  output = eval_game_system_specific_command(command)
268
- @is_secret ||= secret
269
- if output.nil? || output.empty? || output == "1"
251
+
252
+ if output.is_a?(Result)
253
+ output.secret = output.secret? || secret
254
+ return output
255
+ elsif output.nil? || output.empty? || output == "1"
270
256
  return nil
271
257
  else
272
- return output.to_s
258
+ return Result.new.tap do |r|
259
+ r.text = output.to_s
260
+ r.secret = secret
261
+ end
273
262
  end
274
263
  end
275
264
 
@@ -277,39 +266,31 @@ module BCDice
277
266
  # @return [String, nil]
278
267
  def eval_game_system_specific_command(command); end
279
268
 
280
- # 成功か失敗かを文字列で返す
269
+ # 成功か失敗か返す
281
270
  #
282
- # @param (see #check_result)
283
- # @return [String]
284
- def check_nDx(total, cmp_op, target)
285
- return " > 失敗" if target.is_a?(String)
286
-
287
- if total.send(cmp_op, target)
288
- " > 成功"
271
+ # @param total [Integer]
272
+ # @param cmp_op [Symbol]
273
+ # @param target [Number]
274
+ # @return [Result]
275
+ def result_ndx(total, cmp_op, target)
276
+ if target.is_a?(String)
277
+ nil
278
+ elsif total.send(cmp_op, target)
279
+ Result.success(translate("success"))
289
280
  else
290
- " > 失敗"
281
+ Result.failure(translate("failure"))
291
282
  end
292
283
  end
293
284
 
294
- # @param (see #check_result)
295
- # @return [nil]
296
- def check_1D100(total, dice_total, cmp_op, target); end
285
+ def result_1d100(total, dice_total, cmp_op, target); end
297
286
 
298
- # @param (see #check_result)
299
- # @return [nil]
300
- def check_1D20(total, dice_total, cmp_op, target); end
287
+ def result_1d20(total, dice_total, cmp_op, target); end
301
288
 
302
- # @param (see #check_result)
303
- # @return [nil]
304
- def check_nD10(total, dice_total, dice_list, cmp_op, target); end
289
+ def result_nd10(total, dice_total, value_list, cmp_op, target); end
305
290
 
306
- # @param (see #check_result)
307
- # @return [nil]
308
- def check_2D6(total, dice_total, dice_list, cmp_op, target); end
291
+ def result_2d6(total, dice_total, value_list, cmp_op, target); end
309
292
 
310
- # @param (see #check_result)
311
- # @return [nil]
312
- def check_nD6(total, dice_total, dice_list, cmp_op, target); end
293
+ def result_nd6(total, dice_total, value_list, cmp_op, target); end
313
294
 
314
295
  def get_table_by_2d6(table)
315
296
  get_table_by_nD6(table, 2)
@@ -421,3 +402,8 @@ module BCDice
421
402
  end
422
403
  end
423
404
  end
405
+
406
+ I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
407
+ I18n.load_path << Dir[File.join(__dir__, "../../i18n/**/*.yml")]
408
+ I18n.default_locale = :ja_jp
409
+ I18n.fallbacks.defaults = [:ja_jp]