bcdice 3.1.3 → 3.2.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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -2
  3. data/i18n/StellarKnights/ja_jp.yml +496 -0
  4. data/lib/bcdice/common_command/add_dice.rb +1 -1
  5. data/lib/bcdice/common_command/calc.rb +1 -1
  6. data/lib/bcdice/dice_table.rb +2 -0
  7. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  8. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  9. data/lib/bcdice/game_system.rb +3 -0
  10. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  11. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  12. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  13. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  14. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  15. data/lib/bcdice/game_system/AngelGear.rb +1 -1
  16. data/lib/bcdice/game_system/AnimaAnimus.rb +1 -1
  17. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  18. data/lib/bcdice/game_system/Avandner.rb +1 -1
  19. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  20. data/lib/bcdice/game_system/BattleTech.rb +1 -1
  21. data/lib/bcdice/game_system/BeginningIdol.rb +5 -5
  22. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +5 -5
  23. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  24. data/lib/bcdice/game_system/BlindMythos.rb +1 -1
  25. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  26. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  27. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  28. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  29. data/lib/bcdice/game_system/Chill.rb +10 -10
  30. data/lib/bcdice/game_system/Chill3.rb +9 -9
  31. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  32. data/lib/bcdice/game_system/Cthulhu.rb +1 -1
  33. data/lib/bcdice/game_system/Cthulhu7th.rb +48 -10
  34. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  35. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  36. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  37. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  38. data/lib/bcdice/game_system/DeadlineHeroes.rb +2 -2
  39. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  40. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  41. data/lib/bcdice/game_system/DoubleCross.rb +1 -1
  42. data/lib/bcdice/game_system/Dracurouge.rb +1 -1
  43. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  44. data/lib/bcdice/game_system/Elric.rb +18 -14
  45. data/lib/bcdice/game_system/Elysion.rb +1 -1
  46. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  47. data/lib/bcdice/game_system/Emoklore.rb +3 -3
  48. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  49. data/lib/bcdice/game_system/FilledWith.rb +4 -0
  50. data/lib/bcdice/game_system/GURPS.rb +17 -28
  51. data/lib/bcdice/game_system/Garako.rb +1 -1
  52. data/lib/bcdice/game_system/GardenOrder.rb +1 -1
  53. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  54. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  55. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  56. data/lib/bcdice/game_system/GranCrest.rb +18 -11
  57. data/lib/bcdice/game_system/Gundog.rb +9 -8
  58. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  59. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  60. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  61. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  62. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  63. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  64. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  65. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  66. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  67. data/lib/bcdice/game_system/Insane.rb +13 -20
  68. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  69. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  70. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  71. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  72. data/lib/bcdice/game_system/KanColle.rb +4 -9
  73. data/lib/bcdice/game_system/KemonoNoMori.rb +1 -1
  74. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  75. data/lib/bcdice/game_system/KurayamiCrying.rb +55 -2
  76. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  77. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  78. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +3 -3
  79. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  80. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  81. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  82. data/lib/bcdice/game_system/Nechronica.rb +28 -21
  83. data/lib/bcdice/game_system/NinjaSlayer.rb +4 -4
  84. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  85. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  86. data/lib/bcdice/game_system/Paradiso.rb +1 -1
  87. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  88. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  89. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  90. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  91. data/lib/bcdice/game_system/Postman.rb +1 -1
  92. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  93. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  94. data/lib/bcdice/game_system/Revulture.rb +123 -0
  95. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  96. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  97. data/lib/bcdice/game_system/Satasupe.rb +1 -1
  98. data/lib/bcdice/game_system/ScreamHighSchool.rb +2 -2
  99. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  100. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  101. data/lib/bcdice/game_system/Skynauts.rb +2 -2
  102. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  103. data/lib/bcdice/game_system/StellarKnights.rb +59 -696
  104. data/lib/bcdice/game_system/SterileLife.rb +1 -1
  105. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  106. data/lib/bcdice/game_system/Strave.rb +1 -1
  107. data/lib/bcdice/game_system/SwordWorld.rb +16 -7
  108. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -2
  109. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -2
  110. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  111. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  112. data/lib/bcdice/game_system/TrinitySeven.rb +4 -4
  113. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  114. data/lib/bcdice/game_system/Utakaze.rb +1 -1
  115. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  116. data/lib/bcdice/game_system/WARPS.rb +11 -9
  117. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  118. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  119. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  120. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  121. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  122. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  123. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +4 -4
  124. data/lib/bcdice/game_system/sword_world/rating_parser.rb +1 -1
  125. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  126. data/lib/bcdice/repl.rb +1 -1
  127. data/lib/bcdice/result.rb +26 -0
  128. data/lib/bcdice/version.rb +1 -1
  129. metadata +9 -4
@@ -127,7 +127,7 @@ module BCDice
127
127
  return "失敗"
128
128
  end
129
129
 
130
- register_prefix('\d*JD', 'RETP?\d+', 'DNGNP?\d+', TABLES.keys)
130
+ register_prefix('\d*JD', 'RETP?', 'DNGNP?', TABLES.keys)
131
131
  end
132
132
  end
133
133
  end
@@ -25,7 +25,7 @@ module BCDice
25
25
   例)DC4:【攻撃力】4でダメージチェック DC5[20]:【攻撃力】5でダメージチェック、うち1つは20mm機銃 DC5[20,30]:【攻撃力】5でダメージチェック、うち1つは20mm機銃、うち1つは30mmガンポッド
26
26
  MESSAGETEXT
27
27
 
28
- register_prefix('\d*D20<=', '\d*CP', 'RMT', 'TOT', 'EXT', 'SUT', 'DC(\d+)')
28
+ register_prefix('\d*D20<=', '\d*CP', 'RMT', 'TOT', 'EXT', 'SUT', 'DC')
29
29
 
30
30
  def eval_game_system_specific_command(command) # ダイスロールコマンド
31
31
  # 通常判定部分をgetJudgeResultコマンドに切り分け
@@ -26,7 +26,7 @@ module BCDice
26
26
  ・D66ダイスあり
27
27
  INFO_MESSAGE_TEXT
28
28
 
29
- register_prefix('(N|A|M|U|C|)?URGE\d+')
29
+ register_prefix('[NAMUC]?URGE')
30
30
 
31
31
  def get_urge(string) # パラサイトブラッドの衝動表
32
32
  unless /(\w*)URGE\s*(\d+)/i =~ string
@@ -45,18 +45,13 @@ module BCDice
45
45
  end
46
46
 
47
47
  # ゲーム別成功度判定(2D6)
48
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
49
- return '' if target == '?'
50
- return '' unless cmp_op == :>=
48
+ def result_2d6(_total, dice_total, _dice_list, cmp_op, _target)
49
+ return nil unless cmp_op == :>=
51
50
 
52
51
  if dice_total <= 2
53
- return "ファンブル(【眠気】が1d6点上昇)"
52
+ Result.fumble("ファンブル(【眠気】が1d6点上昇)")
54
53
  elsif dice_total >= 12
55
- return "スペシャル(【魔力】あるいは【眠気】が1d6点回復)"
56
- elsif total >= target
57
- return " > 成功"
58
- else
59
- return " > 失敗"
54
+ Result.critical("スペシャル(【魔力】あるいは【眠気】が1d6点回復)")
60
55
  end
61
56
  end
62
57
 
@@ -18,20 +18,20 @@ module BCDice
18
18
  INFO_MESSAGE_TEXT
19
19
 
20
20
  # ゲーム別成功度判定(1d20)
21
- def check_1D20(total, _dice_total, cmp_op, target)
22
- return '' if target == '?'
23
- return '' unless cmp_op == :<=
21
+ def result_1d20(total, _dice_total, cmp_op, target)
22
+ return Result.nothing if target == '?'
23
+ return nil unless cmp_op == :<=
24
24
 
25
25
  if total <= target
26
26
  if (total >= (40 - target)) || (total == target)
27
- "クリティカル"
27
+ Result.critical("クリティカル")
28
28
  else
29
- "成功"
29
+ Result.success("成功")
30
30
  end
31
31
  elsif total == 20
32
- "ファンブル"
32
+ Result.fumble("ファンブル")
33
33
  else
34
- "失敗"
34
+ Result.failure("失敗")
35
35
  end
36
36
  end
37
37
  end
@@ -18,9 +18,9 @@ module BCDice
18
18
  INFO_MESSAGE_TEXT
19
19
 
20
20
  # ゲーム別成功度判定(1d20)
21
- def check_1D20(total, _dice_total, cmp_op, diff)
22
- return '' if diff == '?'
23
- return '' unless cmp_op == :<=
21
+ def result_1d20(total, _dice_total, cmp_op, diff)
22
+ return Result.nothing if diff == '?'
23
+ return nil unless cmp_op == :<=
24
24
 
25
25
  # 技能値の修正を計算する
26
26
  skill_mod = 0
@@ -46,7 +46,7 @@ module BCDice
46
46
  else
47
47
  fum_str += "-#{skill_mod}=#{fum_num}"
48
48
  end
49
- return "致命的失敗(#{fum_str})"
49
+ return Result.fumble("致命的失敗(#{fum_str})")
50
50
 
51
51
  elsif (total <= critical) || (total <= 1)
52
52
  crit_num = dice_now + skill_mod
@@ -54,14 +54,14 @@ module BCDice
54
54
  crit_num = 1 if crit_num < 1
55
55
 
56
56
  if skill_mod < 0
57
- return "成功"
57
+ return Result.success("成功")
58
58
  end
59
59
 
60
- return "決定的成功(#{dice_now}+#{skill_mod}=#{crit_num})"
60
+ return Result.critical("決定的成功(#{dice_now}+#{skill_mod}=#{crit_num})")
61
61
  elsif total <= diff
62
- return "成功"
62
+ return Result.success("成功")
63
63
  else
64
- return "失敗"
64
+ return Result.failure("失敗")
65
65
  end
66
66
  end
67
67
  end
@@ -38,7 +38,7 @@ module BCDice
38
38
  MESSAGETEXT
39
39
 
40
40
  register_prefix(
41
- 'WEA\d*',
41
+ 'WEA',
42
42
  '(\d+)?PO',
43
43
  'FRE'
44
44
  )
@@ -47,7 +47,7 @@ module BCDice
47
47
   ・プッシュ時のキャスティング・ロールの失敗(Failed Casting Effects)表 FCE
48
48
  INFO_MESSAGE_TEXT
49
49
 
50
- register_prefix('CC\(\d+\)', 'CC', 'CBR\(\d+,\d+\)', 'FAR', 'BMR', 'BMS', 'FCE', 'PH', 'MA', 'IT')
50
+ register_prefix('CC', 'CBR', 'FAR', 'BMR', 'BMS', 'FCE', 'PH', 'MA', 'IT')
51
51
 
52
52
  def eval_game_system_specific_command(command)
53
53
  case command
@@ -39,8 +39,8 @@ module BCDice
39
39
  end
40
40
 
41
41
  register_prefix(
42
- '(-)?(\d+)?RD(\d+)?(@(\d+))?',
43
- '(-)?(\d+)?DD([1-9])?([\+\-]\d+)?'
42
+ '(-)?(\d+)?RD',
43
+ '(-)?(\d+)?DD'
44
44
  )
45
45
 
46
46
  def eval_game_system_specific_command(command)
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Revulture < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Revulture'
8
+
9
+ # ゲームシステム名
10
+ NAME = '光砕のリヴァルチャー'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'こうさいのりうあるちやあ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~HELP
17
+ ■アタック判定( xAT, xATK, xATTACK )
18
+ x: ダイス数(加算 + と除算 / を使用可能)
19
+ 例) 3AT, 4ATK, 5+6ATTACK, 15/2AT
20
+
21
+ □アタック判定 目標値つき( xAT<=y, xATK<=y, xATTACK<=y )
22
+ x: ダイス数(加算 + と除算 / を使用可能)
23
+ y: 目標値( 1 以上 6 以下。加算 + を使用可能)
24
+ 例) 3AT<=4, 3AT<=2+1
25
+
26
+ □アタック判定 目標値&追加ダメージつき( xAT<=y[>=a:+b], xATK<=y[>=a:+b], xATTACK<=y[z] )
27
+ x: ダイス数(加算 + と除算 / を使用可能)
28
+ y: 目標値( 1 以上 6 以下。加算 + を使用可能)
29
+ z: 追加ダメージの規則(詳細は後述)(※複数同時に指定可能)
30
+
31
+ ▽追加ダメージの規則 [a:+b]
32
+ a: ヒット数が a なら
33
+  =a (ヒット数が a に等しい)
34
+  >=a (ヒット数が a 以上)
35
+ b: ダメージを b 点追加
36
+
37
+ 例) 3AT<=4[>=2:+3] #ルールブックp056「グレングラントAR」
38
+ 例) 2AT<=4[=1:+5][>=2:+8] #ルールブックp067「ファーボル・ドラゴンブレス」
39
+ HELP
40
+
41
+ ATTACK_ROLL_REG = %r{^(\d+([+/]\d+)*)?AT(TACK|K)?(<=([1-6](\+\d)*))?((\[>?=\d+:\+\d+\])+)?}i.freeze
42
+ register_prefix('\d+([+\/]\d+)*AT')
43
+
44
+ def eval_game_system_specific_command(command)
45
+ if (m = ATTACK_ROLL_REG.match(command))
46
+ roll_attack(m[1], m[5], m[7])
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def roll_attack(dice_count_expression, border_expression, additional_damage_rules)
53
+ dice_count = Arithmetic.eval(dice_count_expression, round_type: RoundType::FLOOR)
54
+ border = Arithmetic.eval(border_expression, round_type: RoundType::FLOOR).clamp(1, 6) if border_expression
55
+
56
+ command = make_command_text(dice_count, border, additional_damage_rules)
57
+
58
+ if dice_count <= 0
59
+ return "#{command} > ダイス数が 0 です"
60
+ elsif border.nil? && additional_damage_rules
61
+ return "#{command} > 目標値が指定されていないため、追加ダメージを算出できません"
62
+ end
63
+
64
+ dices = @randomizer.roll_barabara(dice_count, 6).sort
65
+
66
+ critical_hit_count = dices.count(1)
67
+ hit_count = dices.count { |dice| dice <= border } + critical_hit_count if border
68
+ damage = calc_damage(hit_count, additional_damage_rules)
69
+
70
+ message_elements = []
71
+ message_elements << command
72
+ message_elements << dices.join(',')
73
+ message_elements << "クリティカル #{critical_hit_count}" if critical_hit_count > 0
74
+ message_elements << "ヒット数 #{hit_count}" if hit_count
75
+ message_elements << "ダメージ #{damage}" if damage
76
+
77
+ Result.new(message_elements.join(' > ')).tap do |r|
78
+ r.condition = hit_count > 0 if hit_count
79
+ r.critical = critical_hit_count > 0
80
+ end
81
+ end
82
+
83
+ def make_command_text(dice_count, border, additional_damage_rules)
84
+ command = "#{dice_count}attack"
85
+ command += "<=#{border}" if border
86
+ command += additional_damage_rules if additional_damage_rules
87
+
88
+ "(#{command})"
89
+ end
90
+
91
+ def calc_damage(hit_count, additional_damage_rules)
92
+ return nil unless additional_damage_rules
93
+
94
+ damage = hit_count
95
+ parse_additional_damage_rules(additional_damage_rules).each do |rule|
96
+ if rule[:condition].call(hit_count)
97
+ damage += rule[:additinal_damage]
98
+ end
99
+ end
100
+
101
+ damage
102
+ end
103
+
104
+ def parse_additional_damage_rules(source)
105
+ source.scan(/\[(>?=)(\d+):\+(\d+)\]/).map do |matched|
106
+ {
107
+ condition: make_additional_damage_condition(matched[0], matched[1].to_i),
108
+ additinal_damage: matched[2].to_i,
109
+ }
110
+ end
111
+ end
112
+
113
+ def make_additional_damage_condition(comparer, comparing_target)
114
+ case comparer
115
+ when '='
116
+ lambda { |hit_count| hit_count == comparing_target }
117
+ when '>='
118
+ lambda { |hit_count| hit_count >= comparing_target }
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -18,8 +18,8 @@ module BCDice
18
18
  INFO_MESSAGE_TEXT
19
19
 
20
20
  # ゲーム別成功度判定(1d100)
21
- def check_1D100(total, _dice_total, cmp_op, target)
22
- return '' if target == '?'
21
+ def result_1d100(total, _dice_total, cmp_op, target)
22
+ return Result.nothing if target == '?'
23
23
  return nil unless cmp_op == :<=
24
24
 
25
25
  # RuneQuest QUICK-START RULESを元に修正
@@ -28,18 +28,18 @@ module BCDice
28
28
 
29
29
  if (total <= 1) || (total <= critical_value)
30
30
  # 1は常に決定的成功
31
- "決定的成功"
31
+ Result.critical("決定的成功")
32
32
  elsif total >= 100
33
33
  # 100は常に致命的失敗
34
- "致命的失敗"
34
+ Result.fumble("致命的失敗")
35
35
  elsif total <= (target.to_f / 5).round
36
- "効果的成功"
36
+ Result.success("効果的成功")
37
37
  elsif total <= target
38
- "成功"
38
+ Result.success("成功")
39
39
  elsif total >= 95 + critical_value
40
- "致命的失敗"
40
+ Result.fumble("致命的失敗")
41
41
  else
42
- "失敗"
42
+ Result.failure("失敗")
43
43
  end
44
44
  end
45
45
  end
@@ -21,7 +21,7 @@ module BCDice
21
21
  例)R8,6>=13
22
22
  INFO_MESSAGE_TEXT
23
23
 
24
- register_prefix('R\d+')
24
+ register_prefix('R')
25
25
 
26
26
  def initialize(command)
27
27
  super(command)
@@ -49,7 +49,7 @@ module BCDice
49
49
  ・D66ダイスあり
50
50
  INFO_MESSAGE_TEXT
51
51
 
52
- register_prefix('\d+R', 'SR\d+', 'TAGT', 'GETSST', 'NPCT', TABLES.keys, ALIASES.keys)
52
+ register_prefix('\d+R', 'SR', 'TAGT', 'GETSST', 'NPCT', TABLES.keys, ALIASES.keys)
53
53
 
54
54
  CREATE_ARMS_STRUCT = Struct.new(:base_parts, :accessory_parts, :parts_effect, :hit, :damage, :life, :kutibeni, :kiba, :abilities)
55
55
 
@@ -37,8 +37,8 @@ module BCDice
37
37
  INFO_MESSAGE_TEXT
38
38
 
39
39
  register_prefix(
40
- '(SH|SHS)(\-?\d+)(\/\d+)?(@\d+)?',
41
- '(EM|TR|FE)(\-?\d+)(@\d+)?',
40
+ '(SH|SHS)',
41
+ '(EM|TR|FE)',
42
42
  'DC(SL|BL|IM|BR|RF|EL).+'
43
43
  )
44
44
 
@@ -24,11 +24,12 @@ module BCDice
24
24
  register_prefix('SF', 'ST')
25
25
 
26
26
  def change_text(string)
27
- string.gsub(/SF/i, "2D6").gsub(/ST/i, "2D6")
27
+ string.gsub(/S[FT]/i, "2D6")
28
28
  end
29
29
 
30
- def check_2D6(total, dice_total, _dice_list, cmp_op, target)
31
- return '' if target == '?'
30
+ def result_2d6(total, dice_total, _dice_list, cmp_op, target)
31
+ return Result.nothing if target == '?'
32
+ return nil unless [:>=, :>].include?(cmp_op)
32
33
 
33
34
  critical = false
34
35
  fumble = false
@@ -39,28 +40,23 @@ module BCDice
39
40
  fumble = true
40
41
  end
41
42
 
42
- totalValueBonus = 0
43
- if cmp_op == :>=
44
- totalValueBonus = 1
45
- end
43
+ totalValueBonus = (cmp_op == :>= ? 1 : 0)
46
44
 
47
- if [:>=, :>].include?(cmp_op)
48
- if (total + totalValueBonus) > target
49
- if critical
50
- return " > 自動成功(劇的成功)"
51
- elsif fumble
52
- return " > 自動失敗"
53
- else
54
- return " > 成功"
55
- end
45
+ if (total + totalValueBonus) > target
46
+ if critical
47
+ Result.critical("自動成功(劇的成功)")
48
+ elsif fumble
49
+ Result.failure("自動失敗")
50
+ else
51
+ Result.success("成功")
52
+ end
53
+ else
54
+ if critical
55
+ Result.success("自動成功")
56
+ elsif fumble
57
+ Result.fumble("自動失敗(致命的失敗)")
56
58
  else
57
- if critical
58
- return " > 自動成功"
59
- elsif fumble
60
- return " > 自動失敗(致命的失敗)"
61
- else
62
- return " > 失敗"
63
- end
59
+ Result.failure("失敗")
64
60
  end
65
61
  end
66
62
  end
@@ -16,12 +16,13 @@ module BCDice
16
16
 
17
17
  # ダイスボットの使い方
18
18
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
19
- ・行為判定 SG@s#f>=x
20
-  2D6の行為判定を行う
19
+ ・行為判定 nSG@s#f>=x
20
+  2D6の行為判定を行う。ダイス数が指定された場合、大きい出目2個を採用する。
21
+  n: ダイス数 (省略時 2)
21
22
   s: スペシャル値 (省略時 12)
22
23
   f: ファンブル値 (省略時 2)
23
24
   x: 目標値 (省略可)
24
-  例)SG, SG@11, SG@11#3, SG#3>=7
25
+  例)SG, SG@11, SG@11#3, SG#3>=7, 3SG>=7
25
26
  ・各種表
26
27
   ・(無印)シーン表 ST/ファンブル表 FT/感情表 ET
27
28
     /変調表 WT/戦場表 BT/異形表 MT
@@ -68,7 +69,7 @@ module BCDice
68
69
  end
69
70
  end
70
71
 
71
- register_prefix("SG")
72
+ register_prefix('\d*SG')
72
73
 
73
74
  def eval_game_system_specific_command(command)
74
75
  result = action_roll(command) || roll_tables(command, TABLES) || RTT.roll_command(@randomizer, command)
@@ -94,17 +95,23 @@ module BCDice
94
95
  private
95
96
 
96
97
  def action_roll(command)
97
- parser = Command::Parser.new("SG", round_type: round_type)
98
+ parser = Command::Parser.new(/\d*SG/, round_type: round_type)
98
99
  .restrict_cmp_op_to(:>=, nil)
99
100
  .enable_critical
100
101
  .enable_fumble
101
102
  cmd = parser.parse(command)
102
103
  return nil unless cmd
103
104
 
105
+ times = cmd.command.start_with?(/\d/) ? cmd.command.to_i : 2
106
+ return nil if times <= 1
107
+
104
108
  cmd.critical ||= 12
105
109
  cmd.fumble ||= 2
106
110
 
107
- dice_list = @randomizer.roll_barabara(2, 6).sort
111
+ dice_list_full = @randomizer.roll_barabara(times, 6).sort
112
+ dice_list_full_str = "[#{dice_list_full.join(',')}]" if times > 2
113
+
114
+ dice_list = dice_list_full[-2, 2]
108
115
  dice_total = dice_list.sum()
109
116
  total = dice_total + cmd.modify_number
110
117
 
@@ -123,6 +130,7 @@ module BCDice
123
130
 
124
131
  sequence = [
125
132
  "(#{cmd.to_s(:after_modify_number)})",
133
+ dice_list_full_str,
126
134
  "#{dice_total}[#{dice_list.join(',')}]#{Format.modifier(cmd.modify_number)}",
127
135
  total,
128
136
  result.text