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

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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +1 -0
  4. data/i18n/KillDeathBusiness/ja_jp.yml +4 -4
  5. data/i18n/KillDeathBusiness/ko_kr.yml +5 -4
  6. data/i18n/MagicaLogia/ko_kr.yml +564 -0
  7. data/i18n/MonotoneMuseum/ja_jp.yml +37 -1
  8. data/i18n/StratoShout/ja_jp.yml +4 -4
  9. data/i18n/StratoShout/ko_kr.yml +4 -4
  10. data/lib/bcdice.rb +2 -1
  11. data/lib/bcdice/arithmetic.rb +22 -0
  12. data/lib/bcdice/arithmetic/node.rb +112 -43
  13. data/lib/bcdice/arithmetic/parser.rb +240 -0
  14. data/lib/bcdice/arithmetic_evaluator.rb +5 -156
  15. data/lib/bcdice/base.rb +8 -1
  16. data/lib/bcdice/command/lexer.rb +57 -0
  17. data/lib/bcdice/command/parsed.rb +65 -0
  18. data/lib/bcdice/command/parser.rb +489 -0
  19. data/lib/bcdice/common_command/add_dice.rb +1 -1
  20. data/lib/bcdice/common_command/add_dice/node.rb +142 -69
  21. data/lib/bcdice/common_command/add_dice/parser.rb +100 -83
  22. data/lib/bcdice/common_command/barabara_dice/node.rb +7 -1
  23. data/lib/bcdice/common_command/barabara_dice/result.rb +22 -0
  24. data/lib/bcdice/common_command/calc/node.rb +10 -1
  25. data/lib/bcdice/common_command/calc/parser.rb +1 -1
  26. data/lib/bcdice/common_command/d66_dice.rb +3 -1
  27. data/lib/bcdice/common_command/lexer.rb +2 -1
  28. data/lib/bcdice/common_command/upper_dice/parser.rb +118 -97
  29. data/lib/bcdice/common_command/version.rb +1 -1
  30. data/lib/bcdice/deprecated/checker.rb +6 -6
  31. data/lib/bcdice/dice_table.rb +1 -0
  32. data/lib/bcdice/dice_table/d66_parity_table.rb +34 -0
  33. data/lib/bcdice/game_system.rb +3 -0
  34. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  35. data/lib/bcdice/game_system/AlchemiaStruggle.rb +312 -0
  36. data/lib/bcdice/game_system/Alshard.rb +0 -1
  37. data/lib/bcdice/game_system/Amadeus.rb +1 -1
  38. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -5
  39. data/lib/bcdice/game_system/BadLife.rb +1 -1
  40. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -10
  41. data/lib/bcdice/game_system/BeginningIdol.rb +4 -4
  42. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +4 -4
  43. data/lib/bcdice/game_system/BladeOfArcana.rb +4 -4
  44. data/lib/bcdice/game_system/BlindMythos.rb +12 -9
  45. data/lib/bcdice/game_system/BloodCrusade.rb +12 -38
  46. data/lib/bcdice/game_system/BloodMoon.rb +2 -2
  47. data/lib/bcdice/game_system/CardRanker.rb +23 -63
  48. data/lib/bcdice/game_system/ChaosFlare.rb +3 -3
  49. data/lib/bcdice/game_system/CodeLayerd.rb +1 -1
  50. data/lib/bcdice/game_system/ColossalHunter.rb +2 -2
  51. data/lib/bcdice/game_system/Cthulhu7th.rb +2 -2
  52. data/lib/bcdice/game_system/CthulhuTech.rb +0 -1
  53. data/lib/bcdice/game_system/DarkBlaze.rb +4 -4
  54. data/lib/bcdice/game_system/DeadlineHeroes.rb +1 -1
  55. data/lib/bcdice/game_system/DoubleCross.rb +60 -93
  56. data/lib/bcdice/game_system/EmbryoMachine.rb +5 -5
  57. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +0 -1
  58. data/lib/bcdice/game_system/FilledWith.rb +3 -3
  59. data/lib/bcdice/game_system/FullMetalPanic.rb +0 -1
  60. data/lib/bcdice/game_system/GURPS.rb +1 -1
  61. data/lib/bcdice/game_system/Garako.rb +3 -2
  62. data/lib/bcdice/game_system/GardenOrder.rb +1 -1
  63. data/lib/bcdice/game_system/GehennaAn.rb +3 -3
  64. data/lib/bcdice/game_system/Gundog.rb +1 -1
  65. data/lib/bcdice/game_system/GundogRevised.rb +3 -3
  66. data/lib/bcdice/game_system/GundogZero.rb +2 -2
  67. data/lib/bcdice/game_system/GurpsFW.rb +2 -5
  68. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  69. data/lib/bcdice/game_system/HuntersMoon.rb +17 -110
  70. data/lib/bcdice/game_system/JuinKansen.rb +251 -0
  71. data/lib/bcdice/game_system/KanColle.rb +17 -166
  72. data/lib/bcdice/game_system/KillDeathBusiness.rb +35 -44
  73. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +2 -1
  74. data/lib/bcdice/game_system/LogHorizon.rb +8 -8
  75. data/lib/bcdice/game_system/LostRoyal.rb +1 -3
  76. data/lib/bcdice/game_system/MagicaLogia.rb +3 -3
  77. data/lib/bcdice/game_system/MagicaLogia_Korean.rb +66 -0
  78. data/lib/bcdice/game_system/MeikyuDays.rb +1 -1
  79. data/lib/bcdice/game_system/MeikyuKingdom.rb +1 -1
  80. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +1 -1
  81. data/lib/bcdice/game_system/MetalHeadExtream.rb +4 -4
  82. data/lib/bcdice/game_system/MetallicGuardian.rb +0 -1
  83. data/lib/bcdice/game_system/MonotoneMuseum.rb +3 -2
  84. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +1 -1
  85. data/lib/bcdice/game_system/NSSQ.rb +2 -2
  86. data/lib/bcdice/game_system/Nechronica.rb +3 -3
  87. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  88. data/lib/bcdice/game_system/NightmareHunterDeep.rb +3 -4
  89. data/lib/bcdice/game_system/NinjaSlayer.rb +26 -28
  90. data/lib/bcdice/game_system/OracleEngine.rb +13 -17
  91. data/lib/bcdice/game_system/Paradiso.rb +2 -2
  92. data/lib/bcdice/game_system/PhantasmAdventure.rb +0 -4
  93. data/lib/bcdice/game_system/Raisondetre.rb +1 -1
  94. data/lib/bcdice/game_system/RecordOfLodossWar.rb +2 -3
  95. data/lib/bcdice/game_system/RokumonSekai2.rb +2 -2
  96. data/lib/bcdice/game_system/RuinBreakers.rb +1 -1
  97. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  98. data/lib/bcdice/game_system/SRS.rb +0 -5
  99. data/lib/bcdice/game_system/SamsaraBallad.rb +4 -3
  100. data/lib/bcdice/game_system/Satasupe.rb +22 -14
  101. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  102. data/lib/bcdice/game_system/ShinkuuGakuen.rb +1 -1
  103. data/lib/bcdice/game_system/ShinobiGami.rb +75 -39
  104. data/lib/bcdice/game_system/StellarKnights.rb +1 -3
  105. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  106. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
  107. data/lib/bcdice/game_system/StratoShout.rb +10 -36
  108. data/lib/bcdice/game_system/StratoShout_Korean.rb +2 -1
  109. data/lib/bcdice/game_system/SwordWorld.rb +5 -5
  110. data/lib/bcdice/game_system/SwordWorld2_5.rb +1 -1
  111. data/lib/bcdice/game_system/TherapieSein.rb +2 -2
  112. data/lib/bcdice/game_system/TokumeiTenkousei.rb +2 -2
  113. data/lib/bcdice/game_system/Torg.rb +1 -1
  114. data/lib/bcdice/game_system/TorgEternity.rb +4 -7
  115. data/lib/bcdice/game_system/TrinitySeven.rb +2 -2
  116. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +6 -6
  117. data/lib/bcdice/game_system/TwilightGunsmoke.rb +1 -1
  118. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  119. data/lib/bcdice/game_system/Warhammer.rb +6 -6
  120. data/lib/bcdice/game_system/Warhammer4.rb +9 -12
  121. data/lib/bcdice/game_system/ZettaiReido.rb +1 -1
  122. data/lib/bcdice/normalize.rb +1 -1
  123. data/lib/bcdice/preprocessor.rb +12 -8
  124. data/lib/bcdice/randomizer.rb +12 -0
  125. data/lib/bcdice/repl.rb +1 -1
  126. data/lib/bcdice/result.rb +2 -0
  127. data/lib/bcdice/user_defined_dice_table.rb +26 -15
  128. data/lib/bcdice/version.rb +1 -1
  129. metadata +14 -25
  130. data/.editorconfig +0 -21
  131. data/.github/.codecov.yaml +0 -10
  132. data/.github/workflows/coverage.yaml +0 -21
  133. data/.github/workflows/lint.yaml +0 -13
  134. data/.github/workflows/test.yml +0 -20
  135. data/.gitignore +0 -14
  136. data/.rubocop.yml +0 -108
  137. data/.rubocop_todo.yml +0 -114
  138. data/Gemfile +0 -14
  139. data/ROADMAP.md +0 -30
  140. data/Rakefile +0 -152
  141. data/bcdice.gemspec +0 -29
  142. data/bin/repl.rb +0 -21
  143. data/docs/README.txt +0 -2028
  144. data/docs/dicebot_sort_key.md +0 -72
  145. data/docs/how_to_make_dicebot.md +0 -453
  146. data/lib/bcdice/command_parser.rb +0 -242
  147. data/lib/bcdice/common_command/add_dice/parser.y +0 -153
  148. data/lib/bcdice/common_command/barabara_dice/parser.y +0 -107
  149. data/lib/bcdice/common_command/calc/parser.y +0 -79
  150. data/lib/bcdice/common_command/reroll_dice/parser.y +0 -158
  151. data/lib/bcdice/common_command/upper_dice/parser.y +0 -143
@@ -53,7 +53,7 @@ module BCDice
53
53
  end
54
54
 
55
55
  def amadeusDice(command)
56
- return nil unless /^(R([A-DS])([\+\-\d]*))(@(\d))?((>(=)?)([\+\-\d]*))?(@(\d))?$/i =~ command
56
+ return nil unless /^(R([A-DS])([+\-\d]*))(@(\d))?((>(=)?)([+\-\d]*))?(@(\d))?$/i =~ command
57
57
 
58
58
  commandText = Regexp.last_match(1)
59
59
  skillRank = Regexp.last_match(2)
@@ -31,13 +31,9 @@ module BCDice
31
31
   情報収集表 IGT/喪失表 LT
32
32
  MESSAGETEXT
33
33
 
34
- def initialize(command)
35
- super(command)
36
- end
37
-
38
34
  def eval_game_system_specific_command(command)
39
35
  case command
40
- when /(\d+)AN<=(\d+([\+\-]\d+)*)/i
36
+ when /(\d+)AN<=(\d+([+\-]\d+)*)/i
41
37
  return check_action(Regexp.last_match)
42
38
  else
43
39
  return roll_tables(command, TABLES)
@@ -65,7 +65,7 @@ module BCDice
65
65
  end
66
66
 
67
67
  def judgeDice(command)
68
- unless (m = /(\d+)?(BAD|BL|GL)([-+\d]*)((C|F)([-+\d]*)?)?((C|F)([-+\d]*))?(\@([-+\d]*))?(\!(\D*))?/i.match(command))
68
+ unless (m = /(\d+)?(BAD|BL|GL)([-+\d]*)((C|F)([-+\d]*)?)?((C|F)([-+\d]*))?(@([-+\d]*))?(!(\D*))?/i.match(command))
69
69
  return nil
70
70
  end
71
71
 
@@ -6,15 +6,6 @@ require 'bcdice/normalize'
6
6
  require 'bcdice/dice_table/table'
7
7
  require 'bcdice/dice_table/d66_grid_table'
8
8
 
9
- # ビーストバインド トリニティのダイスボット
10
- #
11
- # = 前ver(1.43.07)からの変更・修正
12
- # * nBBで判定を行う際、「ダイスを1個しか振らない場合」の達成値計算が正しくなかった誤りを修正。
13
- # * @x(クリティカル値指定)、を加減式で入力できるように仕様変更。クリティカル値は、加減式での入力なら%w(人間性からのクリティカル値計算)と併用可能に。
14
- # * #y(ファンブル値指定)を加減式で入力できるように仕様変更。また、「ファンブルしても達成値が0にならない」モード#Ayを追加。
15
- # * &v(出目v未満のダイスを出目vとして扱う)のモードを追加。2018年12月現在、ゲーマーズ・フィールド誌先行収録データでのみ使用するモードです。
16
- # * 「暴露表」および「正体判明チャート」をダイスボットに組み込み。
17
- # * どどんとふ以外のボーンズ&カーズを用いたオンラインセッション用ツールにあわせ、ヘルプメッセージ部分からイニシアティブ表についての言及を削除。
18
9
  module BCDice
19
10
  module GameSystem
20
11
  class BeastBindTrinity < Base
@@ -106,7 +97,7 @@ module BCDice
106
97
  private
107
98
 
108
99
  def parse()
109
- m = /^(\d+)(?:R6|BB6?)((?:[\+\-]\d+)+)?(?:%(\-?\d+))?(?:@([\+\-\d]+))?(?:#(A)?([\+\-\d]+))?(?:\$([1-6]+))?(?:&([1-6]))?(?:([>=]+)(\d+))?$/.match(@command)
100
+ m = /^(\d+)(?:R6|BB6?)((?:[+\-]\d+)+)?(?:%(-?\d+))?(?:@([+\-\d]+))?(?:#(A)?([+\-\d]+))?(?:\$([1-6]+))?(?:&([1-6]))?(?:([>=]+)(\d+))?$/.match(@command)
110
101
  unless m
111
102
  @parse_error = true
112
103
  return
@@ -170,7 +170,7 @@ module BCDice
170
170
 
171
171
  def eval_game_system_specific_command(command)
172
172
  case command.upcase
173
- when /^([1-7]*)PD(\d+)([\+\-]\d+)?$/
173
+ when /^([1-7]*)PD(\d+)([+\-]\d+)?$/
174
174
  counts = Regexp.last_match(2).to_i
175
175
  return nil if counts <= 0
176
176
 
@@ -1951,7 +1951,7 @@ module BCDice
1951
1951
  ]
1952
1952
  return textFrom1D6Table(title, table)
1953
1953
 
1954
- when /^(\d+)(S?)A([1-6]*)([\+\-]\d+)?$/
1954
+ when /^(\d+)(S?)A([1-6]*)([+\-]\d+)?$/
1955
1955
  title = '攻撃'
1956
1956
  counts = Regexp.last_match(1).to_i
1957
1957
  return nil if counts <= 0
@@ -2261,7 +2261,7 @@ module BCDice
2261
2261
  return text, skill unless text =~ /チャンスが(\d{1,2})以下ならオフ。/
2262
2262
 
2263
2263
  target = Regexp.last_match(1).to_i
2264
- matchedText = $&
2264
+ matchedText = Regexp.last_match(0)
2265
2265
 
2266
2266
  if target >= chance.to_i
2267
2267
  text = "オフ"
@@ -2433,7 +2433,7 @@ module BCDice
2433
2433
  end
2434
2434
 
2435
2435
  substitution = text.clone
2436
- substitution = substitution.gsub($&, '')
2436
+ substitution = substitution.gsub(Regexp.last_match(0), '')
2437
2437
  substitution += "\n" unless substitution.empty? || /\n$/ =~ substitution
2438
2438
 
2439
2439
  return substitution + badStatus(counts)
@@ -165,7 +165,7 @@ module BCDice
165
165
 
166
166
  def eval_game_system_specific_command(command)
167
167
  case command.upcase
168
- when /^([1-7]*)PD(\d+)([\+\-]\d+)?$/
168
+ when /^([1-7]*)PD(\d+)([+\-]\d+)?$/
169
169
  counts = Regexp.last_match(2).to_i
170
170
  return nil if counts <= 0
171
171
 
@@ -1802,7 +1802,7 @@ module BCDice
1802
1802
  ]
1803
1803
  return textFrom1D6Table(title, table)
1804
1804
 
1805
- when /^(\d+)(S?)A([1-6]*)([\+\-]\d+)?$/
1805
+ when /^(\d+)(S?)A([1-6]*)([+\-]\d+)?$/
1806
1806
  title = '攻撃'
1807
1807
  counts = Regexp.last_match(1).to_i
1808
1808
  return nil if counts <= 0
@@ -2112,7 +2112,7 @@ module BCDice
2112
2112
  return text, skill unless text =~ /チャンスが(\d{1,2})以下なら오프。/
2113
2113
 
2114
2114
  target = Regexp.last_match(1).to_i
2115
- matchedText = $&
2115
+ matchedText = Regexp.last_match(0)
2116
2116
 
2117
2117
  if target >= chance.to_i
2118
2118
  text = "오프"
@@ -2284,7 +2284,7 @@ module BCDice
2284
2284
  end
2285
2285
 
2286
2286
  substitution = text.clone
2287
- substitution = substitution.gsub($&, '')
2287
+ substitution = substitution.gsub(Regexp.last_match(0), '')
2288
2288
  substitution += "\n" unless substitution.empty? || /\n$/ =~ substitution
2289
2289
 
2290
2290
  return substitution + badStatus(counts)
@@ -66,7 +66,7 @@ module BCDice
66
66
  end
67
67
  return rollAct(counts, judgment, critical, fumble)
68
68
 
69
- when /^CT3([\+\-]?)$/
69
+ when /^CT3([+\-]?)$/
70
70
  sign = Regexp.last_match(1)
71
71
  title = '因縁表(The 3rd) 『BoA3』P292'
72
72
  table = [
@@ -95,7 +95,7 @@ module BCDice
95
95
  ]
96
96
  return tableText(title, table, sign)
97
97
 
98
- when /^CTR([\+\-]?)$/
98
+ when /^CTR([+\-]?)$/
99
99
  sign = Regexp.last_match(1)
100
100
  title = '因縁表(リインカーネイション) 『BAR』P51、299'
101
101
  table = [
@@ -124,7 +124,7 @@ module BCDice
124
124
  ]
125
125
  return tableText(title, table, sign)
126
126
 
127
- when /^DJV(\-?)$/
127
+ when /^DJV(-?)$/
128
128
  sign = Regexp.last_match(1)
129
129
  title = '前世邂逅表(デジャブ) 『BAR』P235'
130
130
  table = [
@@ -153,7 +153,7 @@ module BCDice
153
153
  ]
154
154
  return tableText(title, table, sign)
155
155
 
156
- when /^AKST([\+\-]?)$/
156
+ when /^AKST([+\-]?)$/
157
157
  sign = Regexp.last_match(1)
158
158
  title = '悪徳シーン表 『GoV』P16、164'
159
159
  table = [
@@ -100,8 +100,8 @@ module BCDice
100
100
  debug("commandText", commandText)
101
101
 
102
102
  message = ""
103
- if rerollCounts.size > 1
104
- message += "(#{commandText})" if isStop
103
+ if rerollCounts.size > 1 && isStop
104
+ message += "(#{commandText})"
105
105
  end
106
106
  message += "\n"
107
107
  isReRoll = true
@@ -167,13 +167,16 @@ module BCDice
167
167
 
168
168
  canReRoll = !rerollCommand.empty?
169
169
 
170
- if canReRoll
171
- unless isStop
172
- text, successListTmp, countOneListTmp, = reRoll(rerollCommand, isStop)
173
- message += text
174
- successList += successListTmp
175
- countOneList += countOneListTmp
176
- end
170
+ # frozen_string_literal: true
171
+ # ゲームシステムの識別子
172
+ # ゲームシステム名
173
+ # ゲームシステム名の読みがな
174
+ # ダイスボットの使い方
175
+ if canReRoll && !isStop
176
+ text, successListTmp, countOneListTmp, = reRoll(rerollCommand, isStop)
177
+ message += text
178
+ successList += successListTmp
179
+ countOneList += countOneListTmp
177
180
  end
178
181
 
179
182
  return message, bitList, successList, countOneList, canReRoll
@@ -60,8 +60,18 @@ module BCDice
60
60
  end
61
61
 
62
62
  def eval_game_system_specific_command(command)
63
- roll_tables(command, TABLES)
63
+ roll_tables(command, TABLES) || RTT.roll_command(randomizer, command)
64
64
  end
65
+ RTT = DiceTable::SaiFicSkillTable.new(
66
+ [["社会", ["怯える", "脅す", "考えない", "自信", "黙る", "伝える", "だます", "地位", "笑う", "話す", "怒る"]],
67
+ ["頭部", ["聴く", "感覚器", "見る", "反応", "考える", "脳", "閃く", "予感", "叫ぶ", "口", "噛む"]],
68
+ ["腕部", ["締める", "殴る", "斬る", "利き腕", "撃つ", "操作", "刺す", "逆腕", "振る", "掴む", "投げる"]],
69
+ ["胴部", ["塞ぐ", "呼吸器", "止める", "受ける", "測る", "心臓", "逸らす", "かわす", "耐える", "消化器", "落ちる"]],
70
+ ["脚部", ["走る", "迫る", "蹴る", "利き脚", "跳ぶ", "仕掛ける", "踏む", "逆脚", "這う", "伏せる", "歩く"]],
71
+ ["環境", ["休む", "日常", "隠れる", "待つ", "現れる", "人脈", "捕らえる", "開ける", "逃げる", "退路", "休まない"]],],
72
+ rtt: 'AST',
73
+ rtt_format: "ランダム全特技表(%<category_dice>d) > %<category_name>s(%<row_dice>d) > %<skill_name>s"
74
+ )
65
75
 
66
76
  TABLES_WITH_BLOOD_MOON = {
67
77
  "ST" => DiceTable::Table.new(
@@ -110,42 +120,6 @@ module BCDice
110
120
  "《心臓》"
111
121
  ]
112
122
  ),
113
- "AST" => DiceTable::ChainTable.new(
114
- "ランダム全特技表",
115
- "1D6",
116
- [
117
- DiceTable::Table.new(
118
- "社会",
119
- "2D6",
120
- ["怯える", "脅す", "考えない", "自信", "黙る", "伝える", "だます", "地位", "笑う", "話す", "怒る"]
121
- ),
122
- DiceTable::Table.new(
123
- "頭部",
124
- "2D6",
125
- ["聴く", "感覚器", "見る", "反応", "考える", "脳", "閃く", "予感", "叫ぶ", "口", "噛む"]
126
- ),
127
- DiceTable::Table.new(
128
- "腕部",
129
- "2D6",
130
- ["締める", "殴る", "斬る", "利き腕", "撃つ", "操作", "刺す", "逆腕", "振る", "掴む", "投げる"]
131
- ),
132
- DiceTable::Table.new(
133
- "胴部",
134
- "2D6",
135
- ["塞ぐ", "呼吸器", "止める", "受ける", "測る", "心臓", "逸らす", "かわす", "耐える", "消化器", "落ちる"]
136
- ),
137
- DiceTable::Table.new(
138
- "脚部",
139
- "2D6",
140
- ["走る", "迫る", "蹴る", "利き脚", "跳ぶ", "仕掛ける", "踏む", "逆脚", "這う", "伏せる", "歩く"]
141
- ),
142
- DiceTable::Table.new(
143
- "環境",
144
- "2D6",
145
- ["休む", "日常", "隠れる", "待つ", "現れる", "人脈", "捕らえる", "開ける", "逃げる", "退路", "休まない"]
146
- )
147
- ]
148
- ),
149
123
  "MIT" => DiceTable::Table.new(
150
124
  "軽度狂気表",
151
125
  "1D6",
@@ -416,7 +390,7 @@ module BCDice
416
390
  ),
417
391
  }.merge(TABLES_WITH_BLOOD_MOON).freeze
418
392
 
419
- register_prefix(TABLES.keys)
393
+ register_prefix(RTT.prefixes, TABLES.keys)
420
394
  end
421
395
  end
422
396
  end
@@ -59,7 +59,7 @@ module BCDice
59
59
  end
60
60
 
61
61
  def eval_game_system_specific_command(command)
62
- return roll_tables(command, TABLES)
62
+ return roll_tables(command, TABLES) || BloodCrusade::RTT.roll_command(randomizer, command)
63
63
  end
64
64
 
65
65
  TABLES = {
@@ -206,7 +206,7 @@ module BCDice
206
206
  ),
207
207
  }.merge(BloodCrusade::TABLES_WITH_BLOOD_MOON).freeze
208
208
 
209
- register_prefix(TABLES.keys)
209
+ register_prefix(BloodCrusade::RTT.prefixes, TABLES.keys)
210
210
  end
211
211
  end
212
212
  end
@@ -14,7 +14,8 @@ module BCDice
14
14
 
15
15
  # ダイスボットの使い方
16
16
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
- ランダムでモンスターカードを選ぶ (RM)
17
+ ランダムでモンスターカードを選ぶ (RM) (RTTn n:色番号、省略可能)
18
+ ランダム分野表 RCT
18
19
  特定のモンスターカードを選ぶ (CMxy x:色、y:番号)
19
20
   白:W、青:U、緑:V、金:G、赤:R、黒:B
20
21
   例)CMW1→白の2:白竜 CMG12→金の12:土精霊
@@ -43,7 +44,7 @@ module BCDice
43
44
  if dice_total <= 2
44
45
  return " > ファンブル"
45
46
  elsif dice_total >= 12
46
- return " > スペシャル > " + getRandumMonster()
47
+ return " > スペシャル > " + RTT.roll_command(@randomizer, "RM")
47
48
  elsif total >= target
48
49
  return " > 成功"
49
50
  else
@@ -52,72 +53,31 @@ module BCDice
52
53
  end
53
54
 
54
55
  def eval_game_system_specific_command(command)
55
- command = command.upcase
56
-
57
- case command
58
- when /^RM$/i
59
- return getRandumMonster
60
- when /^CM(\w)(\d+)$/i
61
- color = Regexp.last_match(1).upcase
62
- index = Regexp.last_match(2).to_i
63
- return getMonster(color, index)
64
- else
65
- return roll_tables(command, TABLES)
66
- end
67
- end
68
-
69
- def getRandumMonster
70
- type = "ランダムモンスター選択"
71
- colorTable = getColorTable
72
- color, colorIndex = get_table_by_1d6(colorTable)
73
-
74
- monsters = getMonsterTables(colorIndex - 1)
75
- monsterName, monsterIndex = get_table_by_2d6(monsters)
76
-
77
- output = "#{type}(#{colorIndex},#{monsterIndex}) > #{color}の#{monsterIndex}:#{monsterName}"
78
- return output
56
+ roll_tables(command, TABLES) || get_monster(command) || RTT.roll_command(randomizer, command)
79
57
  end
80
58
 
81
- def getColorTable
82
- ['白', '青', '緑', '金', '赤', '黒']
83
- end
84
-
85
- def getMonsterTables(colorIndex)
86
- tables = [
87
- ['白竜', '僧侶', '格闘家', '斧使い', '剣士', '槍士', '歩兵', '弓兵', '砲兵', '天使', '軍神'],
88
- ['水竜', '魚', '魚人', 'イカ', '蟹', '探偵', '海賊', '魔術師', '使い魔', '雲', '水精霊'],
89
- ['緑竜', 'ワーム', '鳥人', '鳥', '獣', '獣人', 'エルフ', '妖精', '昆虫', '植物', '森精霊'],
90
- ['金竜', '宝石', '岩石', '鋼', '錬金術師', '魔法生物', 'ドワーフ', '機械', '運命', '女神', '土精霊'],
91
- ['火竜', '竜人', '恐竜', '戦車', '蛮族', '小鬼', '大鬼', '巨人', '雷', '炎', '火精霊'],
92
- ['黒竜', '闇騎士', '怪物', '忍者', '妖怪', '蝙蝠', '吸血鬼', '不死者', '幽霊', '悪魔', '邪神'],
93
- ]
94
-
95
- return tables[colorIndex]
96
- end
97
-
98
- def getMonster(color, monsterIndex)
99
- return nil if monsterIndex < 2
100
-
101
- type = "モンスター選択"
102
-
103
- colorWords = ['W', 'U', 'V', 'G', 'R', 'B']
104
- colorIndex = colorWords.index(color)
105
- debug("colorIndex")
106
-
107
- return nil if colorIndex.nil?
59
+ COLOR_TABLE = ['W', 'U', 'V', 'G', 'R', 'B'].freeze
108
60
 
109
- colorTable = getColorTable
110
- color = colorTable[colorIndex]
61
+ RTT = DiceTable::SaiFicSkillTable.new([
62
+ ['白', ['白竜', '僧侶', '格闘家', '斧使い', '剣士', '槍士', '歩兵', '弓兵', '砲兵', '天使', '軍神']],
63
+ ['青', ['水竜', '魚', '魚人', 'イカ', '蟹', '探偵', '海賊', '魔術師', '使い魔', '雲', '水精霊']],
64
+ ['緑', ['緑竜', 'ワーム', '鳥人', '鳥', '獣', '獣人', 'エルフ', '妖精', '昆虫', '植物', '森精霊']],
65
+ ['金', ['金竜', '宝石', '岩石', '鋼', '錬金術師', '魔法生物', 'ドワーフ', '機械', '運命', '女神', '土精霊']],
66
+ ['赤', ['火竜', '竜人', '恐竜', '戦車', '蛮族', '小鬼', '大鬼', '巨人', '雷', '炎', '火精霊']],
67
+ ['黒', ['黒竜', '闇騎士', '怪物', '忍者', '妖怪', '蝙蝠', '吸血鬼', '不死者', '幽霊', '悪魔', '邪神']],
68
+ ], rtt: "RM", rtt_format: "ランダムモンスター選択(%<category_dice>d,%<row_dice>d) > %<text>s", s_format: "%<category_name>sの%<row_dice>d:%<skill_name>s")
111
69
 
112
- monsters = getMonsterTables(colorIndex)
113
- debug("monsters", monsters)
114
- debug("monsterIndex", monsterIndex)
115
- monsterName = monsters[monsterIndex - 2]
70
+ def get_monster(command)
71
+ m = command.match(/^CM(\w)(\d+)$/i)
72
+ return nil unless m
116
73
 
117
- return nil if monsterName.nil?
74
+ cat = COLOR_TABLE.index(m[1])
75
+ row_dice = m[2].to_i
76
+ return nil unless cat
77
+ return nil unless row_dice.between?(2, 12)
118
78
 
119
- output = "#{type} #{color}の#{monsterIndex}:#{monsterName}"
120
- return output
79
+ skill = RTT.categories[cat].skills[row_dice - 2]
80
+ return "モンスター選択 > #{skill}"
121
81
  end
122
82
 
123
83
  TABLES = {
@@ -242,7 +202,7 @@ module BCDice
242
202
  ]
243
203
  ),
244
204
  }.freeze
245
- register_prefix('RM', 'CM.*', TABLES.keys)
205
+ register_prefix(RTT.prefixes, 'CM.*', TABLES.keys)
246
206
  end
247
207
  end
248
208
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bcdice/command_parser'
4
-
5
3
  module BCDice
6
4
  module GameSystem
7
5
  class ChaosFlare < Base
@@ -108,7 +106,9 @@ module BCDice
108
106
  # @param command [String]
109
107
  # @return [String, nil]
110
108
  def cf_roll(command)
111
- parser = CommandParser.new(/\d*CF/)
109
+ parser = Command::Parser.new(/\d*CF/, round_type: round_type)
110
+ .enable_critical
111
+ .enable_fumble
112
112
 
113
113
  @cmd = parser.parse(command)
114
114
  unless @cmd
@@ -36,7 +36,7 @@ module BCDice
36
36
  result = ''
37
37
 
38
38
  case command
39
- when /([+-]?\d+)?CL([+-]\d+)?(\@(\d))?(\[(\d+)\])?([+-]\d+)?(>=(\d+))?/i
39
+ when /([+-]?\d+)?CL([+-]\d+)?(@(\d))?(\[(\d+)\])?([+-]\d+)?(>=(\d+))?/i
40
40
  m = Regexp.last_match
41
41
  base = (m[1] || 1).to_i
42
42
  modifier1 = m[2].to_i
@@ -45,7 +45,7 @@ module BCDice
45
45
  def getCheckRollDiceCommandResult(command)
46
46
  debug("getCheckRollDiceCommandResult command", command)
47
47
 
48
- return nil unless command =~ /(\d+)?CH([\+\-\d]*)(>=([\+\-\d]*))?$/i
48
+ return nil unless command =~ /(\d+)?CH([+\-\d]*)(>=([+\-\d]*))?$/i
49
49
 
50
50
  diceCount = (Regexp.last_match(1) || 3).to_i
51
51
  modifyText = (Regexp.last_match(2) || '')
@@ -134,7 +134,7 @@ module BCDice
134
134
  def getYear(yearText)
135
135
  text = yearText.gsub(/(\d+)D(6+)/) { getD6xResult(Regexp.last_match(1).to_i, Regexp.last_match(2).length) }
136
136
 
137
- unless text.match?(%r{^[\+\-\*/\d]+$})
137
+ unless text.match?(%r{^[+\-*/\d]+$})
138
138
  return nil
139
139
  end
140
140