bcdice 3.12.0 → 3.14.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -0
  3. data/i18n/Arianrhod/ko_kr.yml +3 -0
  4. data/i18n/Cthulhu/en_us.yml +11 -0
  5. data/i18n/CyberpunkRed/ja_jp.yml +389 -0
  6. data/i18n/FinalFantasyXIV/en_us.yml +4 -0
  7. data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
  8. data/i18n/FutariSousa/ja_jp.yml +158 -1
  9. data/i18n/KizunaBullet/ja_jp.yml +653 -0
  10. data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
  11. data/i18n/SkynautsBouken/ja_jp.yml +114 -0
  12. data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
  13. data/i18n/UnsungDuet/ja_jp.yml +62 -0
  14. data/i18n/UnsungDuet/ko_kr.yml +62 -0
  15. data/i18n/en_us.yml +5 -0
  16. data/lib/bcdice/arithmetic/parser.rb +4 -2
  17. data/lib/bcdice/base.rb +1 -1
  18. data/lib/bcdice/command/parser.rb +4 -2
  19. data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
  20. data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
  21. data/lib/bcdice/common_command/calc/parser.rb +4 -2
  22. data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
  23. data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
  24. data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
  25. data/lib/bcdice/dice_table/range_table.rb +24 -0
  26. data/lib/bcdice/game_system/Agnostos.rb +248 -0
  27. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  28. data/lib/bcdice/game_system/Alsetto.rb +2 -2
  29. data/lib/bcdice/game_system/AniMalus.rb +261 -0
  30. data/lib/bcdice/game_system/Arianrhod_Korean.rb +30 -0
  31. data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
  32. data/lib/bcdice/game_system/Avandner.rb +1 -1
  33. data/lib/bcdice/game_system/BBN.rb +1 -1
  34. data/lib/bcdice/game_system/BadLife.rb +3 -3
  35. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  36. data/lib/bcdice/game_system/BlackJacket.rb +244 -0
  37. data/lib/bcdice/game_system/Chill3.rb +6 -6
  38. data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
  39. data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
  40. data/lib/bcdice/game_system/CyberpunkRed.rb +14 -4
  41. data/lib/bcdice/game_system/DarkSouls.rb +1 -1
  42. data/lib/bcdice/game_system/DivineCharger.rb +841 -0
  43. data/lib/bcdice/game_system/Elric.rb +1 -1
  44. data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
  45. data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
  46. data/lib/bcdice/game_system/FullFace.rb +121 -0
  47. data/lib/bcdice/game_system/FutariSousa.rb +88 -8
  48. data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
  49. data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
  50. data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
  51. data/lib/bcdice/game_system/Irisbane.rb +1 -1
  52. data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
  53. data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
  54. data/lib/bcdice/game_system/KyokoShinshoku.rb +201 -0
  55. data/lib/bcdice/game_system/Liminal.rb +136 -0
  56. data/lib/bcdice/game_system/MetalHead.rb +1 -1
  57. data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
  58. data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
  59. data/lib/bcdice/game_system/NRR.rb +122 -0
  60. data/lib/bcdice/game_system/NSSQ.rb +1 -1
  61. data/lib/bcdice/game_system/NightWizard.rb +1 -1
  62. data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
  63. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  64. data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
  65. data/lib/bcdice/game_system/Postman.rb +3 -3
  66. data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
  67. data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +1 -1
  68. data/lib/bcdice/game_system/Ryutama.rb +4 -4
  69. data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
  70. data/lib/bcdice/game_system/Siren.rb +97 -0
  71. data/lib/bcdice/game_system/Skynauts.rb +1 -1
  72. data/lib/bcdice/game_system/SkynautsBouken.rb +45 -130
  73. data/lib/bcdice/game_system/Strave.rb +1 -1
  74. data/lib/bcdice/game_system/SwordWorld.rb +1 -1
  75. data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +228 -0
  76. data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
  77. data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
  78. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  79. data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
  80. data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
  81. data/lib/bcdice/game_system/UnsungDuet.rb +17 -75
  82. data/lib/bcdice/game_system/UnsungDuet_Korean.rb +41 -0
  83. data/lib/bcdice/game_system/Utakaze.rb +55 -2
  84. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +12 -6
  85. data/lib/bcdice/game_system/Warhammer4.rb +124 -3
  86. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +12 -6
  87. data/lib/bcdice/game_system/Yotabana.rb +62 -0
  88. data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
  89. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
  90. data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
  91. data/lib/bcdice/game_system/sword_world/rating_parser.rb +4 -2
  92. data/lib/bcdice/game_system.rb +24 -0
  93. data/lib/bcdice/loader.rb +1 -1
  94. data/lib/bcdice/version.rb +1 -1
  95. metadata +55 -5
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TheUnofficialHollowKnightRPG < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TheUnofficialHollowKnightRPG'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'The Unofficial Hollow Knight RPG'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'しあんおふいしやるほろうないとRPG'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ・能力値判定 [n]AD[+b][#r][>=t]
18
+  n: 能力値。小数可。省略不可。
19
+  b: ボーナス、ペナルティダイス。省略可。
20
+  r: 追加リロールダイス数。省略可。
21
+  t: 目標値。>=含めて省略可。
22
+  成功数を判定。
23
+  例)1AD, 2.5AD, 1.5AD+1, 2AD#1, 2.5AD+2#2>=4
24
+
25
+ ・イニシアチブ [n]INTI[+b][#r]
26
+  n: イニシアチブに使う能力値。省略不可。
27
+ b: ボーナス、ペナルティダイス。省略可。
28
+ r: 追加リロールダイス数。省略可。
29
+  振り直しを行ったうえでイニシアチブ値を計算。
30
+  例)1INTI, 2.5INTI, 1.5INTI+1, 2INTI#1, 2.5INTI+2#2
31
+ INFO_MESSAGE_TEXT
32
+
33
+ register_prefix('(\d+\.?\d*)?AD([+-](\d+))?(#(\d+))?(>=(\d+))?', '(\d+\.?\d*)?(INTI|inti)([+-](\d+))?(#(\d+))?')
34
+
35
+ def initialize(command)
36
+ super(command)
37
+
38
+ @sort_barabara_dice = false # バラバラロール(Bコマンド)でソート無
39
+ end
40
+
41
+ def eval_game_system_specific_command(command)
42
+ ability_roll(command) || initiative_roll(command)
43
+ end
44
+
45
+ def number_with_sign_from_int(number)
46
+ if number == 0
47
+ return ""
48
+ elsif number > 0
49
+ return "+#{number.abs}"
50
+ elsif number < 0
51
+ return "-#{number.abs}"
52
+ else
53
+ return number.to_s
54
+ end
55
+ end
56
+
57
+ def number_with_reroll_from_int(number)
58
+ if number == 0
59
+ return ""
60
+ elsif number > 0
61
+ return "\##{number}"
62
+ else
63
+ return number.to_s
64
+ end
65
+ end
66
+
67
+ # 能力値ロール
68
+ def ability_roll(command)
69
+ m = /^(\d+\.?\d*)?AD([+-](\d+))?(#(\d*))?(>=(\d+))?/.match(command)
70
+ unless m
71
+ return nil
72
+ end
73
+
74
+ num_of_die = m[1].to_f
75
+ bonus = m[3].to_i
76
+ reroll = m[5].to_i
77
+ difficulty = m[7].to_i
78
+
79
+ if /\.[1-9]+/ =~ num_of_die.to_s
80
+ dice_command = "#{num_of_die}AD#{number_with_sign_from_int(bonus)}#{number_with_reroll_from_int(reroll)}"
81
+ reroll += 1
82
+ else
83
+ dice_command = "#{num_of_die.to_i}AD#{number_with_sign_from_int(bonus)}#{number_with_reroll_from_int(reroll)}"
84
+ end
85
+
86
+ if difficulty == 0
87
+ difficulty = 5
88
+ else
89
+ dice_command += ">=#{difficulty}"
90
+ end
91
+
92
+ # 振られたダイスを入れる
93
+ values = @randomizer.roll_barabara(num_of_die.to_i + bonus, 6)
94
+ # 成功数
95
+ result = values.count { |num| num >= difficulty }
96
+ failed_roll = num_of_die.to_i - result
97
+
98
+ # ロールの結果の文字列
99
+ rolled_text = "[" + values.join(",") + "]"
100
+
101
+ reroll_values = []
102
+
103
+ if reroll == 1
104
+ reroll_values.push(@randomizer.roll_once(6))
105
+ elsif reroll > 1
106
+ reroll_values += @randomizer.roll_barabara(reroll, 6)
107
+ end
108
+
109
+ reroll_result = reroll_values.count { |num| num >= difficulty }
110
+ if failed_roll < reroll_result
111
+ reroll_result = failed_roll
112
+ end
113
+ result += reroll_result
114
+
115
+ # リロールの結果の文字列をロールの結果の文字列に追加する
116
+ unless reroll_values.empty?
117
+ rolled_text += " Reroll [" + reroll_values.join(",") + "]"
118
+ end
119
+
120
+ # 結果
121
+ return "(#{dice_command}) > #{rolled_text} > #{result}成功"
122
+ end
123
+
124
+ # イニシアチブロール
125
+ def initiative_roll(command)
126
+ m = /^(\d+\.?\d*)?(INTI|inti)([+-](\d+))?(#(\d+))?/.match(command)
127
+ unless m
128
+ return nil
129
+ end
130
+
131
+ grace = m[1].to_f
132
+ bonus = m[3].to_i
133
+ reroll = m[6].to_i
134
+
135
+ if /\.[1-9]+/ =~ grace.to_s
136
+ dice_command = "(#{grace}INTI#{number_with_sign_from_int(bonus)}#{number_with_reroll_from_int(reroll)})"
137
+ reroll += 1
138
+ else
139
+ dice_command = "(#{grace.to_i}INTI#{number_with_sign_from_int(bonus)}#{number_with_reroll_from_int(reroll)})"
140
+ end
141
+
142
+ values = @randomizer.roll_barabara(grace + bonus, 6)
143
+
144
+ revalue = []
145
+ unless reroll == 0
146
+ revalue = @randomizer.roll_barabara(reroll, 6)
147
+ end
148
+ revalue = revalue.sort
149
+
150
+ result = 0
151
+
152
+ res_text = "["
153
+ values.each do |value|
154
+ if revalue.empty? # リロールがなければ
155
+ res_text += value.to_s
156
+ result += value
157
+ else # リロールがあったら
158
+ is_min = false
159
+ index = -1
160
+ revalue.each do |re|
161
+ index += 1
162
+ next unless re > value # リロールしたダイス最小値か
163
+
164
+ res_text += "#{value}<<#{re}"
165
+ result += re
166
+ revalue.delete_at(index)
167
+ is_min = true
168
+ break
169
+ end
170
+ unless is_min # 最小値でなかったら
171
+ res_text += value.to_s
172
+ result += value
173
+ end
174
+ end
175
+
176
+ res_text += ","
177
+ end
178
+ res_text = res_text.chop
179
+ res_text += "]"
180
+
181
+ return "#{dice_command} > #{res_text} > #{result}"
182
+ end
183
+ end
184
+ end
185
+ end
@@ -73,7 +73,7 @@ module BCDice
73
73
 
74
74
  return result if target == 0
75
75
 
76
- if successValue >= target
76
+ if successValue >= target
77
77
  result += " > 【成功】"
78
78
  else
79
79
  result += " > 【失敗】"
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class TrailOfCthulhu < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'TrailOfCthulhu'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'トレイル・オブ・クトゥルー'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'とれいるおふくとうるう'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGETEXT
17
+ ■技能判定 TCb[>=t] b:消費プール・ポイント t:難易度(省略可能)
18
+
19
+ 例)TC2>=5:消費プール・ポイント2,難易度5で技能判定し、その結果を表示する。
20
+ TC>=3: 難易度3で技能判定し、その結果を表示する。
21
+ TC: 難易度指定せずに技能判定する。
22
+ TC3: 消費プール・ポイント3,難易度指定せずに技能判定する。
23
+
24
+ ■神話的狂気表 MMT[a,b] a,b:除外する神話的狂気(省略時は全神話的狂気を表示する)
25
+
26
+ 例)MMT[1,8]: 神話的狂気のうち、1番と8番を除外してロールし、神話的狂気を決定する。
27
+ MMT2,6: 神話的狂気のうち、2番と6番を除外してロールし、神話的狂気を決定する。
28
+ MMT: 神話的狂気を1番から8番まで列挙する。
29
+
30
+ INFO_MESSAGETEXT
31
+
32
+ register_prefix("TC", "MMT")
33
+
34
+ def initialize(command)
35
+ super(command)
36
+
37
+ @round_type = RoundType::CEIL
38
+ end
39
+
40
+ def eval_game_system_specific_command(command)
41
+ resolute_action(command) ||
42
+ roll_mythos_madness_table(command)
43
+ end
44
+
45
+ private
46
+
47
+ # 技能判定
48
+ # @param [String] command
49
+ # @return [Result]
50
+ def resolute_action(command)
51
+ m = /^TC([+\d]*)(>=(\d+))?/.match(command)
52
+ return nil unless m
53
+
54
+ bonus =
55
+ if m[1].empty?
56
+ 0
57
+ else
58
+ Arithmetic.eval(m[1], @round_type)
59
+ end
60
+
61
+ if bonus.nil?
62
+ return nil
63
+ end
64
+
65
+ difficulty = m[3].to_i
66
+
67
+ dice = @randomizer.roll_once(6)
68
+ total = dice + bonus
69
+
70
+ return Result.new.tap do |result|
71
+ if difficulty > 0
72
+ result.condition = (total >= difficulty)
73
+
74
+ sequence = [
75
+ "(TC#{bonus}>=#{difficulty})",
76
+ "#{dice}+#{bonus}",
77
+ total.to_s,
78
+ result.success? ? "成功" : "失敗"
79
+ ].compact
80
+ else
81
+ sequence = [
82
+ "(TC#{bonus})",
83
+ "#{dice}+#{bonus}",
84
+ total.to_s,
85
+ ].compact
86
+ end
87
+
88
+ result.text = sequence.join(" > ")
89
+ end
90
+ end
91
+
92
+ # 神話的狂気表
93
+ MITHOS_MADDNESS = [
94
+ "1:強迫性障害",
95
+ "2:恐怖症",
96
+ "3:誇大妄想狂",
97
+ "4:殺人狂",
98
+ "5:恣意的記憶喪失",
99
+ "6:多重人格障害",
100
+ "7:偏執症",
101
+ "8:妄想症",
102
+ ].freeze
103
+
104
+ def roll_mythos_madness_table(command)
105
+ m = /^MMT(\[?([1-8],[1-8])\]?)?/.match(command)
106
+ return nil unless m
107
+
108
+ sequence = []
109
+ result_text = ""
110
+ if m[1]
111
+ exclusion_number = m[2].split(',')
112
+ return nil unless exclusion_number.length == 2
113
+
114
+ sequence = ["(MMT[#{exclusion_number.join(',')}])"]
115
+ is_exclusion_number = true
116
+ while is_exclusion_number
117
+ idx = @randomizer.roll_once(8).to_i
118
+ if idx != exclusion_number[0].to_i && idx != exclusion_number[1].to_i
119
+ result_text = MITHOS_MADDNESS[idx - 1]
120
+ is_exclusion_number = false
121
+ end
122
+ end
123
+ else
124
+ sequence = ["(MMT)"]
125
+ mithos_maddness_all = []
126
+ (1..8).each do |i|
127
+ mithos_maddness_all.push(MITHOS_MADDNESS[i - 1])
128
+ end
129
+ result_text = mithos_maddness_all.join(", ")
130
+ end
131
+
132
+ return Result.new.tap do |result|
133
+ sequence.push(result_text)
134
+ result.text = sequence.join(" > ")
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -355,7 +355,7 @@ module BCDice
355
355
  '武器防具の名前(ソード、メイルなど)',
356
356
  '自然現象の名前(カザンハリケーンなど)',
357
357
  '機械の名前(洗濯機、テレビなど)',
358
- '目についた物の名前(シャーペン、メガネなど)', # 100
358
+ '目についた物の名前(シャーペン、メガネなど)', # 100
359
359
  ]
360
360
  )
361
361
  end
@@ -40,7 +40,7 @@ module BCDice
40
40
 
41
41
  roll_replaced_command_if_match(command, SHIFTER_ALIAS_REG, "1D10") ||
42
42
  roll_replaced_command_if_match(command, BINDER_ALIAS_REG, "2D6") ||
43
- roll_tables(command, TABLES)
43
+ roll_tables(command, self.class::TABLES)
44
44
  end
45
45
 
46
46
  def roll_replaced_command_if_match(command, regexp, dist)
@@ -58,80 +58,22 @@ module BCDice
58
58
  "HOther" => "HOT",
59
59
  }.transform_keys(&:upcase)
60
60
 
61
- TABLES = {
62
- "HIN" => DiceTable::Table.new(
63
- "変異表:外傷",
64
- "1D6",
65
- [
66
- "顔の傷 顔にできた傷。じわりと血がにじむ",
67
- "大きな怪我 早く手当てをしないと命に関わる",
68
- "痛みのない傷 大きな傷なのに、なぜか痛くない",
69
- "喪失 身体のどこかが消えてしまった",
70
- "文字のような傷跡 読めない文字のような傷",
71
- "模様を描くアザ 模様のような、身体にできたアザ",
72
- ]
73
- ),
74
- "HPH" => DiceTable::Table.new(
75
- "変異表:体調の変化",
76
- "1D6",
77
- [
78
- "視界がぼやける → 目の焦点が合わない",
79
- "耳鳴り → ずっと甲高い音が鳴り続けている気がする",
80
- "異様な寒気 → 凍えそうなほどに寒く感じる",
81
- "発汗 → 暑いわけでもないのに、汗がだらだらと",
82
- "幻覚 → それが本物か幻か、区別がつかない",
83
- "走馬灯 → 過去のことを次々と思い出してしまう",
84
- ]
85
- ),
86
- "HFE" => DiceTable::Table.new(
87
- "変異表:恐怖",
88
- "1D6",
89
- [
90
- "不安 → 漠然とした不安が心を蝕む",
91
- "狭い場所が怖い → 狭い場所に入りたくない",
92
- "震えが止まらない → どうしても落ち着かない",
93
- "物音が怖い → ほんの小さな物音にも怯えてしまう",
94
- "暗い場所が怖い → 灯りのない場所がひどく恐ろしい",
95
- "誰かがついてくる → 誰かが後ろにいる気がする……",
96
- ]
97
- ),
98
- "HFA" => DiceTable::Table.new(
99
- "変異表:幻想化",
100
- "1D6",
101
- [
102
- "硝子化 → 身体の一部がガラスのように透明に",
103
- "羽毛化 → 身体のどこかから羽毛が生えてくる",
104
- "植物化 → ツタや葉が身体から生えてくる",
105
- "動物の瞳 → 瞳の形が動物のそれに変わってしまう",
106
- "有角化 → 額や側頭部から角が生えてくる",
107
- "陶器化 → 皮膚が陶器のようなものに変わっていく",
108
- ]
109
- ),
110
- "HMI" => DiceTable::Table.new(
111
- "変異表:精神",
112
- "1D6",
113
- [
114
- "記憶の混乱 → ここはどこ、どうしてこんなところに?",
115
- "幼少期の記憶 → 口調や態度が幼くなってしまう",
116
- "素直 → 思ったことを全部言ってしまう",
117
- "蛮勇 → パートナーを守るために無茶ばかりする",
118
- "疑心暗鬼 → 何もかもが悪い方向にしか考えられない",
119
- "食べちゃいたい → パートナーをかじりたくなる",
120
- ]
121
- ),
122
- "HOT" => DiceTable::Table.new(
123
- "変異表:そのほか",
124
- "1D6",
125
- [
126
- "影絵化 → 身体の一部が影のようになる",
127
- "水槽化 → 身体の一部が水槽のようなものになる",
128
- "涙が止まらない → なぜか涙が流れ続ける",
129
- "鉤爪 → 手や足が、獣のような鉤爪になる",
130
- "未来視 → 未来が見えてしまう。本当かどうかは不明",
131
- "帰りたくない → 現実に帰りたくないと微かに思う",
132
- ]
133
- ),
134
- }.freeze
61
+ class << self
62
+ private
63
+
64
+ def translate_tables(locale)
65
+ {
66
+ "HIN" => DiceTable::Table.from_i18n('UnsungDuet.MutatingInjuryTable', locale),
67
+ "HPH" => DiceTable::Table.from_i18n('UnsungDuet.MutatingPhysicalConditionTable', locale),
68
+ "HFE" => DiceTable::Table.from_i18n('UnsungDuet.MutatingFearTable', locale),
69
+ "HFA" => DiceTable::Table.from_i18n('UnsungDuet.MutatingFantasyTable', locale),
70
+ "HMI" => DiceTable::Table.from_i18n('UnsungDuet.MutatingMindTable', locale),
71
+ "HOT" => DiceTable::Table.from_i18n('UnsungDuet.MutatingOtherTable', locale),
72
+ }.freeze
73
+ end
74
+ end
75
+
76
+ TABLES = translate_tables(:ja_jp)
135
77
 
136
78
  register_prefix(ALIAS.keys, TABLES.keys)
137
79
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/UnsungDuet"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class UnsungDuet_Korean < UnsungDuet
8
+ ID = 'UnsungDuet:Korean'
9
+ NAME = '언성 듀엣'
10
+ SORT_KEY = '国際化:Korean:언성 듀엣'
11
+
12
+ HELP_MESSAGE = <<~MESSAGETEXT
13
+ ■ 시프터 용 판정 (shifter, UDS)
14
+ 1D10을 다이스롤 해서 판정을 행합니다.
15
+ 예) shifter, UDS, shifter>=5, shifter+1>=6
16
+
17
+ ■ 바인더 용 판정 (binder, UDB)
18
+ 2D6을 다이스롤 해서 판정을 행합니다.
19
+ 예) binder, UDB, binder>=5, binder+1>=6
20
+
21
+ ■ 변이표
22
+ ・상처 (HIN, HInjury)
23
+ ・몸 상태의 변화 (HPH, HPhysical)
24
+ ・공포 (HFE, HFear)
25
+ ・환상화 (HFA, HFantasy)
26
+ ・정신 (HMI, HMind)
27
+ ・기타 (HOT, HOther)
28
+ MESSAGETEXT
29
+
30
+ register_prefix_from_super_class()
31
+
32
+ def initialize(command)
33
+ super(command)
34
+
35
+ @locale = :ko_kr
36
+ end
37
+
38
+ TABLES = translate_tables(:ko_kr)
39
+ end
40
+ end
41
+ end
@@ -26,14 +26,19 @@ module BCDice
26
26
  cに「龍のダイス目」を指定した行為判定ロール。
27
27
  ゾロ目ではなく、cと同じ値の出目数x2が成功レベルとなります。難易度の指定も可能です。
28
28
  例)3UK@5 :龍のダイス「月」でクリティカルコール宣言したサイコロ3個の行為判定
29
+ ・対抗判定ロール(nUR[@c], nUO[@c]) n:ダイス数 c:クリティカルコール
30
+  行為判定ロールと同様にロールするが、最期に成功レベルとセット数から求めたマジックナンバーが表示される。
31
+  マジックナンバーの大きいものが成功、同値は引き分け。
32
+  ダイスは18個まで対応。
29
33
  MESSAGETEXT
30
34
 
31
- register_prefix('\d*UK')
35
+ register_prefix('\d*U[KRO]')
32
36
 
33
37
  def eval_game_system_specific_command(command)
34
38
  debug('eval_game_system_specific_command command', command)
35
39
 
36
- check_roll(command)
40
+ check_roll(command) ||
41
+ opposed_roll(command)
37
42
  end
38
43
 
39
44
  private
@@ -103,6 +108,54 @@ module BCDice
103
108
  end
104
109
  end
105
110
 
111
+ # 対抗判定
112
+ def opposed_roll(command)
113
+ m = /^(\d+)?U[R|O](@?(\d))?$/i.match(command)
114
+ return nil unless m
115
+
116
+ base = (m[1] || 2).to_i
117
+ crit = m[3].to_i
118
+
119
+ base = getValue(base)
120
+ crit = getValue(crit)
121
+
122
+ return nil if base < 1 || base > 18
123
+
124
+ crit = 6 if crit > 6
125
+
126
+ dice_list = @randomizer.roll_barabara(base, 6).sort
127
+ result = get_opposed_roll_result(dice_list, crit)
128
+
129
+ sequence = [
130
+ command,
131
+ "(#{base}D6)",
132
+ "[#{dice_list.join(',')}]",
133
+ result.text
134
+ ]
135
+ result.text = sequence.join(" > ")
136
+
137
+ return result
138
+ end
139
+
140
+ def get_opposed_roll_result(diceList, crit)
141
+ success, maxnum, setCount = getSuccessInfo(diceList, crit)
142
+
143
+ sequence = []
144
+
145
+ if isDragonDice(crit)
146
+ sequence.push("龍のダイス「#{DRAGON_DICE_NAME[crit]}」(#{crit})を使用")
147
+ end
148
+
149
+ if success
150
+ sequence.push("成功レベル:#{maxnum} (#{setCount}セット)")
151
+ sequence.push("(" + format("%#02d%#1d", maxnum, setCount) + ")")
152
+ return Result.success(sequence.join(" > ")) # 出力上は成功として扱う
153
+ else
154
+ sequence.push("(000)")
155
+ return Result.failure(sequence.join(" > "))
156
+ end
157
+ end
158
+
106
159
  def getSuccessInfo(diceList, crit)
107
160
  debug("checkSuccess diceList, crit", diceList, crit)
108
161
 
@@ -65,16 +65,16 @@ module BCDice
65
65
 
66
66
  dice_pool, hunger_dice_pool = get_dice_pools(m)
67
67
  if dice_pool < 0
68
- return "ダイスプールより多いHungerダイスは指定できません。"
68
+ return "ダイスプール0のときにHungerダイスは指定できません。"
69
69
  end
70
- if hunger_dice_pool && hunger_dice_pool > 5
70
+ if hunger_dice_pool > 5
71
71
  return "Hungerダイス指定は5ダイスが最大です。"
72
72
  end
73
73
 
74
74
  dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
75
75
  result_text = "(#{dice_pool}D10"
76
76
 
77
- if hunger_dice_pool
77
+ if hunger_dice_pool >= 0
78
78
  hunger_dice_text, hunger_success_dice, hunger_ten_dice, hunger_botch_dice = make_dice_roll(hunger_dice_pool)
79
79
 
80
80
  ten_dice += hunger_ten_dice
@@ -100,11 +100,17 @@ module BCDice
100
100
  hunger_dice_included_command = m[COMMAND_HUNGER_DICE_INCLUDED_INDEX]
101
101
  if hunger_dice_included_command && hunger_dice_included_command == "VMI"
102
102
  # Hunger Diceを内数処理するの場合
103
- hunger_dice_pool = m[HUNGER_DICE_INCLUDED_INDEX]&.to_i
104
- dice_pool = m[DICE_POOL_HUNGER_DICE_INCLUDED_INDEX].to_i - (hunger_dice_pool || 0)
103
+ hunger_dice_pool = m[HUNGER_DICE_INCLUDED_INDEX].nil? ? -1 : m[HUNGER_DICE_INCLUDED_INDEX].to_i
104
+ dice_pool_value = m[DICE_POOL_HUNGER_DICE_INCLUDED_INDEX].to_i
105
+ dice_pool = dice_pool_value - (hunger_dice_pool < 0 ? 0 : hunger_dice_pool)
106
+ if dice_pool_value > 0 && hunger_dice_pool >= dice_pool_value
107
+ # 1 以上のダイスプール、かつ、Hungerダイスがダイスプール以上のとき、ダイスプールが全てHungerダイスになる。
108
+ dice_pool = 0
109
+ hunger_dice_pool = dice_pool_value
110
+ end
105
111
  else
106
112
  # Hunger DiceがPLによる内数指定の場合
107
- hunger_dice_pool = m[HUNGER_DICE_NO_INCLUDED_INDEX]&.to_i
113
+ hunger_dice_pool = m[HUNGER_DICE_NO_INCLUDED_INDEX].nil? ? -1 : m[HUNGER_DICE_NO_INCLUDED_INDEX].to_i
108
114
  dice_pool = m[DICE_POOL_HUNGER_DICE_NO_INCLUDED_INDEX].to_i
109
115
  end
110
116
  return dice_pool, hunger_dice_pool