bcdice 3.7.0 → 3.8.0

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/i18n/Arianrhod/ja_jp.yml +3 -0
  4. data/i18n/Emoklore/ja_jp.yml +7 -0
  5. data/i18n/SwordWorld/ja_jp.yml +1 -0
  6. data/i18n/SwordWorld/zh_hans.yml +7 -0
  7. data/i18n/SwordWorld2_0/zh_hans.yml +37 -0
  8. data/i18n/SwordWorld2_5/ja_jp.yml +1 -1
  9. data/i18n/SwordWorld2_5/zh_hans.yml +57 -0
  10. data/lib/bcdice/arithmetic/parser.rb +1 -1
  11. data/lib/bcdice/command/parser.rb +1 -1
  12. data/lib/bcdice/common_command/add_dice/parser.rb +1 -1
  13. data/lib/bcdice/common_command/barabara_dice/parser.rb +1 -1
  14. data/lib/bcdice/common_command/calc/parser.rb +1 -1
  15. data/lib/bcdice/common_command/reroll_dice/parser.rb +1 -1
  16. data/lib/bcdice/common_command/tally_dice/parser.rb +1 -1
  17. data/lib/bcdice/common_command/upper_dice/parser.rb +1 -1
  18. data/lib/bcdice/game_system/AngelGear.rb +1 -1
  19. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -1
  20. data/lib/bcdice/game_system/Arianrhod.rb +4 -4
  21. data/lib/bcdice/game_system/AssaultEngine.rb +3 -3
  22. data/lib/bcdice/game_system/BeastBindTrinity.rb +1 -1
  23. data/lib/bcdice/game_system/BeginningIdol.rb +2 -2
  24. data/lib/bcdice/game_system/BeginningIdol2022.rb +2 -2
  25. data/lib/bcdice/game_system/BladeOfArcana.rb +3 -3
  26. data/lib/bcdice/game_system/Bloodorium.rb +68 -0
  27. data/lib/bcdice/game_system/ConvictorDrive.rb +117 -0
  28. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  29. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  30. data/lib/bcdice/game_system/CyberpunkRed.rb +2 -6
  31. data/lib/bcdice/game_system/DeadlineHeroes.rb +1 -1
  32. data/lib/bcdice/game_system/DungeonsAndDragons5.rb +196 -0
  33. data/lib/bcdice/game_system/EmbryoMachine.rb +4 -4
  34. data/lib/bcdice/game_system/Emoklore.rb +8 -8
  35. data/lib/bcdice/game_system/FutariSousa.rb +1 -0
  36. data/lib/bcdice/game_system/GURPS.rb +1 -1
  37. data/lib/bcdice/game_system/GehennaAn.rb +2 -2
  38. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +152 -0
  39. data/lib/bcdice/game_system/LostRoyal.rb +1 -1
  40. data/lib/bcdice/game_system/NobunagasBlackCastle.rb +237 -0
  41. data/lib/bcdice/game_system/OracleEngine.rb +1 -1
  42. data/lib/bcdice/game_system/Raisondetre.rb +1 -1
  43. data/lib/bcdice/game_system/RokumonSekai2.rb +1 -1
  44. data/lib/bcdice/game_system/SajinsenkiAGuS.rb +154 -0
  45. data/lib/bcdice/game_system/ShinkuuGakuen.rb +1 -1
  46. data/lib/bcdice/game_system/ShinobiGami.rb +14 -1
  47. data/lib/bcdice/game_system/SkynautsBouken.rb +93 -2
  48. data/lib/bcdice/game_system/StellarLife.rb +1 -1
  49. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +1 -1
  50. data/lib/bcdice/game_system/SwordWorld.rb +2 -2
  51. data/lib/bcdice/game_system/SwordWorld2_0_SimplifiedChinese.rb +84 -0
  52. data/lib/bcdice/game_system/SwordWorld2_5_SimplifiedChinese.rb +95 -0
  53. data/lib/bcdice/game_system/SwordWorld_SimplifiedChinese.rb +29 -0
  54. data/lib/bcdice/game_system/TherapieSein.rb +2 -2
  55. data/lib/bcdice/game_system/Torg.rb +1 -1
  56. data/lib/bcdice/game_system/TorgEternity.rb +54 -18
  57. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +26 -12
  58. data/lib/bcdice/game_system/Warhammer4.rb +4 -0
  59. data/lib/bcdice/game_system/WorldOfDarkness.rb +17 -9
  60. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
  61. data/lib/bcdice/game_system/filled_with/tresure_tables.rb +1 -1
  62. data/lib/bcdice/game_system/sword_world/rating_parser.rb +1 -1
  63. data/lib/bcdice/game_system.rb +9 -0
  64. data/lib/bcdice/version.rb +1 -1
  65. metadata +17 -3
@@ -52,7 +52,7 @@ module BCDice
52
52
 
53
53
  return checkRoll(diceCount, choiceCount, target)
54
54
 
55
- elsif command =~ /(-)?(\d+)?DD([1-9])?([+\-]\d+)?$/i
55
+ elsif command =~ /(-)?(\d+)?DD([1-9])?([+-]\d+)?$/i
56
56
  diceCount = (Regexp.last_match(2) || 1).to_i
57
57
  diceCount *= -1 unless Regexp.last_match(1).nil?
58
58
  armor = (Regexp.last_match(3) || 0).to_i
@@ -31,7 +31,7 @@ module BCDice
31
31
  end
32
32
 
33
33
  def replace_text(string)
34
- string = string.gsub(/(\d+)RS([+\-][+\-\d]+)<=(\d+)/i) { "3R6#{Regexp.last_match(2)}<=#{Regexp.last_match(3)}[#{Regexp.last_match(1)}]" }
34
+ string = string.gsub(/(\d+)RS([+-][+\-\d]+)<=(\d+)/i) { "3R6#{Regexp.last_match(2)}<=#{Regexp.last_match(3)}[#{Regexp.last_match(1)}]" }
35
35
  string = string.gsub(/(\d+)RS<=(\d+)/i) { "3R6<=#{Regexp.last_match(2)}[#{Regexp.last_match(1)}]" }
36
36
 
37
37
  return string
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class SajinsenkiAGuS < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'SajinsenkiAGuS'
8
+
9
+ # ゲームシステム名
10
+ NAME = '砂塵戦機アーガス'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'さしんせんきああかす'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・一般判定Lv(チャンス出目0→判定0) nAG+x
18
+    nは習得レベル、Lv0の場合nの省略可能。xは判定値修正(数式による修正可)、省略した場合はレベル修正0
19
+    例)AG:習得レベル0の一般技能、1AG+1:習得レベル1・判定値修正+1の技能、AG+2-1:習得レベル0・判定値修正2-1の技能、(1-1)AG:習得レベル1・レベル修正-1の技能
20
+
21
+ ・適正距離での命中判定(チャンス出目0→判定0、HR算出)OM+y@z
22
+    yは命中補正値(数式可)、zはクリティカル値。クリティカル値省略時は0
23
+    HRの算出時には、HRが大きくなる場合に出目0を10に読み替えます。
24
+    例)OM+18-6@2:命中補正値+18-6でクリティカル値2、適正距離の判定
25
+
26
+ ・非適正距離での命中判定(チャンス出目0→判定0、HR算出)NM+y@z
27
+    yは命中補正値(数式可)、zはクリティカル値。クリティカル値省略時は0
28
+    HRの算出時には、HRが大きくなる場合に出目0を10に読み替えます。
29
+    例)NM+4-3:命中補正値+4-3で非適正距離の判定
30
+
31
+ ・クリティカル表 CR
32
+
33
+ ※通常の1D10などの10面ダイスにおいて出目10の読み替えはしません。コマンドのみです。
34
+
35
+ INFO_MESSAGE_TEXT
36
+ register_prefix('-?\d*AG', 'OM', 'NM', 'CR')
37
+
38
+ def eval_game_system_specific_command(command)
39
+ roll_ippan(command) || roll_hit_check(command) || roll_tables(command, TABLES)
40
+ end
41
+
42
+ private
43
+
44
+ def roll_ippan(command)
45
+ m = /^(-?\d+)?AG((?:[-+]\d+)*)$/.match(command)
46
+ return nil unless m
47
+
48
+ level = m[1].to_i
49
+ x = Arithmetic.eval(m[2], @round_type) || 0
50
+ target = level <= 0 ? 7 + x : 10 + level + x
51
+
52
+ dice_list = @randomizer.roll_barabara(2, 10).map { |d| d == 10 ? 0 : d }
53
+ total = dice_list.sum
54
+
55
+ return Result.new.tap do |result|
56
+ result.condition = total <= target
57
+
58
+ sequence = [
59
+ "(2D10<=#{target})",
60
+ "#{total}[#{dice_list.join(',')}]",
61
+ ("チャンス" if dice_list.include?(0)),
62
+ result.success? ? "成功" : "失敗"
63
+ ].compact
64
+
65
+ result.text = sequence.join(" > ")
66
+ end
67
+ end
68
+
69
+ # 命中判定&HR算出
70
+ def roll_hit_check(command)
71
+ parser = Command::Parser.new("OM", "NM", round_type: @round_type).enable_critical
72
+ parsed = parser.parse(command)
73
+ return nil unless parsed
74
+
75
+ if parsed.command == "OM"
76
+ return roll_om(parsed)
77
+ elsif parsed.command == "NM"
78
+ return roll_nm(parsed)
79
+ end
80
+ end
81
+
82
+ def roll_om(parsed)
83
+ target = parsed.modify_number
84
+ critical = parsed.critical || 0
85
+
86
+ dice_list = @randomizer.roll_barabara(2, 10).map { |v| v == 10 ? 0 : v }.sort.reverse
87
+
88
+ total = dice_list.sum()
89
+ criticals = dice_list.count { |v| v <= critical }
90
+ hr = calc_hr(target, dice_list)
91
+
92
+ return Result.new.tap do |r|
93
+ r.condition = total <= target
94
+ r.critical = criticals >= 1
95
+ r.text = [
96
+ "(2D10<=#{target})",
97
+ "#{total}[#{dice_list.join(',')}]",
98
+ ("チャンス" if dice_list.include?(0)),
99
+ r.success? ? "成功(HR=#{hr}、クリティカル#{criticals})" : "失敗",
100
+ ].compact.join(" > ")
101
+ end
102
+ end
103
+
104
+ def roll_nm(parsed)
105
+ target = parsed.modify_number
106
+ critical = parsed.critical || 0
107
+
108
+ dice_list = @randomizer.roll_barabara(3, 10).map { |v| v == 10 ? 0 : v }.sort.reverse
109
+
110
+ chosen_dice_list = dice_list.take(2)
111
+ total = chosen_dice_list.sum()
112
+ criticals = chosen_dice_list.count { |v| v <= critical }
113
+ hr = calc_hr(target, chosen_dice_list)
114
+
115
+ return Result.new.tap do |r|
116
+ r.condition = total <= target
117
+ r.critical = criticals >= 1
118
+ r.text = [
119
+ "(3D10<=#{target})",
120
+ "#{total}[#{dice_list[0]},#{dice_list[1]}&#{dice_list[2]}]",
121
+ ("チャンス" if chosen_dice_list.include?(0)),
122
+ r.success? ? "成功(HR=#{hr}、クリティカル#{criticals})" : "失敗",
123
+ ].compact.join(" > ")
124
+ end
125
+ end
126
+
127
+ def calc_hr(target, chosen_dice_list)
128
+ total = chosen_dice_list.sum()
129
+ a = (target - total).abs
130
+ b = (target - total - chosen_dice_list.count(0) * 10).abs
131
+ return [a, b].max
132
+ end
133
+
134
+ TABLES = {
135
+ "CR" => DiceTable::Table.new(
136
+ "クリティカル表",
137
+ "1D10",
138
+ [
139
+ "1:「小破」ダメージ+[5]。耐久値-[1]",
140
+ "2:「小破」ダメージ+[5]。耐久値-[1]",
141
+ "3:「小破」ダメージ+[5]。耐久値-[1]",
142
+ "4:「小破」ダメージ+[5]。耐久値-[1]",
143
+ "5:「兵装」損壊を受けるごとに[1D10]を振り、出目に応じた部位の兵装とオプションが《脱落》",
144
+ "6:「上体」攻撃系能力[白兵/ 火器/ 索敵]は各[- 損壊Lv]",
145
+ "7:「脚部」行動系・防御系能力[Iv 値(イニシア値)/ 最大MP/ 回避]は各[- 損壊Lv]",
146
+ "8:「搭乗者」搭乗者の〈最大HP〉および〈HP〉は[-(4 ×損壊Lv)]",
147
+ "9:「搭乗者」搭乗者の〈最大HP〉および〈HP〉は[-(4 ×損壊Lv)]",
148
+ "0:「小破」ダメージ+[5]。耐久値-[1]",
149
+ ]
150
+ )
151
+ }.freeze
152
+ end
153
+ end
154
+ end
@@ -39,7 +39,7 @@ module BCDice
39
39
  )
40
40
 
41
41
  def eval_game_system_specific_command(command)
42
- m = /^([A-Z]+)([+\-]?\d+)?(?:>=(\d+))?$/i.match(command)
42
+ m = /^([A-Z]+)([+-]?\d+)?(?:>=(\d+))?$/i.match(command)
43
43
  unless m
44
44
  return nil
45
45
  end
@@ -41,6 +41,7 @@ module BCDice
41
41
    /夏の終わりシーン表 NTST/培養プラントシーン表  PLST
42
42
    ・忍秘伝  中忍試験シーン表 HC/滅びの塔シーン表 HT/影の街でシーン表 HK
43
43
    /夜行列車シーン表 HY/病院シーン表 HO/龍動シーン表 HR/密室シーン表 HM/催眠シーン表 HS
44
+  ・ファンブル表(旧文庫版) OFT
44
45
  ・D66ダイスあり
45
46
  INFO_MESSAGE_TEXT
46
47
 
@@ -584,6 +585,18 @@ module BCDice
584
585
  'FT' => DiceTable::Table.new(
585
586
  'ファンブル表',
586
587
  '1D6',
588
+ [
589
+ '何か調子がおかしい。そのサイクルの間、すべての行為判定にマイナス1の修正がつく。',
590
+ 'しまった! 好きな忍具を1つ失ってしまう。',
591
+ '情報が漏れる! あなた以外のキャラクターは、あなたの持っている【秘密】か【居所】の中から、好きなものをそれぞれ一つ知ることができる。',
592
+ '油断した! 術の制御に失敗し、好きな【生命力】を1点失う。',
593
+ '敵の陰謀か? 罠にかかり、ランダムに選んだ変調一つを受ける。変調は、変調表で決定すること。',
594
+ 'ふう。危ないところだった。特に何も起こらない。',
595
+ ]
596
+ ),
597
+ 'OFT' => DiceTable::Table.new(
598
+ 'ファンブル表(旧文庫版)',
599
+ '1D6',
587
600
  [
588
601
  '何か調子がおかしい。そのサイクルの間、すべての行為判定にマイナス1の修正がつく。',
589
602
  'しまった! 好きな忍具を1つ失ってしまう。',
@@ -634,7 +647,7 @@ module BCDice
634
647
  '1D6',
635
648
  [
636
649
  '故障:すべての忍具が使用不能になる。この効果は累積しない。各サイクルの終了時に、《絡繰術》で行為判定を行い、成功するとこの変調は無効化される。',
637
- 'マヒ:修得している特技の中からランダムに一つを選び、その特技が使用不能になる。この効果は、修得している特技の数だけ累積する。各サイクルの終了時に、《身体操術l》で行為判定を行い、成功するとこの変調はすべて無効化される。',
650
+ 'マヒ:修得している特技の中からランダムに一つを選び、その特技が使用不能になる。この効果は、修得している特技の数だけ累積する。各サイクルの終了時に、《身体操術》で行為判定を行い、成功するとこの変調はすべて無効化される。',
638
651
  '重傷:命中判定、情報判定、感情判定を行うたびに、接近戦ダメージを1点受ける。この効果は累積しない。各サイクルの終了時に、《生存術》で行為判定を行い、成功するとこの変調は無効化される。',
639
652
  '行方不明:メインフェイズ中、自分以外がシーンプレイヤーのシーンに登場することができなくなる。この効果は累積しない。各サイクルの終了時に、《経済力》で行為判定を行い、成功するとこの変調は無効化される。',
640
653
  '忘却:修得している【感情】の中からランダムに一つを選び、その【感情】を持っていないものとして扱う。この効果は、修得している【感情】の数だけ累積する。各サイクルの終了時に、《記憶術》で行為判定を行い、成功するとこの変調はすべて無効化される。',
@@ -24,6 +24,12 @@ module BCDice
24
24
    例)AVO@8[1,4],[2,6],[3,8] AVO@2[6,4],[2,6]
25
25
  ・FT ファンブル表(p76)
26
26
  ・NV 航行表
27
+ ・航行イベント表
28
+  ・NEN 航行系
29
+  ・NEE 遭遇系
30
+  ・NEO 船内系
31
+  ・NEH 困難系
32
+  ・NEL 長旅系
27
33
 
28
34
  ■ 判定セット
29
35
  ・《回避運動》判定+回避(nSNt#f/AVO@ダメージ)
@@ -58,10 +64,95 @@ module BCDice
58
64
  'スポット2つ分進む',
59
65
  'スポット3つ分進む',
60
66
  ]
61
- )
67
+ ),
68
+ "NEN" => DiceTable::Table.new(
69
+ "航行イベント表 航行系",
70
+ "2D6",
71
+ [
72
+ "フナ酔い\nバッドステータス。キミは次のクエスト終了フェイズまで、【移動力】が「1点」なくなり、「ダッシュ」(p101)を行うことができない。\n 空の上で風に揺さぶられていると、まるで自分と世界が混ざったような感覚がするんだ。それを思い出すだけで……ウプッ。",
73
+ "乱流\n次のシーンでは、航行表の結果にかかわらず、航行チェックで飛空艇駒が進む距離がスポット1つ分になる。\n このあたりの風の流れはデタラメだ。これじゃ、風に乗ってフネを進めることなんてできやしない。焦らず、慎重に進むべきだ。",
74
+ "急変\nGMは、フライトエリア上の任意のスポット2つを選択する。そのスポットのイベントタイプは「困難系」に変更される。\n 空の天気はきまぐれだ。天気が変わることを止めることは出来ない。けれども、こういう変わり方はしてほしくなかったな……。",
75
+ "シケ\n次のシーンでは、シーンプレイヤーは航行チェックを行うことができず、「操舵に専念する」を宣言することもできない。\n ぽつり、ぽつりと窓に雨粒が滴り落ちる。こうなってしまえば、フネを進めることはできない。この間に紅茶を1杯、というのもいいだろう。……ティータイムには生憎の空模様だがね。",
76
+ "気流-1\n飛空艇コマを1スポット分戻す。\n 飛空艇に吹く気流は、常に探空士たちの味方をするとは限らない。誰かの追い風は、誰かの向かい風となってしまうこともあるだろう。",
77
+ "穏やかな空\nこの航行イベントには、特に効果はない。\n 見通しのいい空域。風向きも安定しており、舵を取られるようなこともないだろう。気持ちのいい青空の中、白い雲の合間を縫うようにして、フネは進んでいく。",
78
+ "気流+1\n飛空艇コマを+1スポット分進める。\n 他の空域よりも、比較的強い流れが一定の方向に吹き続けている空域。ときに探空士たちの手助けになり、ときに探空士たちに立ちはだかる。どの空域にどんな風が流れているかを見極めて進むのが、空の旅での基本だ。",
79
+ "進路良好!\n飛空艇は【手がかり】を「1つ」得る。\n このあたりはとても見晴らしがいい。雲海から上には雲ひとつ見当たらず、邪魔な浮遊生物たちもいない。",
80
+ "突風+1\n飛空艇コマを1スポット分進める。その後、飛空艇コマのいるスポットのイベントタイプを確認し、そのイベントタイプの航行表を振って、出たイベントの効果を適用する。\n 突然、フネに強風が吹き付ける。なんとか転覆することなく持ち直したけれども、予定していたコースを外れてしまったようだ。なにか起こるかもしれない。警戒を強めたほうがいいだろう。",
81
+ "貿易風\n次のシーンの航行チェックでは、ダイスを振らずに、航行表の結果の中から好きなものを選んで適用することができる。\n 気流が吹く空域の中でも、特に風向きが安定していて、飛空艇乗りたちに空路として好まれている空域。飛翔イカ等の小さな浮遊生物なんかも、よく群がっている。",
82
+ "気流+2\n飛空艇コマを2スポット分進める。\n うまい具合に気流に乗ることが出来れば、飛空艇はその性能以上の働きを見せてくれる。進路良好、この分なら、予定よりも早く目的地につくことができるだろう。"
83
+ ]
84
+ ),
85
+ "NEE" => DiceTable::Table.new(
86
+ "航行イベント表 遭遇系",
87
+ "2D6",
88
+ [
89
+ "風邪\nバッドステータス。キミは次のクエストフェイズ終了時まで、すべての[得意]な【能力】が[得意]でないもとして扱われる。\n 寒空の中見張りをしたのが悪かったのだろうか。 それとも食事? せめて風邪を引くのなら、 旅立つ前にしておいてほしかったな。",
90
+ "敵対的なソラクジラ\n飛空艇は「D46[大揺れ]/1」のダメージを受ける。\n 飛空艇乗りに人気のソラクジラにも、機嫌が悪いときがある。 こんなときに近づいてしまったのなら、運が悪かったとしか言いようがない。 ご愁傷さま。",
91
+ "トラブルメーカー\nキミの【生命点】を「3点」減少させる。\n えへへ、 じゃないよ! なんてことしてくれたんだ!",
92
+ "敵対的な浮遊生物\n飛空艇は「D/3」のダメージを受ける。\n 浮遊生物は 飛空艇に友好的とは限らない。 彼らの生態系に飛び込んでしまったフネには、 彼らなりの出迎え方があるというものだ。",
93
+ "検問\nこのシーンでは、キミはアクションを行うことができない。\n キミたちのフネの上に巨大な影が落ちる。 キミたちのフネの数倍はあろうかという、 王立空軍の巡空 艦だ。「女王陛下万歳!」 赤い服の兵士たちが、 敬礼とともにキミたちの書類仕事を増やしていく。 ……やりたいことだってあったのに。",
94
+ "風光明媚\n船内マップ上にいるすべてのキャラクターは、【生命点】を「1点」回復させる。\n 空を旅していると、 想像を絶するような絶景に恵まれることもある。夕日を受けて茜色に染まる雲海 や、雲を跳ねるソライルカの群れ。 そんな光景を目に焼き付けたとき、 探空士たちは、自分たちが空を旅する意味に気づくんだ。",
95
+ "ソラクジラ\n船内マップ上にいるすべてのキャラクターは、【生命点】を「1D6点」回復させる。\n 雲の中から、 巨大なソラクジラが浮かび上がる。きゅうんという独特の鳴き声をあげて、ゆっくりと、落ちるように雲の下へ戻っていくソラクジラの雄大な姿は、なかなか見られるものじゃない。 息を呑む圧巻の光景に、しばし目を奪われよう。",
96
+ "大漁\n船内マップ上にいるすべてのキャラクターの【生命点】の最大値を「2点」増加する。この効果は重複しない。\n 飛翔イカの群れだ! どうも、 窓から漏れる明かりにつられてやってきたらしい。網をはろう。今夜は新鮮なイカがたらふく食べられそうだ。",
97
+ "気流+1\n飛空艇コマを1スポット分進める。\n 他の空域よりも、比較的強い流れが一定の方向に吹き続けている空域。ときに探空士たちの手助けになり、ときに探空士たちに立ちはだかる。どの空域にどんな風が流れているかを見極めて進むのが、空の旅での基本だ。",
98
+ "ケセランパセラン\nキミは任意の船内マップ上に配置されてるパーツ1つを選択する。そのパーツが【快適度】のキーワード効果がある場合、このセッションの間、その数値は「1点」高いものとして扱う。\n ふわふわとした大きな綿毛のような浮遊生物。その毛のさわり心地は、上級階級のソファにも使われるほど柔らかい。捕まえて飼うことができれば、一服の癒やしをあたえてくれることだろう。",
99
+ "うさこぷたー\nキミの【生命点】を「3点」回復する。\n ふわふわとした大きな綿毛のような浮遊生物。その毛のさわり心地は、上流階級のソファにも使われるほど柔らかい。 捕まえて飼うことができれば、一服の癒やしをあたえてくれることだろう。"
100
+ ]
101
+ ),
102
+ "NEO" => DiceTable::Table.new(
103
+ "航行イベント表 船内系",
104
+ "2D6",
105
+ [
106
+ "二日酔い\nバッドステータス。キミは次のクエストフェイズ終了時まで、すべての行為判定の【ファンブル値】が「1」高いものとして扱う。\n 仲間との楽しい時間、まだ見ぬ素晴らしい景色。空での旅路は、ビールを美味しくするものにあふれている。だからこれは、 空の旅で出くわす様々な危険のひとつだともいえるんだ。嵐や空賊みたいにさ。頭の痛い存在だよ。",
107
+ "イメージダウン\n船内マップ上にいるすべてのキャラクターは、キミに対して獲得している【キズナ】の「支援チェック」にチェックを入れる。\n お前、本当に何したんだよ……。",
108
+ "白熱\nキミは、任意の船内マップ上のキャラクターを1人選ぶ。その後、キミは船内マップ上の、キャラクターが居ない底面マスが2つ以上あるパーツを選び、そのパーツのキャラクターが居ない任意の底面マスにキミと選んだキャラクターを移動させる。このシーン、キミは「交流」以外のアクションを行うことはできない。(パーツを選ぶことができなかった場合、キャラクターの移動は行われず、キミはこのシーン中、アクションを行うことができない)\n ちょっとした暇つぶしのはずだった。キミがカードを取り出したから、相手も乗っただけだ。でも、勝ったほうは嬉しいし、負けた方は悔しい。それだけのことを、キミたちは忘れてはいけなかったんだ。",
109
+ "見てしまった\nキミは、自身が獲得している任意の【キズナ】1つを選ぶ。その【キズナ】は失われる。\n 誰にだって、隠したい秘密のひとつやふたつはあるものだ。それを咎めるのはよくない。偶然それを目にしてしまったキミが悪いわけでもない。運が悪かっただけなんだ。な?",
110
+ "ケンカ\nキミは、自身が獲得している任意の【キズナ】1つを選んで、その「支援チェック」にチェックを入れる。もし、キミが獲得しているすべての【キズナ】に「支援チェック」が入っている場合、かわりにキミの【生命点】を「1D6点」減少させる。\n 些細ないさかいで、チームワークにひびが入ってしまうことはよくあることだ。人の仲は、ときに人生に影を落とす。 もっとも、ケンカする相手もいないよりは、よっぽどましな人生だと思うけどね。",
111
+ "おしゃべり\nこのシーン中、キミが「交流」のアクションを行うとき、キミのいるパーツ内のキャラクター以外のキャラクターも選ぶことができる。\n 船内に張り巡らされた伝声管を通せば、船内の誰とでも連絡をとることができる。いざというときのための設備だが、何気ないおしゃべりに花を咲かせるのもいいものだ。",
112
+ "月が綺麗ですね\nキミは、任意の船内マップ上のキャラクター1人を選ぶ。キミは、そのキャラクターに対する【キズナ】を獲得する。\n 綺麗ですね 夜空に黄色い月が、まんまるな月が輝いている。フネの中はいつだって機関室の音で騒々しいが、月を眺めるときだけはなぜか、しぃんとした静けさを感じるんだ。",
113
+ "プレゼント\nキミは、任意の船内マップ上のキャラクター1人を選ぶ。そのキャラクターは、キミに対する【キズナ】を獲得する。\n ちょっといい感じの包み紙に包まれたチョコレートや、普段は飲まない銘柄の茶葉。特段意味のあるわけでもない置物。幸福とはつまるところ、そういったものと、誰かの思いでできている。",
114
+ "気流+1\n飛空艇コマを1スポット分進める。\n 他の空域よりも、比較的強い流れが一定の方向に吹き続けている空域。ときに探空士たちの手助けになり、ときに探空士たちに立ちはだかる。どの空域にどんな風が流れているかを見極めて進むのが、空の旅での基本だ。",
115
+ "記念日\n船内マップ上にいるすべてのキャラクターは、キミに対して【キズナ】を獲得する。\n 今朝起きてから、みんながどこかよそよそしい。話しかけても要領を得ないし、自分だけのけものにして、なにかの話し合いをしているらしい。いやだな。なにかしたっけな。あれ、そういえば今日って……。",
116
+ "パーティ\n船内マップ上にいるすべてのキャラクターは、それぞれ、任意のキャラクター1人を選ぶ。それぞれのキャラクターは、選んだキャラクターへの【キズナ】を獲得する。\n この日ばっかりは仕事はよそう! 樽いっぱいのビールに、船長秘蔵のワイン。テーブルの上にはとにかく、飲むものと、つまむものでいっぱいだ。"
117
+ ]
118
+ ),
119
+ "NEH" => DiceTable::Table.new(
120
+ "航行イベント表 困難系",
121
+ "2D6",
122
+ [
123
+ "ケガ\nバッドステータス。キミは次のクエストフェイズ終了時まで、【生命点】の最大値が「5点」となる。すでに5点以上の【生命点】があった場合は、あわせて【生命点】が「5点」になる。\n ケガのひとつやふたつが、旅を終える理由になるわけがない。だが、何をするにしてもキミの身に走る激痛は、確実にキミの行く手を阻むだろう。これまで通りの穏やかな旅路とかいかなくなるはずだ。",
124
+ "大災害\n飛空艇は「D/5」のダメージを受ける。このダメージに《回避運動》のスキル効果を使用することはできない。\n 空で旅を続けていれば、どうしようもない状況に出くわすなんてしょっちゅうだ。そんなときどうするのかって? どうしようもないからただ祈る? 決まってるさ。それでもなんとかするんだよ。",
125
+ "自然の猛威\n飛空艇は「D/4」のダメージを受ける。このダメージに《回避運動》のスキル効果を使用することはできない。\n 『塔』の上の人間は、いつか自然を人間が支配するときが来ると思っている。自然の力を身を以て体感する探空士に、そんな考えをもっているヤツはいない。",
126
+ "シケ\n次のシーンでは、シーンプレイヤーは航行チェックを行うことができず、「操舵に専念する」を宣言することもできない。\n ぽつり、ぽつりと窓に雨粒が滴り落ちる。こうなってしまえば、フネを進めることはできない。この間に紅茶を1杯、というのもいいだろう。……ティータイムには生憎の空模様だがね。",
127
+ "落雷\n飛空艇は「D/3」のダメージを受ける。このダメージに《回避運動》のスキル効果を使用することはできない。\n 突如、飛空艇を轟音と、閃光が包む。何事か、とキミが周囲を確認するより先に、フネに稲妻がほとばしり、どこかが焼ける焦げ臭い匂いが、キミの鼻腔をつく。これはまずいぞ。はやくこの空域を抜けるんだ!",
128
+ "ゲリラ豪雨\n飛空艇は「D/3」のダメージを受ける。\n 暴風に呑まれまいと、出力最大で風雨を振り切る。エンジンは赤熱し、吐き出す蒸気が機関室を白く染める。……もってくれよ。こんなところで空に頬りだされるのはゴメンだ。",
129
+ "嵐の前触れ\n次のシーンでは、スポットのイベントタイプや、「その場に留まる」を宣言したかどうかにかかわらず、航行イベントを「航行イベント表:困難系」を使用して決定する。\n 突然目の前に現れたどす黒い雲。気圧計の針がみるみるうちに下がっていき、キミたちに不穏な前触れを告げる。これは、覚悟を決めなければならないかもしれない……。",
130
+ "シケ\n次のシーンでは、シーンプレイヤーは航行チェックを行うことができず、「操舵に専念する」を宣言することもできない。\n ぽつり、ぽつりと窓に雨粒が滴り落ちる。こうなってしまえば、フネを進めることはできない。この間に紅茶を1杯、というのもいいだろう。……ティータイムには生憎の空模様だがね。",
131
+ "気流+2\n飛空艇コマを2スポット分進める。\n このあたりは危険な空域らしいが、このくらいの風を則こなせなければ、プロとは言えない。事実、キミはそれをやってのけた。これが、探空士の仕事ぶりというものさ。",
132
+ "荒れ狂う空\nキミは「身体・感覚:7」の行為判定を3回行う。失敗した回数だけ、飛空艇は「D/3」のダメージを受ける。\n うっかりしてるにしても、これはひどすぎだ! 気づけばフネは暴風域のど真ん中。これを抜けるのは、ただの乱気流と避けるのとはワケが違うんだぞ!",
133
+ "低気圧の中心\nキミは「身体・感覚:9」の行為判定を行う。この判定に成功しない限り、飛空艇コマはフライトエリア上を移動することできず、次のシーンの航行イベントも、自動的に「低気圧の中心」となる。行為判定に成功したかどうかにかかわらず、その後の飛空艇は「D/4」のダメージを受ける。このダメージに《回避運動》のスキル効果を使用することはできない。\n 巨大な渦巻きのような雲。近づくだけでフネは引き寄せられ、一瞬でも舵をはなせば呑み込まれてしまう。その圧倒的な力はさながら、巨大な竜に襲われているかのようだ。"
134
+ ]
135
+ ),
136
+ "NEL" => DiceTable::Table.new(
137
+ "航行イベント表 長旅系",
138
+ "2D6",
139
+ [
140
+ "フィーバー\nバッドステータス。キミは次のクエストフェイズ終了時まで、何らかの行為判定を行うたびに、【生命点】を「1点」減少させる。\n 一周回って、というやつさ。なんだか楽しくなってきてしまった。今なら何をやってもうまくいく気がするし、うまくいかなくても気にならない気がするんだ。",
141
+ "ギスギスした雰囲気\n船内マップ上のキャラクター全員は、自身が獲得している【キズナ】すべての「支援チェック」にチェックを入れなければならない。\n 誰のせいでもない。いうなれば全員のせいなんだ。でも、誰かのせいにせずにはいられなかったのさ。",
142
+ "エンジントラブル\nキミは船内マップ上の、任意の「機関室」カテゴリのパーツ1つを選び、さらにそのパーツ内の任意の、[破損]していないマス1つを選ぶ。そのマスは[破損]する。\n ……ボンッ!",
143
+ "食糧難\n船内マップ上のキャラクター全員の【生命点】が「2点」減少する。\n キミたちの前には、缶詰がひとつだけ。キミたちは顔を突き合わせ、お互いをにらみつける。どのみち、こんなものを奪いあっても、何にもならないというのに。",
144
+ "老朽化\nキミのいるマスが[破損]する。この[破損]によって、キミの【生命点】は減少しない。\n 最近ミシミシというようになってきたな。とは思ったんだ。いつか修理しなきゃ、と思っていたさ。でも、こう、パキッといきなりいっちゃうとは思わなかったんだ。本当だよ。",
145
+ "まだ大丈夫……\nこの航行イベントには、特に効果はない。\n 今の所、このフネにはまだ安全な空の旅を続けるだけの余裕はある。だが、キミたちの脳裏には不安がよぎる。安全はあっても、安心はできないのだ。",
146
+ "先を急ぐ\nこのシーン中、キミはアクションを行うことができない。その代わりに、飛空艇コマを1スポット分移動させる。\n 先を急ごう。焦燥に苛まれる中、キミたち全員がそう思っていた。のんびりと旅を楽しんでいる時間はない。そんな時間は、とっくの昔に過ぎ去っている。",
147
+ "パンデミック\nキミは「フナ酔い」(p91)、「二日酔い」(p93)、「ケガ」(p94)から1つを選ぶ。船内マップ上にいるキャラクター全員は、選ばれた航行イベントに記載されているバッドステータスを受ける。\n 悪いことに、病気というものはときとして人から人へと伝染する。地上の流行り病も大変だというのに、空の上でこうなってしまったらとんでもない。ああ、天はキミたちを見放したのだろうか。",
148
+ "気流+1\n飛空艇コマを1スポット分移動させる。\n しめた!追い風となっている気流を見つける。一刻も早く目的地までたどり着かなければならないキミたちにとって、まさに願ってもないことだ。",
149
+ "こんなときに\nシーンプレイヤーは、「航行イベント表:困難系」(p94)を振ること。振って出た航行イベント表の効果が適用される。\n いくらキミたちが困っていても、自然はそんなことかまいやしない。困難は見境なく訪れ、キミたちをさらに困らせる。",
150
+ "遭難\nこの航行イベント表が発生した時点で、セッションは終了となる。お疲れ様。\n その後、キミたちが再び「塔」へと戻ってくることはなかった。嵐にのまれたのだろうか、空賊や、浮遊生物に襲われたのだろうか。それを知る者は、もうどこにもいない。"
151
+ ]
152
+ ),
62
153
  }.freeze
63
154
 
64
- register_prefix('D', '\d?SN', 'NV', 'FT', 'AVO')
155
+ register_prefix('D', '\d?SN', 'AVO', TABLES.keys)
65
156
 
66
157
  def initialize(command)
67
158
  super(command)
@@ -52,7 +52,7 @@ module BCDice
52
52
 
53
53
  def getJudgeResult(command)
54
54
  case command
55
- when /(\d+)?DA([\d+*\-]*\d)?\[(\d+),(\d+)(,(\d+))?\]/i
55
+ when /(\d+)?DA([\d+*-]*\d)?\[(\d+),(\d+)(,(\d+))?\]/i
56
56
  number = (Regexp.last_match(1) || 1).to_i
57
57
  correction = (Regexp.last_match(2) || 0).to_i
58
58
  single = (Regexp.last_match(3) || 4).to_i
@@ -49,7 +49,7 @@ module BCDice
49
49
 
50
50
  result = Result.new
51
51
  result.text = ''
52
- return result unless command =~ /^(\d+)SR([+\-]?\d+)?(>=(\d+))?$/i
52
+ return result unless command =~ /^(\d+)SR([+-]?\d+)?(>=(\d+))?$/i
53
53
 
54
54
  diceCount = Regexp.last_match(1).to_i
55
55
  modify = Regexp.last_match(2).to_i
@@ -322,7 +322,7 @@ module BCDice
322
322
 
323
323
  if dice_total <= 2
324
324
  sequence.push(rateResults.join(','))
325
- sequence.push("自動的失敗")
325
+ sequence.push(translate("SwordWorld.fumble"))
326
326
  return sequence.join(" > "), false, true
327
327
  end
328
328
 
@@ -345,7 +345,7 @@ module BCDice
345
345
  end
346
346
 
347
347
  if round > 1
348
- round_text = "#{round - 1}回転"
348
+ round_text = translate("SwordWorld.round_text", reroll_count: round - 1)
349
349
  sequence.push(round_text)
350
350
  end
351
351
 
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/SwordWorld2_0'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class SwordWorld2_0_SimplifiedChinese < SwordWorld2_0
8
+ # ゲームシステムの識別子
9
+ ID = 'SwordWorld2.0:SimplifiedChinese'
10
+
11
+ # ゲームシステム名
12
+ NAME = '剑世界2.0'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Simplified Chinese:剑世界2.0'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ 自动成功、成功、失败、自动失败会自动判定。
20
+
21
+ ・威力表 (Kx)
22
+  指令为“K威力值+加值”的格式。
23
+  加值的部分不能是像“K20+K30”这样的威力的写法。
24
+  另外,加值可以有多个。
25
+  威力表和骰点一样,可以对其他玩家隐藏。
26
+  例)K20   K10+5   k30   k10+10   Sk10-1   k10+5+2
27
+
28
+ ・暴击值的设定
29
+  暴击值通过“[暴击值]”指定。
30
+  没有指定暴击值时默认为10。
31
+  如果不需要发生暴击,请设定为13。(例如防御时)
32
+  另外也可写成结尾的“@暴击值”的形式。
33
+  例)K20[10]   K10+5[9]   k30[10]   k10[9]+10   k10-5@9
34
+
35
+ ・威力表的减半 (HKx, KxH+N)
36
+  在威力表开头或末尾加上“H”,骰威力表的最终结果就会减半。
37
+  H写在威力表末尾的情况下可以在后面直接跟着修正,会在减半后进行加减运算。
38
+  这种情况下,多个修正需要用括号括起来(否则会解析失败)
39
+  没有指定暴击值的情况下,则视为没有暴击值。
40
+  例)HK20  K20h  HK10-5@9  K10-5@9H  K20gfH  K20+8H+2  K20+8H+(1+1)
41
+
42
+ ・骰子出目修正(命运变转或重击光辉用)
43
+  在指令末尾添加“$修正值”来改变骰子出目。
44
+  可以使用$+1的格式在骰子出目上+修正,或使用$9的格式把骰子出目替换为固定值。
45
+  暴击时只有第一次出目应用这个修正。
46
+  例)K20$+1   K10+5$9   k10-5@9$+2   k10[9]+10$9
47
+
48
+ ・威力上升(斩首刀用) r10
49
+  r后跟上升值,暴击后威力上升r后所填写的上升值点
50
+  例)K20r10 K30+24@8R10 K40+24@8$12r10
51
+
52
+ ・极限命运在末尾加上 gf
53
+  例)K20gf K30+24@8GF K40+24@8$12r5gf
54
+
55
+ ・威力表使用1d+固定值对应 暴击后仍继续 sf4
56
+  例)k10sf4 k0+5sf4@13 k70+26sf3@9
57
+
58
+ ・威力表使用1d+固定值对应 暴击后变回使用2d对应 tf3
59
+  例)k10tf3 k0+5tf4@13 k70+26tf3@9
60
+
61
+ ・超越判定用2d6可写成 2d6@10 的格式加上暴击值。
62
+  例)2D6@10 2D6@10+11>=30
63
+
64
+ ・成长 (Gr)
65
+  在Gr后面加上数字可以进行多次成长。
66
+  例)Gr3
67
+
68
+ ・防御大失败表 (FT)
69
+  抽取防御大失败表。
70
+
71
+ ・缠绕效果表 (TT)
72
+  抽取缠绕效果表。
73
+ INFO_MESSAGE_TEXT
74
+
75
+ register_prefix_from_super_class()
76
+
77
+ def initialize(command)
78
+ super(command)
79
+
80
+ @locale = :zh_hans
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/SwordWorld2_5'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class SwordWorld2_5_SimplifiedChinese < SwordWorld2_5
8
+ # ゲームシステムの識別子
9
+ ID = 'SwordWorld2.5:SimplifiedChinese'
10
+
11
+ # ゲームシステム名
12
+ NAME = '剑世界2.5'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Simplified Chinese:剑世界2.5'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
+ 自动成功、成功、失败、自动失败会自动判定。
20
+
21
+ ・威力表 (Kx)
22
+  指令为“K威力值+加值”的格式。
23
+  加值的部分不能是像“K20+K30”这样的威力的写法。
24
+  另外,加值可以有多个。
25
+  威力表和骰点一样,可以对其他玩家隐藏。
26
+  例)K20   K10+5   k30   k10+10   Sk10-1   k10+5+2
27
+
28
+ ・暴击值的设定
29
+  暴击值通过“[暴击值]”指定。
30
+  没有指定暴击值时默认为10。
31
+  如果不需要发生暴击,请设定为13。(例如防御时)
32
+  另外也可写成结尾的“@暴击值”的形式。
33
+  例)K20[10]   K10+5[9]   k30[10]   k10[9]+10   k10-5@9
34
+
35
+ ・威力表的减半 (HKx, KxH+N)
36
+  在威力表开头或末尾加上“H”,骰威力表的最终结果就会减半。
37
+  H写在威力表末尾的情况下可以在后面直接跟着修正,会在减半后进行加减运算。
38
+  这种情况下,多个修正需要用括号括起来(否则会解析失败)
39
+  没有指定暴击值的情况下,则视为没有暴击值。
40
+  例)HK20  K20h  HK10-5@9  K10-5@9H  K20gfH  K20+8H+2  K20+8H+(1+1)
41
+
42
+ ・骰子出目修正(命运变转或重击光辉用)
43
+  在指令末尾添加“$修正值”来改变骰子出目。
44
+  可以使用$+1的格式在骰子出目上+修正,或使用$9的格式把骰子出目替换为固定值。
45
+  暴击时只有第一次出目应用这个修正。
46
+  例)K20$+1   K10+5$9   k10-5@9$+2   k10[9]+10$9
47
+
48
+ ・骰子出目修正(必杀攻击用)
49
+  写成“#修正值“的格式来增加骰子出目。
50
+  暴击时后续骰子也会继续应用修正值。
51
+  例)K20#1   k10-5@9#2
52
+
53
+ ・威力上升(斩首刀用) r5
54
+  r后跟上升值,暴击后威力上升r后所填写的上升值点
55
+  例)K20r5 K30+24@8R5 K40+24@8$12r5
56
+
57
+ ・极限命运在末尾加上 gf
58
+  例)K20gf K30+24@8GF K40+24@8$12r5gf
59
+
60
+ ・威力表使用1d+固定值对应 暴击后仍继续 sf4
61
+  例)k10sf4 k0+5sf4@13 k70+26sf3@9
62
+
63
+ ・威力表使用1d+固定值对应 暴击后变回使用2d对应 tf3
64
+  例)k10tf3 k0+5tf4@13 k70+26tf3@9
65
+
66
+ ・超越判定用2d6可写成 2d6@10 的格式加上暴击值。
67
+  例)2D6@10 2D6@10+11>=30
68
+
69
+ ・成长 (Gr)
70
+  在Gr后面加上数字可以进行多次成长。
71
+  例)Gr3
72
+
73
+ ・防御大失败表 (FT)
74
+  抽取防御大失败表。
75
+
76
+ ・缠绕效果表 (TT)
77
+  抽取缠绕效果表。
78
+
79
+ ・德鲁伊用物理魔法表 (Dru[2~6的结果,7~9的结果,10~12的结果])
80
+  例)Dru[0,3,6]+10-3
81
+
82
+ ・奈落诅咒表 (ABT)
83
+  抽取奈落诅咒表。
84
+ INFO_MESSAGE_TEXT
85
+
86
+ register_prefix_from_super_class()
87
+
88
+ def initialize(command)
89
+ super(command)
90
+
91
+ @locale = :zh_hans
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bcdice/game_system/SwordWorld'
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class SwordWorld_SimplifiedChinese < SwordWorld
8
+ # ゲームシステムの識別子
9
+ ID = 'SwordWorld:SimplifiedChinese'
10
+
11
+ # ゲームシステム名
12
+ NAME = '剑世界'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Simplified Chinese:剑世界'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = "・SW 威力表 (Kx[c]+m$f) (x:威力值, c:暴击值, m:加值, f:骰子出目修正)\n"
19
+
20
+ register_prefix_from_super_class()
21
+
22
+ def initialize(command)
23
+ super(command)
24
+
25
+ @locale = :zh_hans
26
+ end
27
+ end
28
+ end
29
+ end
@@ -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)
@@ -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)