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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +72 -0
- data/i18n/Arianrhod/ko_kr.yml +3 -0
- data/i18n/Cthulhu/en_us.yml +11 -0
- data/i18n/CyberpunkRed/ja_jp.yml +389 -0
- data/i18n/FinalFantasyXIV/en_us.yml +4 -0
- data/i18n/FinalFantasyXIV/ja_jp.yml +4 -0
- data/i18n/FutariSousa/ja_jp.yml +158 -1
- data/i18n/KizunaBullet/ja_jp.yml +653 -0
- data/i18n/MonotoneMuseum/ja_jp.yml +246 -14
- data/i18n/SkynautsBouken/ja_jp.yml +114 -0
- data/i18n/TensaiGunshiNiNaro/ja_jp.yml +126 -0
- data/i18n/UnsungDuet/ja_jp.yml +62 -0
- data/i18n/UnsungDuet/ko_kr.yml +62 -0
- data/i18n/en_us.yml +5 -0
- data/lib/bcdice/arithmetic/parser.rb +4 -2
- data/lib/bcdice/base.rb +1 -1
- data/lib/bcdice/command/parser.rb +4 -2
- data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/calc/parser.rb +4 -2
- data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
- data/lib/bcdice/dice_table/range_table.rb +24 -0
- data/lib/bcdice/game_system/Agnostos.rb +248 -0
- data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
- data/lib/bcdice/game_system/Alsetto.rb +2 -2
- data/lib/bcdice/game_system/AniMalus.rb +261 -0
- data/lib/bcdice/game_system/Arianrhod_Korean.rb +30 -0
- data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
- data/lib/bcdice/game_system/Avandner.rb +1 -1
- data/lib/bcdice/game_system/BBN.rb +1 -1
- data/lib/bcdice/game_system/BadLife.rb +3 -3
- data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
- data/lib/bcdice/game_system/BlackJacket.rb +244 -0
- data/lib/bcdice/game_system/Chill3.rb +6 -6
- data/lib/bcdice/game_system/ConvictorDrive.rb +5 -4
- data/lib/bcdice/game_system/Cthulhu_English.rb +59 -0
- data/lib/bcdice/game_system/CyberpunkRed.rb +14 -4
- data/lib/bcdice/game_system/DarkSouls.rb +1 -1
- data/lib/bcdice/game_system/DivineCharger.rb +841 -0
- data/lib/bcdice/game_system/Elric.rb +1 -1
- data/lib/bcdice/game_system/FinalFantasyXIV.rb +115 -0
- data/lib/bcdice/game_system/FinalFantasyXIV_English.rb +39 -0
- data/lib/bcdice/game_system/FullFace.rb +121 -0
- data/lib/bcdice/game_system/FutariSousa.rb +88 -8
- data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
- data/lib/bcdice/game_system/Insane_Korean.rb +1 -1
- data/lib/bcdice/game_system/InvisibleLiar.rb +79 -0
- data/lib/bcdice/game_system/Irisbane.rb +1 -1
- data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
- data/lib/bcdice/game_system/KizunaBullet.rb +240 -0
- data/lib/bcdice/game_system/KyokoShinshoku.rb +201 -0
- data/lib/bcdice/game_system/Liminal.rb +136 -0
- data/lib/bcdice/game_system/MetalHead.rb +1 -1
- data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
- data/lib/bcdice/game_system/MonotoneMuseum.rb +14 -1
- data/lib/bcdice/game_system/NRR.rb +122 -0
- data/lib/bcdice/game_system/NSSQ.rb +1 -1
- data/lib/bcdice/game_system/NightWizard.rb +1 -1
- data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
- data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
- data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
- data/lib/bcdice/game_system/Postman.rb +3 -3
- data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +1 -1
- data/lib/bcdice/game_system/Ryutama.rb +4 -4
- data/lib/bcdice/game_system/ShuumatsuBargainWars.rb +203 -0
- data/lib/bcdice/game_system/Siren.rb +97 -0
- data/lib/bcdice/game_system/Skynauts.rb +1 -1
- data/lib/bcdice/game_system/SkynautsBouken.rb +45 -130
- data/lib/bcdice/game_system/Strave.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +1 -1
- data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +228 -0
- data/lib/bcdice/game_system/TheOneRing2nd.rb +406 -0
- data/lib/bcdice/game_system/TheUnofficialHollowKnightRPG.rb +185 -0
- data/lib/bcdice/game_system/TherapieSein.rb +1 -1
- data/lib/bcdice/game_system/TrailOfCthulhu.rb +139 -0
- data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
- data/lib/bcdice/game_system/UnsungDuet.rb +17 -75
- data/lib/bcdice/game_system/UnsungDuet_Korean.rb +41 -0
- data/lib/bcdice/game_system/Utakaze.rb +55 -2
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +12 -6
- data/lib/bcdice/game_system/Warhammer4.rb +124 -3
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +12 -6
- data/lib/bcdice/game_system/Yotabana.rb +62 -0
- data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
- data/lib/bcdice/game_system/cyberpunk_red/tables.rb +111 -473
- data/lib/bcdice/game_system/kizuna_bullet/tables.rb +171 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +4 -2
- data/lib/bcdice/game_system.rb +24 -0
- data/lib/bcdice/loader.rb +1 -1
- data/lib/bcdice/version.rb +1 -1
- 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
|
@@ -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
|
@@ -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
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
"
|
67
|
-
"
|
68
|
-
"
|
69
|
-
"
|
70
|
-
"
|
71
|
-
"
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
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*
|
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 "
|
68
|
+
return "ダイスプール0のときにHungerダイスは指定できません。"
|
69
69
|
end
|
70
|
-
if hunger_dice_pool
|
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]
|
104
|
-
|
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]
|
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
|