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

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