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
@@ -126,15 +126,13 @@ module BCDice
126
126
 
127
127
  # 正規表現の都合で先頭に ',' が残っているので取っておく
128
128
  text = text[1..-1]
129
- rules = text.split(',').map do |rule|
129
+ text.split(',').map do |rule|
130
130
  v = rule.split('>').map(&:to_i)
131
131
  {
132
132
  from: v[0],
133
133
  to: v[1],
134
134
  }
135
135
  end
136
-
137
- rules
138
136
  end
139
137
 
140
138
  def roll_all_situation_b2_tables
@@ -104,7 +104,7 @@ module BCDice
104
104
 
105
105
  def getJudgeResult(command)
106
106
  case command
107
- when /(\d+)*DA([\d\+\*\-]*[\d])?\[(\d+),(\d+)(,(\d+))?\]/i
107
+ when /(\d+)*DA([\d+*\-]*\d)?\[(\d+),(\d+)(,(\d+))?\]/i
108
108
  number = (Regexp.last_match(1) || 1).to_i
109
109
  correction = (Regexp.last_match(2) || 0).to_i
110
110
  single = (Regexp.last_match(3) || 4).to_i
@@ -46,7 +46,7 @@ module BCDice
46
46
  debug("checkRoll begin command", command)
47
47
 
48
48
  result = ''
49
- return result unless command =~ /^(\d+)SR([\+\-]?\d+)?(>=(\d+))?$/i
49
+ return result unless command =~ /^(\d+)SR([+\-]?\d+)?(>=(\d+))?$/i
50
50
 
51
51
  diceCount = Regexp.last_match(1).to_i
52
52
  modify = Regexp.last_match(2).to_i
@@ -17,15 +17,14 @@ module BCDice
17
17
 
18
18
  VOT, GUT, BAT, KEYT, DRT: (ボーカル、ギター、ベース、キーボード、ドラム)トラブル表
19
19
  EMO: 感情表
20
- AT[1-6]: 特技表(空: ランダム 1: 主義 2: 身体 3: モチーフ 4: エモーション 5: 行動 6: 逆境)
20
+ ATn, RTTn: 特技表(n=分野。空:ランダム 1:主義 2:身体 3:モチーフ 4:エモーション 5:行動 6:逆境)
21
+ RCT: 分野ランダム表
21
22
  SCENE, MACHI, GAKKO, BAND: (汎用、街角、学校、バンド)シーン表 接近シーンで使用
22
23
  TENKAI: シーン展開表 奔走シーン 練習シーンで使用
23
24
 
24
- []内は省略可 D66入れ替えあり
25
+ D66入れ替えあり
25
26
  INFO_MESSAGE_TEXT
26
27
 
27
- register_prefix('AT[1-6]?')
28
-
29
28
  def initialize(command)
30
29
  super(command)
31
30
 
@@ -52,37 +51,7 @@ module BCDice
52
51
  end
53
52
 
54
53
  def eval_game_system_specific_command(command)
55
- if (m = /^AT([1-6]?)$/.match(command))
56
- value = m[1].to_i
57
- return getSkillList(value)
58
- end
59
-
60
- roll_tables(command, self.class::TABLES)
61
- end
62
-
63
- def getSkillList(field = 0)
64
- title = translate("StratoShout.AT.name")
65
- table = translate("StratoShout.AT.table")
66
-
67
- number1 = 0
68
- if field == 0
69
- table, number1 = get_table_by_1d6(table)
70
- else
71
- table = table[field - 1]
72
- end
73
-
74
- fieldName, table = table
75
- skill, number2 = get_table_by_2d6(table)
76
-
77
- text = title
78
- if field == 0
79
- text += " > [#{number1},#{number2}]"
80
- else
81
- skill_class = translate("StratoShout.AT.skill_class", name: fieldName)
82
- text += "#{skill_class} > [#{number2}]"
83
- end
84
-
85
- return "#{text} > 《#{skill}/#{fieldName}#{number2}》"
54
+ roll_tables(command, self.class::TABLES) || self.class::RTT.roll_command(@randomizer, command)
86
55
  end
87
56
 
88
57
  class << self
@@ -103,11 +72,16 @@ module BCDice
103
72
  "TENKAI" => DiceTable::D66Table.from_i18n("StratoShout.table.TENKAI", locale),
104
73
  }
105
74
  end
75
+
76
+ def translate_rtt(locale)
77
+ DiceTable::SaiFicSkillTable.from_i18n("StratoShout.RTT", locale, rtt: 'AT', rttn: ['AT1', 'AT2', 'AT3', 'AT4', 'AT5', 'AT6'])
78
+ end
106
79
  end
107
80
 
108
81
  TABLES = translate_tables(:ja_jp)
82
+ RTT = translate_rtt(:ja_jp)
109
83
 
110
- register_prefix(TABLES.keys)
84
+ register_prefix(TABLES.keys, RTT.prefixes)
111
85
  end
112
86
  end
113
87
  end
@@ -18,7 +18,7 @@ module BCDice
18
18
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
19
  VOT, GUT, BAT, KEYT, DRT: (보컬, 기타, 베이스, 키보드, 드럼)트러블표
20
20
  EMO: 감정표
21
- AT[1-6]: 특기표(공백: 랜덤 1: 주의 2: 신체 3: 모티브 4: 이모션 5: 행동 6: 역경)
21
+ RTT[1-6], AT[1-6]: 특기표(공백: 랜덤 1: 주의 2: 신체 3: 모티브 4: 이모션 5: 행동 6: 역경)
22
22
  SCENE, MACHI, GAKKO, BAND: (범용, 거리, 학교, 밴드)장면표. 접근 장면에 사용
23
23
  TENKAI: 장면 전개표. 분주 장면, 연습 장면에 사용
24
24
  []내는 생략가능 D66는 변동있음
@@ -33,6 +33,7 @@ module BCDice
33
33
  end
34
34
 
35
35
  TABLES = translate_tables(:ko_kr).freeze
36
+ RTT = translate_rtt(:ko_kr)
36
37
  end
37
38
  end
38
39
  end
@@ -71,7 +71,7 @@ module BCDice
71
71
 
72
72
  commands = getRatingCommandStrings
73
73
 
74
- m = /^S?(H?K[\d\+\-]+([#{commands}]\[([\d\+\-]+)\])*([\d\+\-]*)([CMR]\[([\d\+\-]+)\]|GF|H)*)/i.match(string)
74
+ m = /^S?(H?K[\d+\-]+([#{commands}]\[([\d+\-]+)\])*([\d+\-]*)([CMR]\[([\d+\-]+)\]|GF|H)*)/i.match(string)
75
75
  unless m
76
76
  debug("not matched")
77
77
  return '1'
@@ -86,7 +86,7 @@ module BCDice
86
86
 
87
87
  key, addValue = getKeyAndAddValueFromString(string)
88
88
 
89
- return '1' unless key =~ /([\d]+)/
89
+ return '1' unless key =~ /(\d+)/
90
90
 
91
91
  key = Regexp.last_match(1).to_i
92
92
 
@@ -204,12 +204,12 @@ module BCDice
204
204
  firstDiceChanteTo = 0
205
205
  firstDiceChangeModify = 0
206
206
 
207
- regexp = /m\[([\d\+\-]+)\]/i
207
+ regexp = /m\[([\d+\-]+)\]/i
208
208
 
209
209
  if regexp =~ string
210
210
  firstDiceChangeModify = Regexp.last_match(1)
211
211
 
212
- unless /[\+\-]/ =~ firstDiceChangeModify
212
+ unless /[+\-]/ =~ firstDiceChangeModify
213
213
  firstDiceChanteTo = firstDiceChangeModify.to_i
214
214
  firstDiceChangeModify = 0
215
215
  end
@@ -229,7 +229,7 @@ module BCDice
229
229
  key = nil
230
230
  addValue = 0
231
231
 
232
- if /K(\d+)([\d\+\-]*)/i =~ string # ボーナスの抽出
232
+ if /K(\d+)([\d+\-]*)/i =~ string # ボーナスの抽出
233
233
  key = Regexp.last_match(1)
234
234
  if Regexp.last_match(2)
235
235
  addValue = ArithmeticEvaluator.eval(Regexp.last_match(2))
@@ -108,7 +108,7 @@ module BCDice
108
108
 
109
109
  def getKeptDiceChangesFromString(string)
110
110
  keptDiceChangeModify = 0
111
- regexp = /a\[([\+\-]\d+)\]/i
111
+ regexp = /a\[([+\-]\d+)\]/i
112
112
  if regexp =~ string
113
113
  keptDiceChangeModify = Regexp.last_match(1)
114
114
  string = string.gsub(regexp, '')
@@ -36,13 +36,13 @@ module BCDice
36
36
  output =
37
37
  case command.upcase
38
38
 
39
- when /(TS|OP)(\d+)?(([\+\-]\d+)*)(\@(\d+))?$/i
39
+ when /(TS|OP)(\d+)?(([+\-]\d+)*)(@(\d+))?$/i
40
40
  hasCritical = (Regexp.last_match(1) == "OP")
41
41
  target = (Regexp.last_match(6) || 0).to_i
42
42
  modify = (Regexp.last_match(2) || 0).to_i
43
43
  modifyAddString = Regexp.last_match(3)
44
44
 
45
- modify_list = modifyAddString.scan(/[\+\-]\d+/) # 修正値を分割して配列へ
45
+ modify_list = modifyAddString.scan(/[+\-]\d+/) # 修正値を分割して配列へ
46
46
  modify_list.each { |i| modify += i.to_i }
47
47
 
48
48
  checkRoll(hasCritical, modify, target)
@@ -26,10 +26,10 @@ module BCDice
26
26
  @sort_add_dice = true
27
27
  end
28
28
 
29
- register_prefix('\d+D6.*')
29
+ register_prefix('\d+D6')
30
30
 
31
31
  def eval_game_system_specific_command(command)
32
- parser = CommandParser.new(/^\d+D6$/)
32
+ parser = Command::Parser.new(/\d+D6/, round_type: round_type)
33
33
  cmd = parser.parse(command)
34
34
  unless cmd
35
35
  return nil
@@ -120,7 +120,7 @@ module BCDice
120
120
  ttype = ""
121
121
  value = 0
122
122
 
123
- return nil unless /([RITMDB]T)(\d+([\+\-]\d+)*)/i =~ string
123
+ return nil unless /([RITMDB]T)(\d+([+\-]\d+)*)/i =~ string
124
124
 
125
125
  type = Regexp.last_match(1)
126
126
  num = Regexp.last_match(2)
@@ -42,9 +42,6 @@ module BCDice
42
42
   ・ロールボーナス表「BTx+y or BONUSx+y or TOTALx+y」 xは数値, yは技能基本値
43
43
  INFO_MESSAGE_TEXT
44
44
  register_prefix('TE.*', 'UP.*', 'POS.*', '\d+BD.*', 'TG.*', 'RT.*', 'Result.*', 'DT.*', 'damage.*', 'BT.*', 'bonus.*', 'total.*', '1R20.*')
45
- def initialize(command)
46
- super(command)
47
- end
48
45
 
49
46
  def eval_game_system_specific_command(command)
50
47
  torg_check(command) ||
@@ -176,7 +173,7 @@ module BCDice
176
173
  # ダメージボーナスコマンド
177
174
  def getBonusDamageDiceCommandResult(command)
178
175
  debug("TorgEternity Bonus Damage Roll Command ? ", command)
179
- m = /(\d+)(BD)(([\+\-]\d+)*)/i.match(command)
176
+ m = /(\d+)(BD)(([+\-]\d+)*)/i.match(command)
180
177
  unless m
181
178
  return nil
182
179
  end
@@ -196,7 +193,7 @@ module BCDice
196
193
  # 成功レベル表コマンド
197
194
  def getSuccessLevelDiceCommandResult(command)
198
195
  debug("TorgEternity Success Level Table Command ? ", command)
199
- m = /(RT|Result)(\-*\d+([\+\-]\d+)*)/i.match(command)
196
+ m = /(RT|Result)(-*\d+([+\-]\d+)*)/i.match(command)
200
197
  unless m
201
198
  return nil
202
199
  end
@@ -216,7 +213,7 @@ module BCDice
216
213
  # ダメージ結果表コマンド
217
214
  def getDamageResultDiceCommandResult(command)
218
215
  debug("TorgEternity Damage Result Table Command ? ", command)
219
- m = /(DT|Damage)(\-*\d+([\+\-]\d+)*)/i.match(command)
216
+ m = /(DT|Damage)(-*\d+([+\-]\d+)*)/i.match(command)
220
217
  unless m
221
218
  return nil
222
219
  end
@@ -232,7 +229,7 @@ module BCDice
232
229
  # ロールボーナス表コマンド
233
230
  def getRollBonusDiceCommandResult(command)
234
231
  debug("TorgEternity Roll Bonus Table Command ? ", command)
235
- m = /(BT|Bonus)(\d+)(([\+\-]\d+)*)/i.match(command)
232
+ m = /(BT|Bonus)(\d+)(([+\-]\d+)*)/i.match(command)
236
233
  unless m
237
234
  return nil
238
235
  end
@@ -44,14 +44,14 @@ module BCDice
44
44
  return "#{firstName} , #{secondName}"
45
45
  end
46
46
 
47
- if /^TR([\+\-\d]*)<=([\d]*)([\+\-\d]*)/ =~ command
47
+ if /^TR([+\-\d]*)<=(\d*)([+\-\d]*)/ =~ command
48
48
  critical = Regexp.last_match(1).to_i + 7
49
49
  target = Regexp.last_match(2).to_i
50
50
  modify = Regexp.last_match(3).to_i
51
51
  return rollHit(command, critical, target, modify)
52
52
  end
53
53
 
54
- if /^([\d]*)DM([\d]*)([\+\-\d]*)$/ =~ command
54
+ if /^(\d*)DM(\d*)([+\-\d]*)$/ =~ command
55
55
  diceCount = Regexp.last_match(1).to_i
56
56
  critical = Regexp.last_match(2).to_i
57
57
  modify = Regexp.last_match(3).to_i
@@ -42,9 +42,9 @@ module BCDice
42
42
 
43
43
  def replace_text(string)
44
44
  if /BS/i =~ string
45
- string = string.gsub(/(\d+)HBS([^\d\s][\+\-\d]+)/i) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(2)}[H]" }
45
+ string = string.gsub(/(\d+)HBS([^\d\s][+\-\d]+)/i) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(2)}[H]" }
46
46
  string = string.gsub(/(\d+)HBS/i) { "#{Regexp.last_match(1)}R6[H]" }
47
- string = string.gsub(/(\d+)BS([^\d\s][\+\-\d]+)/i) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(2)}" }
47
+ string = string.gsub(/(\d+)BS([^\d\s][+\-\d]+)/i) { "#{Regexp.last_match(1)}R6#{Regexp.last_match(2)}" }
48
48
  string = string.gsub(/(\d+)BS/i) { "#{Regexp.last_match(1)}R6" }
49
49
  end
50
50
 
@@ -61,7 +61,7 @@ module BCDice
61
61
 
62
62
  output = "1"
63
63
 
64
- return output unless (m = /(^|\s)S?((\d+)[rR]6([\+\-\d]*)(\[(\w+)\])?)(\s|$)/i.match(string))
64
+ return output unless (m = /(^|\s)S?((\d+)[rR]6([+\-\d]*)(\[(\w+)\])?)(\s|$)/i.match(string))
65
65
 
66
66
  debug('tandt_berserk matched')
67
67
 
@@ -184,9 +184,9 @@ module BCDice
184
184
  command = command
185
185
  .sub(/\d+LV$/i) { |level| level.to_i * 5 + 15 }
186
186
 
187
- parser = CommandParser.new(/^\d+D6$/)
188
- .allow_cmp_op(nil, :>=)
189
- .enable_question_target()
187
+ parser = Command::Parser.new(/\d+D6/, round_type: round_type)
188
+ .restrict_cmp_op_to(nil, :>=)
189
+ .enable_question_target()
190
190
  cmd = parser.parse(command)
191
191
  unless cmd
192
192
  return nil
@@ -58,7 +58,7 @@ module BCDice
58
58
  private
59
59
 
60
60
  def check_roll(command)
61
- m = /^2D6([\+\-\d]*)>=(\d+)(\[(\d+)?(,(\d+))?\])?$/i.match(command)
61
+ m = /^2D6([+\-\d]*)>=(\d+)(\[(\d+)?(,(\d+))?\])?$/i.match(command)
62
62
  unless m
63
63
  return nil
64
64
  end
@@ -39,7 +39,7 @@ module BCDice
39
39
  result = ''
40
40
 
41
41
  case command
42
- when /(\d+)?UK(\@?(\d))?(>=(\d+))?/i
42
+ when /(\d+)?UK(@?(\d))?(>=(\d+))?/i
43
43
  base = (Regexp.last_match(1) || 2).to_i
44
44
  crit = Regexp.last_match(3).to_i
45
45
  diff = Regexp.last_match(5).to_i
@@ -255,18 +255,18 @@ module BCDice
255
255
  debug("pos_type", pos_type)
256
256
  if pos_type != ""
257
257
  case pos_type
258
- when /\@(2W|W2)/i
258
+ when /@(2W|W2)/i
259
259
  pos_t = 1
260
- when /\@(4W|W4)/i
260
+ when /@(4W|W4)/i
261
261
  pos_t = 4
262
- when /\@(4H|H4)/i
262
+ when /@(4H|H4)/i
263
263
  pos_t = 3
264
- when /\@4/i
264
+ when /@4/i
265
265
  pos_t = 2
266
- when /\@W/i
266
+ when /@W/i
267
267
  pos_t = 5
268
268
  else
269
- unless /\@(2H|H2|2)/i =~ pos_type
269
+ unless /@(2H|H2|2)/i =~ pos_type
270
270
  pos_t = -1
271
271
  end
272
272
  end
@@ -263,19 +263,16 @@ module BCDice
263
263
 
264
264
  def additional_result(total, target_number)
265
265
  tens, ones = split_d100(total)
266
- result =
267
- if (total > target_number) || (total > 95) # 自動失敗時のファンブル処理も
268
- if ones == tens
269
- "ファンブル"
270
- end
271
- elsif ones == tens
272
- "クリティカル"
273
- else
274
- # 一の位と十の位を入れ替えて参照する
275
- HIT_PARTS_TABLE.fetch(merge_d100(ones, tens)).content
266
+ if (total > target_number) || (total > 95) # 自動失敗時のファンブル処理も
267
+ if ones == tens
268
+ "ファンブル"
276
269
  end
277
-
278
- result
270
+ elsif ones == tens
271
+ "クリティカル"
272
+ else
273
+ # 一の位と十の位を入れ替えて参照する
274
+ HIT_PARTS_TABLE.fetch(merge_d100(ones, tens)).content
275
+ end
279
276
  end
280
277
 
281
278
  def split_d100(dice)
@@ -23,7 +23,7 @@ module BCDice
23
23
  register_prefix('\d+\-2DR.*')
24
24
 
25
25
  def eval_game_system_specific_command(command)
26
- return nil unless command =~ /^(\d+)-2DR([\+\-\d]*)(>=(\d+))?$/i
26
+ return nil unless command =~ /^(\d+)-2DR([+\-\d]*)(>=(\d+))?$/i
27
27
 
28
28
  baseAvility = Regexp.last_match(1).to_i
29
29
  modText = Regexp.last_match(2)
@@ -18,7 +18,7 @@ module BCDice
18
18
  :<
19
19
  when />/
20
20
  :>
21
- when /\=/
21
+ when /=/
22
22
  :==
23
23
  end
24
24
  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