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

Sign up to get free protection for your applications and to get access to all the features.
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]