bcdice 3.0.0.pre.alpha.2 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -1
  3. data/README.md +34 -7
  4. data/i18n/DetatokoSaga/ja_jp.yml +3 -2
  5. data/i18n/DetatokoSaga/ko_kr.yml +1 -0
  6. data/i18n/KillDeathBusiness/ja_jp.yml +4 -4
  7. data/i18n/KillDeathBusiness/ko_kr.yml +5 -4
  8. data/i18n/MagicaLogia/ko_kr.yml +564 -0
  9. data/i18n/MonotoneMuseum/ja_jp.yml +40 -4
  10. data/i18n/StratoShout/ja_jp.yml +4 -4
  11. data/i18n/StratoShout/ko_kr.yml +4 -4
  12. data/lib/bcdice.rb +4 -1
  13. data/lib/bcdice/arithmetic.rb +22 -0
  14. data/lib/bcdice/arithmetic/node.rb +112 -43
  15. data/lib/bcdice/arithmetic/parser.rb +240 -0
  16. data/lib/bcdice/arithmetic_evaluator.rb +7 -156
  17. data/lib/bcdice/base.rb +8 -1
  18. data/lib/bcdice/command/lexer.rb +57 -0
  19. data/lib/bcdice/command/parsed.rb +65 -0
  20. data/lib/bcdice/command/parser.rb +489 -0
  21. data/lib/bcdice/common_command.rb +2 -0
  22. data/lib/bcdice/common_command/add_dice.rb +3 -1
  23. data/lib/bcdice/common_command/add_dice/node.rb +142 -69
  24. data/lib/bcdice/common_command/add_dice/parser.rb +100 -83
  25. data/lib/bcdice/common_command/add_dice/randomizer.rb +2 -0
  26. data/lib/bcdice/common_command/barabara_dice.rb +2 -0
  27. data/lib/bcdice/common_command/barabara_dice/node.rb +9 -1
  28. data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
  29. data/lib/bcdice/common_command/calc.rb +2 -0
  30. data/lib/bcdice/common_command/calc/node.rb +10 -1
  31. data/lib/bcdice/common_command/calc/parser.rb +1 -1
  32. data/lib/bcdice/common_command/d66_dice.rb +5 -1
  33. data/lib/bcdice/common_command/lexer.rb +2 -1
  34. data/lib/bcdice/common_command/upper_dice.rb +2 -0
  35. data/lib/bcdice/common_command/upper_dice/parser.rb +118 -97
  36. data/lib/bcdice/common_command/version.rb +3 -1
  37. data/lib/bcdice/deprecated/checker.rb +6 -6
  38. data/lib/bcdice/dice_table.rb +3 -0
  39. data/lib/bcdice/dice_table/chain_table.rb +2 -0
  40. data/lib/bcdice/dice_table/d66_grid_table.rb +2 -0
  41. data/lib/bcdice/dice_table/d66_parity_table.rb +36 -0
  42. data/lib/bcdice/dice_table/d66_range_table.rb +2 -0
  43. data/lib/bcdice/dice_table/d66_table.rb +2 -0
  44. data/lib/bcdice/dice_table/roll_result.rb +2 -0
  45. data/lib/bcdice/dice_table/table.rb +2 -0
  46. data/lib/bcdice/enum.rb +2 -0
  47. data/lib/bcdice/format.rb +2 -0
  48. data/lib/bcdice/game_system.rb +10 -0
  49. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  50. data/lib/bcdice/game_system/AlchemiaStruggle.rb +346 -0
  51. data/lib/bcdice/game_system/Alshard.rb +1 -2
  52. data/lib/bcdice/game_system/Amadeus.rb +1 -1
  53. data/lib/bcdice/game_system/AngelGear.rb +123 -0
  54. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -5
  55. data/lib/bcdice/game_system/ArsMagica.rb +1 -1
  56. data/lib/bcdice/game_system/BBN.rb +7 -5
  57. data/lib/bcdice/game_system/BadLife.rb +2 -2
  58. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  59. data/lib/bcdice/game_system/BeastBindTrinity.rb +3 -12
  60. data/lib/bcdice/game_system/BeginningIdol.rb +4 -4
  61. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +4 -4
  62. data/lib/bcdice/game_system/BladeOfArcana.rb +4 -4
  63. data/lib/bcdice/game_system/BlindMythos.rb +12 -10
  64. data/lib/bcdice/game_system/BloodCrusade.rb +54 -80
  65. data/lib/bcdice/game_system/BloodMoon.rb +43 -2
  66. data/lib/bcdice/game_system/CardRanker.rb +24 -64
  67. data/lib/bcdice/game_system/ChaosFlare.rb +4 -4
  68. data/lib/bcdice/game_system/Chill.rb +1 -1
  69. data/lib/bcdice/game_system/CodeLayerd.rb +37 -67
  70. data/lib/bcdice/game_system/ColossalHunter.rb +2 -2
  71. data/lib/bcdice/game_system/Cthulhu.rb +8 -4
  72. data/lib/bcdice/game_system/Cthulhu7th.rb +42 -336
  73. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  74. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  75. data/lib/bcdice/game_system/CthulhuTech.rb +1 -2
  76. data/lib/bcdice/game_system/DarkBlaze.rb +5 -5
  77. data/lib/bcdice/game_system/DeadlineHeroes.rb +1 -1
  78. data/lib/bcdice/game_system/DesperateRun.rb +163 -0
  79. data/lib/bcdice/game_system/DetatokoSaga.rb +25 -7
  80. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +3 -3
  81. data/lib/bcdice/game_system/DiceBot.rb +22 -4
  82. data/lib/bcdice/game_system/DiceOfTheDead.rb +1 -1
  83. data/lib/bcdice/game_system/DoubleCross.rb +61 -94
  84. data/lib/bcdice/game_system/EarthDawn.rb +1 -1
  85. data/lib/bcdice/game_system/EarthDawn3.rb +1 -1
  86. data/lib/bcdice/game_system/EarthDawn4.rb +1 -1
  87. data/lib/bcdice/game_system/Elysion.rb +2 -2
  88. data/lib/bcdice/game_system/EmbryoMachine.rb +6 -6
  89. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +1 -2
  90. data/lib/bcdice/game_system/FilledWith.rb +3 -3
  91. data/lib/bcdice/game_system/FullMetalPanic.rb +1 -2
  92. data/lib/bcdice/game_system/GURPS.rb +1 -1
  93. data/lib/bcdice/game_system/Garako.rb +14 -5
  94. data/lib/bcdice/game_system/GardenOrder.rb +1 -1
  95. data/lib/bcdice/game_system/GehennaAn.rb +4 -4
  96. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  97. data/lib/bcdice/game_system/Gorilla.rb +1 -1
  98. data/lib/bcdice/game_system/Gundog.rb +1 -1
  99. data/lib/bcdice/game_system/GundogRevised.rb +3 -3
  100. data/lib/bcdice/game_system/GundogZero.rb +2 -2
  101. data/lib/bcdice/game_system/GurpsFW.rb +2 -5
  102. data/lib/bcdice/game_system/HarnMaster.rb +1 -1
  103. data/lib/bcdice/game_system/HatsuneMiku.rb +2 -2
  104. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  105. data/lib/bcdice/game_system/HuntersMoon.rb +17 -110
  106. data/lib/bcdice/game_system/Illusio.rb +25 -34
  107. data/lib/bcdice/game_system/InfiniteBabeL.rb +518 -0
  108. data/lib/bcdice/game_system/JekyllAndHyde.rb +42 -0
  109. data/lib/bcdice/game_system/JuinKansen.rb +251 -0
  110. data/lib/bcdice/game_system/KanColle.rb +17 -166
  111. data/lib/bcdice/game_system/KillDeathBusiness.rb +35 -44
  112. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +2 -1
  113. data/lib/bcdice/game_system/LogHorizon.rb +8 -8
  114. data/lib/bcdice/game_system/LostRoyal.rb +2 -4
  115. data/lib/bcdice/game_system/MagicaLogia.rb +3 -3
  116. data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
  117. data/lib/bcdice/game_system/MeikyuDays.rb +2 -2
  118. data/lib/bcdice/game_system/MeikyuKingdom.rb +3 -3
  119. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +3 -3
  120. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  121. data/lib/bcdice/game_system/MetallicGuardian.rb +1 -2
  122. data/lib/bcdice/game_system/MonotoneMuseum.rb +4 -3
  123. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +1 -1
  124. data/lib/bcdice/game_system/NSSQ.rb +2 -2
  125. data/lib/bcdice/game_system/Nechronica.rb +3 -3
  126. data/lib/bcdice/game_system/NeverCloud.rb +540 -5
  127. data/lib/bcdice/game_system/NightWizard.rb +2 -2
  128. data/lib/bcdice/game_system/NightWizard3rd.rb +1 -1
  129. data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
  130. data/lib/bcdice/game_system/NinjaSlayer.rb +30 -41
  131. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  132. data/lib/bcdice/game_system/OracleEngine.rb +14 -18
  133. data/lib/bcdice/game_system/OrgaRain.rb +17 -25
  134. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  135. data/lib/bcdice/game_system/ParanoiaRebooted.rb +1 -1
  136. data/lib/bcdice/game_system/Peekaboo.rb +1 -1
  137. data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
  138. data/lib/bcdice/game_system/Postman.rb +1 -1
  139. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  140. data/lib/bcdice/game_system/Raisondetre.rb +1 -1
  141. data/lib/bcdice/game_system/RecordOfLodossWar.rb +8 -7
  142. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  143. data/lib/bcdice/game_system/RokumonSekai2.rb +3 -3
  144. data/lib/bcdice/game_system/RuinBreakers.rb +1 -1
  145. data/lib/bcdice/game_system/RyuTuber.rb +6 -4
  146. data/lib/bcdice/game_system/Ryutama.rb +2 -2
  147. data/lib/bcdice/game_system/SRS.rb +1 -6
  148. data/lib/bcdice/game_system/SamsaraBallad.rb +5 -4
  149. data/lib/bcdice/game_system/Satasupe.rb +90 -865
  150. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  151. data/lib/bcdice/game_system/SevenFortressMobius.rb +1 -1
  152. data/lib/bcdice/game_system/SharedFantasia.rb +1 -1
  153. data/lib/bcdice/game_system/ShinkuuGakuen.rb +3 -3
  154. data/lib/bcdice/game_system/ShinobiGami.rb +75 -39
  155. data/lib/bcdice/game_system/ShoujoTenrankai.rb +1 -1
  156. data/lib/bcdice/game_system/Skynauts.rb +2 -2
  157. data/lib/bcdice/game_system/SteamPunkers.rb +7 -5
  158. data/lib/bcdice/game_system/StellarKnights.rb +1 -3
  159. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  160. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +2 -2
  161. data/lib/bcdice/game_system/StratoShout.rb +10 -36
  162. data/lib/bcdice/game_system/StratoShout_Korean.rb +2 -1
  163. data/lib/bcdice/game_system/SwordWorld.rb +46 -182
  164. data/lib/bcdice/game_system/SwordWorld2_0.rb +21 -149
  165. data/lib/bcdice/game_system/SwordWorld2_5.rb +126 -40
  166. data/lib/bcdice/game_system/TherapieSein.rb +2 -2
  167. data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
  168. data/lib/bcdice/game_system/Torg.rb +2 -2
  169. data/lib/bcdice/game_system/TorgEternity.rb +5 -8
  170. data/lib/bcdice/game_system/TrinitySeven.rb +2 -2
  171. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +7 -7
  172. data/lib/bcdice/game_system/TwilightGunsmoke.rb +2 -2
  173. data/lib/bcdice/game_system/UnsungDuet.rb +1 -1
  174. data/lib/bcdice/game_system/Utakaze.rb +2 -2
  175. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +1 -1
  176. data/lib/bcdice/game_system/Warhammer.rb +7 -7
  177. data/lib/bcdice/game_system/Warhammer4.rb +10 -13
  178. data/lib/bcdice/game_system/WorldOfDarkness.rb +1 -1
  179. data/lib/bcdice/game_system/YearZeroEngine.rb +1 -1
  180. data/lib/bcdice/game_system/Yggdrasill.rb +605 -0
  181. data/lib/bcdice/game_system/ZettaiReido.rb +2 -2
  182. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +294 -0
  183. data/lib/bcdice/game_system/cthulhu7th/rollable.rb +41 -0
  184. data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +2 -0
  185. data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +2 -0
  186. data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +2 -0
  187. data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +2 -0
  188. data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +2 -0
  189. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +2 -0
  190. data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +2 -0
  191. data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +2 -0
  192. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +2 -0
  193. data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +2 -0
  194. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +2 -0
  195. data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +2 -0
  196. data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +2 -0
  197. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +2 -0
  198. data/lib/bcdice/game_system/one_way_heroics/tables.rb +2 -0
  199. data/lib/bcdice/game_system/satasupe/tables.rb +723 -0
  200. data/lib/bcdice/game_system/sword_world/rating_lexer.rb +47 -0
  201. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +99 -0
  202. data/lib/bcdice/game_system/sword_world/rating_parser.rb +457 -0
  203. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +104 -0
  204. data/lib/bcdice/loader.rb +11 -4
  205. data/lib/bcdice/normalize.rb +3 -1
  206. data/lib/bcdice/preprocessor.rb +12 -8
  207. data/lib/bcdice/randomizer.rb +14 -0
  208. data/lib/bcdice/repl.rb +3 -1
  209. data/lib/bcdice/result.rb +4 -0
  210. data/lib/bcdice/translate.rb +2 -0
  211. data/lib/bcdice/user_defined_dice_table.rb +28 -15
  212. data/lib/bcdice/version.rb +3 -1
  213. metadata +28 -27
  214. data/.editorconfig +0 -21
  215. data/.github/.codecov.yaml +0 -10
  216. data/.github/workflows/coverage.yaml +0 -21
  217. data/.github/workflows/lint.yaml +0 -13
  218. data/.github/workflows/test.yml +0 -20
  219. data/.gitignore +0 -14
  220. data/.rubocop.yml +0 -108
  221. data/.rubocop_todo.yml +0 -114
  222. data/Gemfile +0 -14
  223. data/ROADMAP.md +0 -30
  224. data/Rakefile +0 -152
  225. data/bcdice.gemspec +0 -29
  226. data/bin/repl.rb +0 -21
  227. data/docs/README.txt +0 -2028
  228. data/docs/dicebot_sort_key.md +0 -72
  229. data/docs/how_to_make_dicebot.md +0 -453
  230. data/lib/bcdice/command_parser.rb +0 -242
  231. data/lib/bcdice/common_command/add_dice/parser.y +0 -153
  232. data/lib/bcdice/common_command/barabara_dice/parser.y +0 -107
  233. data/lib/bcdice/common_command/calc/parser.y +0 -79
  234. data/lib/bcdice/common_command/reroll_dice/parser.y +0 -158
  235. data/lib/bcdice/common_command/upper_dice/parser.y +0 -143
@@ -0,0 +1,104 @@
1
+ module BCDice
2
+ module GameSystem
3
+ class SwordWorld2_0 < SwordWorld
4
+ # 超越判定のノード
5
+ class TranscendentTest
6
+ # @param [Integer] critical_value クリティカル値
7
+ # @param [Integer] modifier 修正値
8
+ # @param [String, nil] cmp_op 比較演算子(> または >=)
9
+ # @param [Integer, nil] target 目標値
10
+ def initialize(critical_value, modifier, cmp_op, target)
11
+ @critical_value = critical_value
12
+ @modifier = modifier
13
+ @cmp_op = cmp_op
14
+ @target = target
15
+
16
+ @modifier_str = Format.modifier(@modifier)
17
+ @expression = node_expression()
18
+ end
19
+
20
+ # 超越判定を行う
21
+ # @param randomizer [Randomizer]
22
+ # @return [String]
23
+ def execute(randomizer)
24
+ if @critical_value < 3
25
+ return "(#{@expression}) > クリティカル値が小さすぎます。3以上を指定してください。"
26
+ end
27
+
28
+ first_value_group = randomizer.roll_barabara(2, 6)
29
+ value_groups = [first_value_group]
30
+
31
+ fumble = first_value_group == [1, 1]
32
+ critical = first_value_group == [6, 6]
33
+
34
+ if !fumble && !critical
35
+ while sum_of_dice(value_groups.last) >= @critical_value
36
+ value_groups.push(randomizer.roll_barabara(2, 6))
37
+ end
38
+ end
39
+
40
+ sum = sum_of_dice(value_groups)
41
+ total_sum = sum + @modifier
42
+
43
+ parts = [
44
+ "(#{@expression})",
45
+ "#{dice_str(value_groups, sum)}#{@modifier_str}",
46
+ total_sum,
47
+ @target && result_str(total_sum, value_groups.length, fumble, critical)
48
+ ].compact
49
+
50
+ return parts.join(" > ")
51
+ end
52
+
53
+ private
54
+
55
+ # 数式表記を返す
56
+ # @return [String]
57
+ def node_expression
58
+ lhs = "2D6@#{@critical_value}#{@modifier_str}"
59
+
60
+ return @target ? "#{lhs}#{@cmp_op}#{@target}" : lhs
61
+ end
62
+
63
+ # 出目の合計を返す
64
+ # @param [(Integer, Integer), Array<(Integer, Integer)>] value_groups
65
+ # 出目のグループまたはその配列
66
+ # @return [Integer]
67
+ def sum_of_dice(value_groups)
68
+ value_groups.flatten.sum
69
+ end
70
+
71
+ # ダイス部分の文字列を返す
72
+ # @param [Array<(Integer, Integer)>] value_groups 出目のグループの配列
73
+ # @param [Integer] sum 出目の合計
74
+ # @return [String]
75
+ def dice_str(value_groups, sum)
76
+ value_groups_str =
77
+ value_groups
78
+ .map { |values| "[#{values.join(',')}]" }
79
+ .join
80
+
81
+ return "#{sum}#{value_groups_str}"
82
+ end
83
+
84
+ # 判定結果の文字列を返す
85
+ # @param [Integer] total_sum 合計値
86
+ # @param [Integer] n_value_groups 出目のグループの数
87
+ # @param [Boolean] fumble ファンブルかどうか
88
+ # @param [Boolean] critical クリティカルかどうか
89
+ # @return [String]
90
+ def result_str(total_sum, n_value_groups, fumble, critical)
91
+ return "自動的失敗" if fumble
92
+ return "自動的成功" if critical
93
+
94
+ if total_sum.send(@cmp_op, @target)
95
+ # 振り足しが行われ、合計値が41以上ならば「超成功」
96
+ n_value_groups >= 2 && total_sum >= 41 ? "超成功" : "成功"
97
+ else
98
+ "失敗"
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
data/lib/bcdice/loader.rb CHANGED
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BCDice
2
4
  class << self
3
5
  # IDを指定してゲームシステムのクラスを取得する
6
+ # ゲームシステム一覧がロードされていなければロードする
4
7
  #
5
8
  # @param id [String] ID
6
9
  # @return [Class, nil]
@@ -8,18 +11,22 @@ module BCDice
8
11
  all_game_systems.find { |game_system| game_system::ID == id }
9
12
  end
10
13
 
11
- # 現在ロードされているゲームシステムのクラス一覧を返す
14
+ # ゲームシステムのクラス一覧を返す
15
+ # ゲームシステム一覧がロードされていなければロードする
12
16
  #
13
17
  # @return [Array<Class>]
14
18
  def all_game_systems()
19
+ require "bcdice/game_system"
15
20
  BCDice::GameSystem.constants.map { |class_name| BCDice::GameSystem.const_get(class_name) }
16
21
  end
17
22
 
18
- # クラス名を指定して対象のソースコードを動的にロードし、そのクラスを取得する
23
+ # IDを指定して対象のソースコードを動的にロードし、そのクラスを取得する
19
24
  #
20
- # @param class_name [String] クラス名
25
+ # @param id [String] ID
21
26
  # @return [Class, nil]
22
- def dynamic_load(class_name)
27
+ def dynamic_load(id)
28
+ class_name = id.tr(":.", "_")
29
+
23
30
  # 対象ディレクトリの外にあるファイルをロードされないように制約を設ける
24
31
  unless /\A[A-Z]\w*\z/.match?(class_name)
25
32
  return nil
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BCDice
2
4
  module Normalize
3
5
  module_function
@@ -18,7 +20,7 @@ module BCDice
18
20
  :<
19
21
  when />/
20
22
  :>
21
- when /\=/
23
+ when /=/
22
24
  :==
23
25
  end
24
26
  end
@@ -29,7 +29,7 @@ module BCDice
29
29
 
30
30
  @text = @game_system.change_text(@text)
31
31
 
32
- replace_implicit_d6()
32
+ replace_implicit_d()
33
33
 
34
34
  return @text
35
35
  end
@@ -45,18 +45,22 @@ module BCDice
45
45
  def replace_parentheses
46
46
  loop do
47
47
  prev = @text
48
- @text = @text.gsub(%r{\([\d/\+\*\-]+\)}) do |expr|
49
- ae = ArithmeticEvaluator.new(expr, round_type: @game_system.round_type)
50
- val = ae.eval
51
- ae.error? ? expr : val
48
+ @text = @text.gsub(%r{\([\d/+*\-CURF]+\)}) do |expr|
49
+ Arithmetic.eval(expr, @game_system.round_type) || expr
52
50
  end
53
51
  break if prev == @text
54
52
  end
55
53
  end
56
54
 
57
- # nDをnD6に置き換える
58
- def replace_implicit_d6
59
- @text = @text.gsub(/(\d+)D([^\w]|$)/i) { "#{Regexp.last_match(1)}D6#{Regexp.last_match(2)}" }
55
+ # nDをゲームシステムに応じて置き換える
56
+ def replace_implicit_d
57
+ @text = @text.gsub(/(\d+)D([^\w]|$)/i) do
58
+ times = Regexp.last_match(1)
59
+ sides = @game_system.sides_implicit_d
60
+ trailer = Regexp.last_match(2)
61
+
62
+ "#{times}D#{sides}#{trailer}"
63
+ end
60
64
  end
61
65
  end
62
66
  end
@@ -1,9 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BCDice
2
4
  # 乱数生成器
3
5
  class Randomizer
4
6
  UPPER_LIMIT_DICE_TIMES = 200
5
7
  UPPER_LIMIT_DICE_SIDES = 1000
6
8
 
9
+ UPPER_LIMIT_RANDS = 10000
10
+
7
11
  def initialize
8
12
  @rand_results = []
9
13
  @detailed_rand_results = []
@@ -30,6 +34,10 @@ module BCDice
30
34
  # @param sides [Integer] ダイスの面数
31
35
  # @return [Array<Integer>] ダイスの出目一覧
32
36
  def roll_barabara(times, sides)
37
+ if @rand_results.size + times > UPPER_LIMIT_RANDS
38
+ raise TooManyRandsError
39
+ end
40
+
33
41
  if times <= 0 || times > UPPER_LIMIT_DICE_TIMES
34
42
  return []
35
43
  end
@@ -113,6 +121,10 @@ module BCDice
113
121
  # @param sides [Integer]
114
122
  # @return [Integer] 1以上sides以下の整数
115
123
  def rand_inner(sides)
124
+ if @rand_results.size >= UPPER_LIMIT_RANDS
125
+ raise TooManyRandsError
126
+ end
127
+
116
128
  dice = random(sides)
117
129
 
118
130
  @rand_results << [dice, sides]
@@ -134,4 +146,6 @@ module BCDice
134
146
  @detailed_rand_results.push(detail)
135
147
  end
136
148
  end
149
+
150
+ class TooManyRandsError < StandardError; end
137
151
  end
data/lib/bcdice/repl.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bcdice"
2
4
  require "readline"
3
5
 
@@ -99,7 +101,7 @@ module BCDice
99
101
  if block
100
102
  instance_exec(*args, &block)
101
103
  else
102
- eval_game_system(command)
104
+ eval_game_system(input)
103
105
  end
104
106
  end
105
107
 
data/lib/bcdice/result.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BCDice
2
4
  class Result
3
5
  class << self
@@ -38,6 +40,8 @@ module BCDice
38
40
 
39
41
  def initialize(text = nil)
40
42
  @text = text
43
+ @rands = nil
44
+ @detailed_rands = nil
41
45
  @secret = false
42
46
  @success = false
43
47
  @failure = false
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BCDice
2
4
  # i18n用のモジュール
3
5
  module Translate
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BCDice
2
4
  # テキストで定義したダイス表を実行するクラス
3
5
  #
@@ -14,25 +16,32 @@ module BCDice
14
16
  # TEXT
15
17
  # table = BCDice::UserDefinedDiceTable.new(text)
16
18
  # table.valid?() #=> true
17
- # table.roll() #=> "飲み物表(6) > 選ばれし者の知的飲料"
19
+ # table.roll().text #=> "飲み物表(6) > 選ばれし者の知的飲料"
20
+ # BCDice::UserDefinedDiceTable.eval(text) #=> #<BCDice::Result>
18
21
  #
19
22
  class UserDefinedDiceTable
23
+ class << self
24
+ # @param text [String]
25
+ # @return [Result nil]
26
+ def roll(text)
27
+ new(text).roll()
28
+ end
29
+ end
30
+
20
31
  # @param text [String] ダイス表のテキストデータ
21
32
  def initialize(text)
22
33
  @text = text
23
- @randomizer = Randomizer.new
24
34
  @rows = nil
25
35
  end
26
36
 
27
- # @return [Randomizer]
28
- attr_accessor :randomizer
29
-
30
37
  # ダイス表をロールする
31
- # @return [String, nil]
32
- def roll
38
+ # @param randomizer [Randomizer]
39
+ # @return [Result, nil]
40
+ def roll(randomizer: Randomizer.new)
33
41
  parse()
34
- index = roll_index()
35
- unless index
42
+
43
+ index = roll_index(randomizer)
44
+ unless valid? && index
36
45
  return nil
37
46
  end
38
47
 
@@ -43,7 +52,11 @@ module BCDice
43
52
  end
44
53
 
45
54
  chosen = row.delete_prefix(key).gsub('\n', "\n").strip
46
- return "#{@name}(#{index}) > #{chosen}"
55
+ Result.new.tap do |r|
56
+ r.text = "#{@name}(#{index}) > #{chosen}"
57
+ r.rands = randomizer.rand_results
58
+ r.detailed_rands = randomizer.detailed_rand_results
59
+ end
47
60
  end
48
61
 
49
62
  # 有効なダイス表かをチェックする。テキスト形式のミスだけではなく、抜けている出目や範囲外の出目がないか確認する。
@@ -75,20 +88,20 @@ module BCDice
75
88
  private
76
89
 
77
90
  # @return [Integer, nil]
78
- def roll_index
91
+ def roll_index(randomizer)
79
92
  if (m = /^(\d+)D(\d+)$/.match(@type))
80
93
  times = m[1].to_i
81
94
  sides = m[2].to_i
82
- return @randomizer.roll_sum(times, sides)
95
+ return randomizer.roll_sum(times, sides)
83
96
  end
84
97
 
85
98
  case @type
86
99
  when "D66", "D66N"
87
- @randomizer.roll_d66(D66SortType::NO_SORT)
100
+ randomizer.roll_d66(D66SortType::NO_SORT)
88
101
  when "D66A", "D66S"
89
- @randomizer.roll_d66(D66SortType::ASC)
102
+ randomizer.roll_d66(D66SortType::ASC)
90
103
  when "D66D"
91
- @randomizer.roll_d66(D66SortType::DESC)
104
+ randomizer.roll_d66(D66SortType::DESC)
92
105
  end
93
106
  end
94
107
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BCDice
2
- VERSION = "3.0.0-alpha.2".freeze
4
+ VERSION = "3.1.1"
3
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcdice
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.pre.alpha.2
4
+ version: 3.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - SAKATA Sinji
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-20 00:00:00.000000000 Z
11
+ date: 2021-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -31,25 +31,9 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
- - ".editorconfig"
35
- - ".github/.codecov.yaml"
36
- - ".github/workflows/coverage.yaml"
37
- - ".github/workflows/lint.yaml"
38
- - ".github/workflows/test.yml"
39
- - ".gitignore"
40
- - ".rubocop.yml"
41
- - ".rubocop_todo.yml"
42
34
  - CHANGELOG.md
43
- - Gemfile
44
35
  - LICENSE
45
36
  - README.md
46
- - ROADMAP.md
47
- - Rakefile
48
- - bcdice.gemspec
49
- - bin/repl.rb
50
- - docs/README.txt
51
- - docs/dicebot_sort_key.md
52
- - docs/how_to_make_dicebot.md
53
37
  - i18n/Amadeus/ja_jp.yml
54
38
  - i18n/Amadeus/ko_kr.yml
55
39
  - i18n/Cthulhu/ja_jp.yml
@@ -74,6 +58,7 @@ files:
74
58
  - i18n/LogHorizon/ja_jp.yml
75
59
  - i18n/LogHorizon/ko_kr.yml
76
60
  - i18n/MagicaLogia/ja_jp.yml
61
+ - i18n/MagicaLogia/ko_kr.yml
77
62
  - i18n/MonotoneMuseum/ja_jp.yml
78
63
  - i18n/MonotoneMuseum/ko_kr.yml
79
64
  - i18n/Nechronica/ja_jp.yml
@@ -84,24 +69,26 @@ files:
84
69
  - i18n/ko_kr.yml
85
70
  - i18n/zh_hant.yml
86
71
  - lib/bcdice.rb
72
+ - lib/bcdice/arithmetic.rb
87
73
  - lib/bcdice/arithmetic/node.rb
74
+ - lib/bcdice/arithmetic/parser.rb
88
75
  - lib/bcdice/arithmetic_evaluator.rb
89
76
  - lib/bcdice/base.rb
90
- - lib/bcdice/command_parser.rb
77
+ - lib/bcdice/command/lexer.rb
78
+ - lib/bcdice/command/parsed.rb
79
+ - lib/bcdice/command/parser.rb
91
80
  - lib/bcdice/common_command.rb
92
81
  - lib/bcdice/common_command/add_dice.rb
93
82
  - lib/bcdice/common_command/add_dice/node.rb
94
83
  - lib/bcdice/common_command/add_dice/parser.rb
95
- - lib/bcdice/common_command/add_dice/parser.y
96
84
  - lib/bcdice/common_command/add_dice/randomizer.rb
97
85
  - lib/bcdice/common_command/barabara_dice.rb
98
86
  - lib/bcdice/common_command/barabara_dice/node.rb
99
87
  - lib/bcdice/common_command/barabara_dice/parser.rb
100
- - lib/bcdice/common_command/barabara_dice/parser.y
88
+ - lib/bcdice/common_command/barabara_dice/result.rb
101
89
  - lib/bcdice/common_command/calc.rb
102
90
  - lib/bcdice/common_command/calc/node.rb
103
91
  - lib/bcdice/common_command/calc/parser.rb
104
- - lib/bcdice/common_command/calc/parser.y
105
92
  - lib/bcdice/common_command/choice.rb
106
93
  - lib/bcdice/common_command/d66_dice.rb
107
94
  - lib/bcdice/common_command/lexer.rb
@@ -109,16 +96,15 @@ files:
109
96
  - lib/bcdice/common_command/reroll_dice.rb
110
97
  - lib/bcdice/common_command/reroll_dice/node.rb
111
98
  - lib/bcdice/common_command/reroll_dice/parser.rb
112
- - lib/bcdice/common_command/reroll_dice/parser.y
113
99
  - lib/bcdice/common_command/upper_dice.rb
114
100
  - lib/bcdice/common_command/upper_dice/node.rb
115
101
  - lib/bcdice/common_command/upper_dice/parser.rb
116
- - lib/bcdice/common_command/upper_dice/parser.y
117
102
  - lib/bcdice/common_command/version.rb
118
103
  - lib/bcdice/deprecated/checker.rb
119
104
  - lib/bcdice/dice_table.rb
120
105
  - lib/bcdice/dice_table/chain_table.rb
121
106
  - lib/bcdice/dice_table/d66_grid_table.rb
107
+ - lib/bcdice/dice_table/d66_parity_table.rb
122
108
  - lib/bcdice/dice_table/d66_range_table.rb
123
109
  - lib/bcdice/dice_table/d66_table.rb
124
110
  - lib/bcdice/dice_table/range_table.rb
@@ -133,11 +119,13 @@ files:
133
119
  - lib/bcdice/game_system/AFF2e.rb
134
120
  - lib/bcdice/game_system/AceKillerGene.rb
135
121
  - lib/bcdice/game_system/Airgetlamh.rb
122
+ - lib/bcdice/game_system/AlchemiaStruggle.rb
136
123
  - lib/bcdice/game_system/Alsetto.rb
137
124
  - lib/bcdice/game_system/Alshard.rb
138
125
  - lib/bcdice/game_system/AlterRaise.rb
139
126
  - lib/bcdice/game_system/Amadeus.rb
140
127
  - lib/bcdice/game_system/Amadeus_Korean.rb
128
+ - lib/bcdice/game_system/AngelGear.rb
141
129
  - lib/bcdice/game_system/AnimaAnimus.rb
142
130
  - lib/bcdice/game_system/Arianrhod.rb
143
131
  - lib/bcdice/game_system/ArsMagica.rb
@@ -173,6 +161,7 @@ files:
173
161
  - lib/bcdice/game_system/DarkSouls.rb
174
162
  - lib/bcdice/game_system/DeadlineHeroes.rb
175
163
  - lib/bcdice/game_system/DemonParasite.rb
164
+ - lib/bcdice/game_system/DesperateRun.rb
176
165
  - lib/bcdice/game_system/DetatokoSaga.rb
177
166
  - lib/bcdice/game_system/DetatokoSaga_Korean.rb
178
167
  - lib/bcdice/game_system/DiceBot.rb
@@ -217,11 +206,14 @@ files:
217
206
  - lib/bcdice/game_system/HouraiGakuen.rb
218
207
  - lib/bcdice/game_system/HuntersMoon.rb
219
208
  - lib/bcdice/game_system/Illusio.rb
209
+ - lib/bcdice/game_system/InfiniteBabeL.rb
220
210
  - lib/bcdice/game_system/InfiniteFantasia.rb
221
211
  - lib/bcdice/game_system/Insane.rb
222
212
  - lib/bcdice/game_system/Insane_Korean.rb
223
213
  - lib/bcdice/game_system/IthaWenUa.rb
224
214
  - lib/bcdice/game_system/JamesBond.rb
215
+ - lib/bcdice/game_system/JekyllAndHyde.rb
216
+ - lib/bcdice/game_system/JuinKansen.rb
225
217
  - lib/bcdice/game_system/Kamigakari.rb
226
218
  - lib/bcdice/game_system/Kamigakari_Korean.rb
227
219
  - lib/bcdice/game_system/KanColle.rb
@@ -235,6 +227,7 @@ files:
235
227
  - lib/bcdice/game_system/LostRecord.rb
236
228
  - lib/bcdice/game_system/LostRoyal.rb
237
229
  - lib/bcdice/game_system/MagicaLogia.rb
230
+ - lib/bcdice/game_system/MagicaLogia_Korean.rb
238
231
  - lib/bcdice/game_system/MeikyuDays.rb
239
232
  - lib/bcdice/game_system/MeikyuKingdom.rb
240
233
  - lib/bcdice/game_system/MeikyuKingdomBasic.rb
@@ -322,7 +315,10 @@ files:
322
315
  - lib/bcdice/game_system/WorldOfDarkness.rb
323
316
  - lib/bcdice/game_system/YankeeYogSothoth.rb
324
317
  - lib/bcdice/game_system/YearZeroEngine.rb
318
+ - lib/bcdice/game_system/Yggdrasill.rb
325
319
  - lib/bcdice/game_system/ZettaiReido.rb
320
+ - lib/bcdice/game_system/cthulhu7th/full_auto.rb
321
+ - lib/bcdice/game_system/cthulhu7th/rollable.rb
326
322
  - lib/bcdice/game_system/filled_with/cook_tables.rb
327
323
  - lib/bcdice/game_system/filled_with/lot_tables.rb
328
324
  - lib/bcdice/game_system/meikyu_kingdom/item_table.rb
@@ -340,6 +336,11 @@ files:
340
336
  - lib/bcdice/game_system/one_way_heroics/dungeon_table.rb
341
337
  - lib/bcdice/game_system/one_way_heroics/random_event_table.rb
342
338
  - lib/bcdice/game_system/one_way_heroics/tables.rb
339
+ - lib/bcdice/game_system/satasupe/tables.rb
340
+ - lib/bcdice/game_system/sword_world/rating_lexer.rb
341
+ - lib/bcdice/game_system/sword_world/rating_parsed.rb
342
+ - lib/bcdice/game_system/sword_world/rating_parser.rb
343
+ - lib/bcdice/game_system/sword_world/transcendent_test.rb
343
344
  - lib/bcdice/loader.rb
344
345
  - lib/bcdice/normalize.rb
345
346
  - lib/bcdice/preprocessor.rb
@@ -351,7 +352,7 @@ files:
351
352
  - lib/bcdice/version.rb
352
353
  homepage: https://bcdice.org
353
354
  licenses:
354
- - MIT
355
+ - BSD-3-Clause
355
356
  metadata:
356
357
  allowed_push_host: https://rubygems.org/
357
358
  homepage_uri: https://bcdice.org
@@ -368,9 +369,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
368
369
  version: '2.5'
369
370
  required_rubygems_version: !ruby/object:Gem::Requirement
370
371
  requirements:
371
- - - ">"
372
+ - - ">="
372
373
  - !ruby/object:Gem::Version
373
- version: 1.3.1
374
+ version: '0'
374
375
  requirements: []
375
376
  rubyforge_project:
376
377
  rubygems_version: 2.7.6.2