bcdice 3.14.0 → 3.16.1
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 +88 -0
- data/i18n/Cthulhu/zh_hant.yml +1 -1
- data/i18n/CyberpunkRed/ko_kr.yml +389 -0
- data/i18n/DoubleCross/ja_jp.yml +53 -0
- data/i18n/DoubleCross/ko_kr.yml +52 -0
- data/i18n/Emoklore/ko_kr.yml +7 -0
- data/i18n/FutariSousa/ja_jp.yml +138 -138
- data/i18n/KillDeathBusiness/ja_jp.yml +198 -0
- data/i18n/MagicaLogia/ko_kr.yml +2 -2
- data/i18n/MonotoneMuseum/ko_kr.yml +227 -0
- data/i18n/SkynautsBouken/ja_jp.yml +28 -28
- data/i18n/SkynautsBouken/ko_kr.yml +114 -0
- data/i18n/StratoShout/ko_kr.yml +102 -102
- data/i18n/zh_hant.yml +5 -0
- data/lib/bcdice/game_system/Aionia.rb +131 -0
- data/lib/bcdice/game_system/Arianrhod_Korean.rb +2 -0
- data/lib/bcdice/game_system/ArknightsFan.rb +245 -87
- data/lib/bcdice/game_system/BlackJacket_Korean.rb +244 -0
- data/lib/bcdice/game_system/CharonSanctions.rb +112 -0
- data/lib/bcdice/game_system/Cthulhu7th.rb +1 -1
- data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/full_auto.rb +293 -0
- data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional/rollable.rb +43 -0
- data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +470 -306
- data/lib/bcdice/game_system/CyberpunkRed.rb +1 -2
- data/lib/bcdice/game_system/CyberpunkRed_Korean.rb +66 -0
- data/lib/bcdice/game_system/DoubleCross.rb +18 -1
- data/lib/bcdice/game_system/DoubleCross_Korean.rb +5 -1
- data/lib/bcdice/game_system/EdgeFlippers.rb +315 -0
- data/lib/bcdice/game_system/Emoklore_Korean.rb +42 -0
- data/lib/bcdice/game_system/FullFace.rb +25 -3
- data/lib/bcdice/game_system/FutariSousa.rb +17 -5
- data/lib/bcdice/game_system/Garactier.rb +479 -0
- data/lib/bcdice/game_system/GardenOrder.rb +390 -9
- data/lib/bcdice/game_system/GundogRevised.rb +8 -8
- data/lib/bcdice/game_system/JuinKansen_Korean.rb +251 -0
- data/lib/bcdice/game_system/KillDeathBusiness.rb +155 -3
- data/lib/bcdice/game_system/KimitoYell.rb +568 -0
- data/lib/bcdice/game_system/Magius.rb +125 -0
- data/lib/bcdice/game_system/Magius_3rdNewTokyoCity.rb +62 -0
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +122 -2
- data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
- data/lib/bcdice/game_system/NSSQ.rb +17 -9
- data/lib/bcdice/game_system/NervWhitePaper.rb +129 -0
- data/lib/bcdice/game_system/Revulture_Korean.rb +125 -0
- data/lib/bcdice/game_system/RogueLikeHalf.rb +198 -0
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +16 -13
- data/lib/bcdice/game_system/ShinobiGami.rb +73 -43
- data/lib/bcdice/game_system/SkynautsBouken.rb +4 -4
- data/lib/bcdice/game_system/SkynautsBouken_Korean.rb +57 -0
- data/lib/bcdice/game_system/StratoShout_Korean.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +4 -0
- data/lib/bcdice/game_system/SwordWorld2_5.rb +3 -2
- data/lib/bcdice/game_system/TensaiGunshiNiNaro.rb +51 -17
- data/lib/bcdice/game_system/TheIndieHack.rb +82 -0
- data/lib/bcdice/game_system/TorgEternity.rb +35 -6
- data/lib/bcdice/game_system/Ventangle_Korean.rb +130 -0
- data/lib/bcdice/game_system/WoW.rb +161 -0
- data/lib/bcdice/game_system/YankeeMustDie.rb +192 -0
- data/lib/bcdice/game_system/YearZeroEngine.rb +225 -28
- data/lib/bcdice/game_system/YuMyoKishi.rb +141 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/atoz_table.rb +1184 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/randr236_table.rb +254 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +54 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/tk_table.rb +755 -0
- data/lib/bcdice/game_system/sword_world/rating_lexer.rb +1 -0
- data/lib/bcdice/game_system/sword_world/rating_options.rb +4 -1
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +5 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +129 -115
- data/lib/bcdice/game_system.rb +20 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +31 -6
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bcdice/game_system/Revulture"
|
4
|
+
|
5
|
+
module BCDice
|
6
|
+
module GameSystem
|
7
|
+
class Revulture_Korean < Revulture
|
8
|
+
# ゲームシステムの識別子
|
9
|
+
ID = 'Revulture:Korean'
|
10
|
+
|
11
|
+
# ゲームシステム名
|
12
|
+
NAME = '광쇄의 리벌처'
|
13
|
+
|
14
|
+
# ゲームシステム名の読みがな
|
15
|
+
SORT_KEY = '国際化:Korean:광쇄의 리벌처'
|
16
|
+
|
17
|
+
# ダイスボットの使い方
|
18
|
+
HELP_MESSAGE = <<~HELP
|
19
|
+
■공격 판정( xAT, xATK, xATTACK )
|
20
|
+
x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
|
21
|
+
예시) 3AT, 4ATK, 5+6ATTACK, 15/2AT
|
22
|
+
|
23
|
+
□공격 판정 목표값 포함( xAT<=y, xATK<=y, xATTACK<=y )
|
24
|
+
x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
|
25
|
+
y: 목표값( 1 이상 6 이하. 덧셈 + 사용 가능)
|
26
|
+
예시) 3AT<=4, 3AT<=2+1
|
27
|
+
|
28
|
+
□공격 판정 목표값&추가 대미지 포함( xAT<=y[>=a:+b], xATK<=y[>=a:+b], xATTACK<=y[z] )
|
29
|
+
x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
|
30
|
+
y: 목표값( 1 이상 6 이하. 덧셈 + 사용 가능)
|
31
|
+
z: 추가 대미지 규칙(자세한 내용은 후술)(※여러 개를 동시에 지정 가능)
|
32
|
+
|
33
|
+
▽추가 대미지 규칙 [a:+b]
|
34
|
+
a: 히트 수가 a 라면
|
35
|
+
=a (히트 수가 a와 동일)
|
36
|
+
>=a (히트 수가 a 이상)
|
37
|
+
b: 대미지를 b 점 추가
|
38
|
+
|
39
|
+
예시) 3AT<=4[>=2:+3] #ルールブックp056「グレングラントAR」
|
40
|
+
예시) 2AT<=4[=1:+5][>=2:+8] #ルールブックp067「ファーボル・ドラゴンブレス」
|
41
|
+
HELP
|
42
|
+
|
43
|
+
ATTACK_ROLL_REG = %r{^(\d+([+/]\d+)*)?AT(TACK|K)?(<=([1-6](\+\d)*))?((\[>?=\d+:\+\d+\])+)?}i.freeze
|
44
|
+
register_prefix('\d+([+\/]\d+)*AT')
|
45
|
+
|
46
|
+
def eval_game_system_specific_command(command)
|
47
|
+
if (m = ATTACK_ROLL_REG.match(command))
|
48
|
+
roll_attack(m[1], m[5], m[7])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def roll_attack(dice_count_expression, border_expression, additional_damage_rules)
|
55
|
+
dice_count = Arithmetic.eval(dice_count_expression, RoundType::FLOOR)
|
56
|
+
border = Arithmetic.eval(border_expression, RoundType::FLOOR).clamp(1, 6) if border_expression
|
57
|
+
|
58
|
+
command = make_command_text(dice_count, border, additional_damage_rules)
|
59
|
+
|
60
|
+
if dice_count <= 0
|
61
|
+
return "#{command} > 주사위가 0개 입니다."
|
62
|
+
elsif border.nil? && additional_damage_rules
|
63
|
+
return "#{command} > 목표값이 지정되지 않아 추가 대미지를 계산할 수 없습니다."
|
64
|
+
end
|
65
|
+
|
66
|
+
dices = @randomizer.roll_barabara(dice_count, 6).sort
|
67
|
+
|
68
|
+
critical_hit_count = dices.count(1)
|
69
|
+
hit_count = dices.count { |dice| dice <= border } + critical_hit_count if border
|
70
|
+
damage = calc_damage(hit_count, additional_damage_rules)
|
71
|
+
|
72
|
+
message_elements = []
|
73
|
+
message_elements << command
|
74
|
+
message_elements << dices.join(',')
|
75
|
+
message_elements << "크리티컬 #{critical_hit_count}" if critical_hit_count > 0
|
76
|
+
message_elements << "히트 수 #{hit_count}" if hit_count
|
77
|
+
message_elements << "대미지 #{damage}" if damage
|
78
|
+
|
79
|
+
Result.new(message_elements.join(' > ')).tap do |r|
|
80
|
+
r.condition = hit_count > 0 if hit_count
|
81
|
+
r.critical = critical_hit_count > 0
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def make_command_text(dice_count, border, additional_damage_rules)
|
86
|
+
command = "#{dice_count}attack"
|
87
|
+
command += "<=#{border}" if border
|
88
|
+
command += additional_damage_rules if additional_damage_rules
|
89
|
+
|
90
|
+
"(#{command})"
|
91
|
+
end
|
92
|
+
|
93
|
+
def calc_damage(hit_count, additional_damage_rules)
|
94
|
+
return nil unless additional_damage_rules
|
95
|
+
|
96
|
+
damage = hit_count
|
97
|
+
parse_additional_damage_rules(additional_damage_rules).each do |rule|
|
98
|
+
if rule[:condition].call(hit_count)
|
99
|
+
damage += rule[:additinal_damage]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
damage
|
104
|
+
end
|
105
|
+
|
106
|
+
def parse_additional_damage_rules(source)
|
107
|
+
source.scan(/\[(>?=)(\d+):\+(\d+)\]/).map do |matched|
|
108
|
+
{
|
109
|
+
condition: make_additional_damage_condition(matched[0], matched[1].to_i),
|
110
|
+
additinal_damage: matched[2].to_i,
|
111
|
+
}
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def make_additional_damage_condition(comparer, comparing_target)
|
116
|
+
case comparer
|
117
|
+
when '='
|
118
|
+
lambda { |hit_count| hit_count == comparing_target }
|
119
|
+
when '>='
|
120
|
+
lambda { |hit_count| hit_count >= comparing_target }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class RogueLikeHalf < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = 'RogueLikeHalf'
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = 'ローグライクハーフ'
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = 'ろおくらいくはあふ'
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGETEXT
|
17
|
+
■判定 RH+x>=t x:技量点 t:達成値(威力)
|
18
|
+
|
19
|
+
例)RH+1>=5: ダイスを1個振って、技量点1,達成値5の結果を表示(クリティカル・ファンブルも表示)
|
20
|
+
|
21
|
+
■D33 D33+x x:修正値
|
22
|
+
|
23
|
+
例)D33: 3面ダイスを2個振って、その結果を表示。
|
24
|
+
|
25
|
+
■宝物表 NTT+x x:修正値
|
26
|
+
INFO_MESSAGETEXT
|
27
|
+
|
28
|
+
def initialize(command)
|
29
|
+
super(command)
|
30
|
+
|
31
|
+
@sort_barabara_dice = true # バラバラロール(Bコマンド)でソート有
|
32
|
+
end
|
33
|
+
|
34
|
+
def eval_game_system_specific_command(command)
|
35
|
+
resolute_action(command) ||
|
36
|
+
resolute_d33(command) ||
|
37
|
+
roll_table_command(command)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def with_symbol(number)
|
43
|
+
if number == 0
|
44
|
+
return "+0"
|
45
|
+
elsif number > 0
|
46
|
+
return "+#{number}"
|
47
|
+
else
|
48
|
+
return number.to_s
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# 判定ロール
|
53
|
+
# @param [String] command
|
54
|
+
# @return [Result]
|
55
|
+
def get_result_of_action(total, die, target)
|
56
|
+
if die == 6
|
57
|
+
return Result.critical("クリティカル")
|
58
|
+
elsif die == 1
|
59
|
+
return Result.fumble("ファンブル")
|
60
|
+
elsif total >= target
|
61
|
+
return Result.success("成功")
|
62
|
+
else
|
63
|
+
return Result.failure("失敗")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def resolute_action(command)
|
68
|
+
m = /RH([+-]\d)*(>=(\d+))?/.match(command)
|
69
|
+
return nil unless m
|
70
|
+
|
71
|
+
modify = m[1] ? Arithmetic.eval(m[1], @round_type) : 0
|
72
|
+
target = m[3].to_i
|
73
|
+
target = 4 if target == 0
|
74
|
+
|
75
|
+
die = @randomizer.roll_once(6)
|
76
|
+
die_text = die.to_s
|
77
|
+
total = die + modify
|
78
|
+
|
79
|
+
result = get_result_of_action(total, die, target)
|
80
|
+
|
81
|
+
command_text = "(RH#{with_symbol(modify)}>=#{target})"
|
82
|
+
sequence = [
|
83
|
+
command_text,
|
84
|
+
"[#{die_text}]#{with_symbol(modify)}",
|
85
|
+
total,
|
86
|
+
result.text,
|
87
|
+
].compact
|
88
|
+
|
89
|
+
result.text = sequence.join(" > ")
|
90
|
+
|
91
|
+
return result
|
92
|
+
end
|
93
|
+
|
94
|
+
# D33ロール
|
95
|
+
# @param [String] command
|
96
|
+
# @return [Result]
|
97
|
+
def resolute_d33(command)
|
98
|
+
m = /D33([+-]\d+)*/.match(command)
|
99
|
+
return nil unless m
|
100
|
+
|
101
|
+
modify = m[1] ? Arithmetic.eval(m[1], @round_type) : 0
|
102
|
+
|
103
|
+
dice = @randomizer.roll_barabara(2, 3)
|
104
|
+
dice_text = dice.join("")
|
105
|
+
dice_total = dice[0] * 3 + dice[1] + modify
|
106
|
+
dice_total = 12 if dice_total > 12
|
107
|
+
dice_total = 4 if dice_total < 4
|
108
|
+
p = dice_total.divmod(3)
|
109
|
+
if p[1] == 0
|
110
|
+
p[0] = p[0] - 1
|
111
|
+
p[1] = 3
|
112
|
+
end
|
113
|
+
total = p[0] * 10 + p[1]
|
114
|
+
|
115
|
+
sequence = [
|
116
|
+
"(#{command})",
|
117
|
+
dice_text,
|
118
|
+
].compact
|
119
|
+
|
120
|
+
if modify != 0
|
121
|
+
sequence = [
|
122
|
+
"(#{command})",
|
123
|
+
"#{dice_text}#{with_symbol(modify)}",
|
124
|
+
total,
|
125
|
+
].compact
|
126
|
+
end
|
127
|
+
|
128
|
+
return Result.new(sequence.join(" > "))
|
129
|
+
end
|
130
|
+
|
131
|
+
def roll_table_command(command)
|
132
|
+
command = command.upcase
|
133
|
+
result = []
|
134
|
+
|
135
|
+
m = /([A-Z]+)(([+]|-)(\d+))?/.match(command)
|
136
|
+
return result unless m
|
137
|
+
|
138
|
+
command = m[1]
|
139
|
+
operator = m[3]
|
140
|
+
value = m[4].to_i
|
141
|
+
|
142
|
+
return get_another_table_result(command, operator, value)
|
143
|
+
end
|
144
|
+
|
145
|
+
def get_another_table_result(command, operator, value)
|
146
|
+
result = ""
|
147
|
+
|
148
|
+
table_name = command
|
149
|
+
table = TABLES[table_name]
|
150
|
+
return result if table.nil?
|
151
|
+
|
152
|
+
index = get_table_index(operator, value, 1, 6)
|
153
|
+
|
154
|
+
info = table.choice(index)
|
155
|
+
result = "#{info.table_name}:#{info.value}:#{info.body}"
|
156
|
+
|
157
|
+
return result
|
158
|
+
end
|
159
|
+
|
160
|
+
def get_table_index(operator, value, dice_count, dice_type)
|
161
|
+
modify = 0
|
162
|
+
|
163
|
+
case operator
|
164
|
+
when "+"
|
165
|
+
modify = value
|
166
|
+
when "-"
|
167
|
+
modify = value * -1
|
168
|
+
end
|
169
|
+
|
170
|
+
index = @randomizer.roll_sum(dice_count, dice_type)
|
171
|
+
index += modify
|
172
|
+
|
173
|
+
index = [index, dice_count * 1].max
|
174
|
+
index = [index, dice_count * dice_type + 1].min
|
175
|
+
|
176
|
+
return index
|
177
|
+
end
|
178
|
+
|
179
|
+
TABLES = {
|
180
|
+
"NTT" => DiceTable::Table.new(
|
181
|
+
"宝物表",
|
182
|
+
"1D6",
|
183
|
+
[
|
184
|
+
"金貨1枚",
|
185
|
+
"1d6枚の金貨",
|
186
|
+
"2d6枚の金貨(下限は金貨5枚)",
|
187
|
+
"1個のアクセサリー(1d6×1d6枚の金貨と同等の価値)",
|
188
|
+
"1個の宝石・小(1d6×5枚の金貨と同等の価値。下限は金貨15枚の価値)",
|
189
|
+
"1個の宝石・大(2d6×5枚の金貨と同等の価値。下限は金貨30枚の価値)",
|
190
|
+
"【魔法の宝物表】でダイスロールを行うこと。",
|
191
|
+
]
|
192
|
+
)
|
193
|
+
}.freeze
|
194
|
+
|
195
|
+
register_prefix('RH', 'D33', TABLES.keys)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
@@ -14,13 +14,16 @@ module BCDice
|
|
14
14
|
|
15
15
|
# ダイスボットの使い方
|
16
16
|
HELP_MESSAGE = <<~MESSAGETEXT
|
17
|
-
・判定コマンド
|
18
|
-
RQG<=成功率
|
17
|
+
・判定コマンド 決定的成功、効果的成功、ファンブルを含めた判定を行う。
|
18
|
+
RQG<=成功率 (基本書式)
|
19
|
+
RQG成功率 (省略記法)
|
19
20
|
|
20
|
-
例1:RQG<=80
|
21
|
+
例1:RQG<=80 (技能値80で判定)
|
21
22
|
例2:RQG<=80+20 (技能値100で判定)
|
23
|
+
例3:RQG80 (省略書式で技能値80の判定)
|
24
|
+
例4:RQG80+20 (省略書式で技能値100の判定)
|
22
25
|
|
23
|
-
・抵抗判定コマンド(能動-受動)
|
26
|
+
・抵抗判定コマンド(能動-受動) 決定的成功、効果的成功、ファンブルを含めた判定を行う。
|
24
27
|
RES(能動能力-受動能力)m増強値
|
25
28
|
増強値は省略可能。
|
26
29
|
|
@@ -28,7 +31,7 @@ module BCDice
|
|
28
31
|
例2:RES(9-11)m20 (能動能力9 vs 受動能力11、+20%の増強が能動側に入る判定)
|
29
32
|
例3:RES(9)m50 (能動能力と受動能力の差が9で、+50%の増強が能動側に入る判定)
|
30
33
|
|
31
|
-
・抵抗判定コマンド(能動側のみ)
|
34
|
+
・抵抗判定コマンド(能動側のみ) 決定的成功、効果的成功、ファンブルは含めず判定を行う。
|
32
35
|
RSA(能動能力)m増強値
|
33
36
|
増強値は省略可能。
|
34
37
|
|
@@ -55,18 +58,18 @@ module BCDice
|
|
55
58
|
|
56
59
|
# 技能などの一般判定
|
57
60
|
def do_ability_roll(command)
|
58
|
-
m = %r{\A(RQG)(<=([+-/*\d]+))?$}.match(command)
|
61
|
+
m = %r{\A(RQG)((<=)?([+-/*\d]+))?$}.match(command)
|
59
62
|
unless m
|
60
63
|
return nil
|
61
64
|
end
|
62
65
|
|
63
66
|
roll_value = @randomizer.roll_once(100)
|
64
|
-
unless m[
|
67
|
+
unless m[4]
|
65
68
|
# RQGのみ指定された場合は1d100を振ったのと同じ挙動
|
66
69
|
return "(1D100) > #{roll_value}"
|
67
70
|
end
|
68
71
|
|
69
|
-
ability_value = Arithmetic.eval(m[
|
72
|
+
ability_value = Arithmetic.eval(m[4], RoundType::ROUND)
|
70
73
|
result_prefix_str = "(1D100<=#{ability_value}) >"
|
71
74
|
|
72
75
|
if ability_value == 0
|
@@ -125,7 +128,7 @@ module BCDice
|
|
125
128
|
active_value = active_ability_value * 5 + modifiy_value
|
126
129
|
result_prefix_str = "(1D100<=#{active_value}) > #{roll_value} >"
|
127
130
|
|
128
|
-
note_str = "
|
131
|
+
note_str = "決定的成功、効果的成功、ファンブルは未処理。必要なら確認すること。"
|
129
132
|
|
130
133
|
if roll_value >= 96
|
131
134
|
# 96以上は無条件で失敗
|
@@ -146,8 +149,8 @@ module BCDice
|
|
146
149
|
funmble_value = ((100 - success_value.to_f) / 20).round
|
147
150
|
|
148
151
|
if (roll_value == 1) || (roll_value <= critical_value)
|
149
|
-
#
|
150
|
-
Result.critical("#{result_str}
|
152
|
+
# 決定的成功(01は必ず決定的成功)
|
153
|
+
Result.critical("#{result_str} 決定的成功")
|
151
154
|
elsif (roll_value == 100) || (roll_value >= (100 - funmble_value + 1))
|
152
155
|
# ファンブル(00は必ずファンブル)
|
153
156
|
Result.fumble("#{result_str} ファンブル")
|
@@ -155,8 +158,8 @@ module BCDice
|
|
155
158
|
# 失敗(96以上は必ず失敗、出目が01-05ではなく技能値より上なら失敗)
|
156
159
|
Result.failure("#{result_str} 失敗")
|
157
160
|
elsif roll_value <= special_value
|
158
|
-
#
|
159
|
-
Result.success("#{result_str}
|
161
|
+
# 効果的成功
|
162
|
+
Result.success("#{result_str} 効果的成功")
|
160
163
|
elsif (roll_value <= 5) || (roll_value <= success_value)
|
161
164
|
# 成功(05以下は必ず成功)
|
162
165
|
Result.success("#{result_str} 成功")
|
@@ -15,48 +15,67 @@ module BCDice
|
|
15
15
|
SORT_KEY = 'しのひかみ'
|
16
16
|
|
17
17
|
# ダイスボットの使い方
|
18
|
+
# 25/01/17:書式成形(半角スペース×2に統一、同じ書籍のシーン表は改行なしで列挙)
|
18
19
|
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
19
20
|
・行為判定 nSG@s#f>=x
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
2D6の行為判定を行う。ダイス数が指定された場合、大きい出目2個を採用する。
|
22
|
+
n: ダイス数 (省略時 2)
|
23
|
+
s: スペシャル値 (省略時 12)
|
24
|
+
f: ファンブル値 (省略時 2)
|
25
|
+
x: 目標値 (省略可)
|
26
|
+
例)SG, SG@11, SG@11#3, SG#3>=7, 3SG>=7
|
27
|
+
|
28
|
+
・行為判定以外の表
|
29
|
+
以下の表は「回数+コマンド」で複数回振れる
|
30
|
+
例)3RCT, 2WT
|
26
31
|
|
27
32
|
・ランダム特技決定表 RTTn (n:分野番号、省略可能)
|
28
|
-
|
33
|
+
1器術 2体術 3忍術 4謀術 5戦術 6妖術
|
29
34
|
|
30
35
|
・ランダム分野表 RCT
|
31
36
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
異形表 MTR、妖魔忍法表(x:A,B,C) DSx
|
36
|
-
プライズ効果表 PT
|
37
|
+
・各種表:基本ルールブック以降
|
38
|
+
ファンブル表 FT、戦場表 BT、感情表 ET、変調表 WT、戦国変調表 GWT、プライズ効果表 PT
|
39
|
+
妖魔化(異形表、妖魔忍法表一括) MT、異形表 MTR、妖魔忍法表(x:A,B,C) DSx
|
37
40
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
・各種表:流派ブック以降
|
42
|
+
比良坂流派ブック
|
43
|
+
パニック表 HRPT
|
44
|
+
鞍馬流派ブック
|
45
|
+
新戦場表 BNT
|
46
|
+
御斎流派ブック
|
47
|
+
覚醒表 OTAT
|
48
|
+
忍法授業シーン表(x:1-攻撃系 2-防御系 3-戦略系)NCTx
|
49
|
+
【数奇】OTS
|
50
|
+
隠忍流派ブック
|
51
|
+
妖術変調対応表(x:なし-現代/戦国、1-現代、2-戦国)YWTx
|
52
|
+
妖魔化(新異形表利用) NMT、新異形表 NMTR、妖魔忍法表(x:1-異霊 2-凶身 3-神化 4-攻激)DSNx
|
53
|
+
出物表 ONDT
|
43
54
|
|
44
|
-
|
45
|
-
|
46
|
-
|
55
|
+
・各種表:基本ルールブック改訂版以前
|
56
|
+
無印
|
57
|
+
旧ファンブル表 OFT 、旧変調表 OWT、旧戦場表 OBT、異形表 MT
|
58
|
+
怪
|
59
|
+
怪ファンブル表 KFT、怪変調表 KWT (基本ルールブックと同一)
|
47
60
|
|
48
61
|
・シーン表
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
62
|
+
基本ルールブック
|
63
|
+
通常 ST、出島 DST、都市 CST、館 MST、トラブル TST、回想 KST、日常 NST、学校 GAST、戦国 GST
|
64
|
+
忍秘伝
|
65
|
+
中忍試験 HC、滅びの塔 HT、影の街 HK、夜行列車 HY、病院 HO、龍動 HR、密室 HM、催眠 HS
|
66
|
+
正忍記
|
67
|
+
カジノ TC、ロードムービー TRM、マスカレイド・キャッスル TMC、月天に死の咲く TGS、恋人との日々 TKH、学校(黒星祭) TKG、魔都学園 TMG、魔都東京 TMT
|
68
|
+
流派ブック以降
|
69
|
+
御斎流派ブック
|
70
|
+
不良高校 OTFK
|
71
|
+
基本ルールブック改訂版以前
|
72
|
+
死
|
73
|
+
東京 TKST
|
74
|
+
リプレイ戦1〜2巻
|
75
|
+
京都 KYST、神社仏閣 JBST
|
76
|
+
その他
|
77
|
+
秋空に雪舞えば AKST、夏の終わり NTST、出島EX DXST、災厄 CLST、斜歯ラボ HLST、培養プラント PLST
|
78
|
+
|
60
79
|
・D66ダイスあり
|
61
80
|
INFO_MESSAGE_TEXT
|
62
81
|
|
@@ -99,8 +118,19 @@ module BCDice
|
|
99
118
|
register_prefix('\d*SG')
|
100
119
|
|
101
120
|
def eval_game_system_specific_command(command)
|
102
|
-
return action_roll(command) ||
|
103
|
-
|
121
|
+
return action_roll(command) || repeat_table(command)
|
122
|
+
end
|
123
|
+
|
124
|
+
def repeat_table(command)
|
125
|
+
times = command.start_with?(/\d/) ? command.to_i : 1
|
126
|
+
key = command.sub(/^\d+/, '')
|
127
|
+
results = [*0...times].map do |_|
|
128
|
+
roll_tables(key, TABLES) || roll_tables(key, SCENE_TABLES) ||
|
129
|
+
roll_tables(key, DEMON_SKILL_TABLES) || roll_tables(key, DEMON_SKILL_TABLES_NEW) || RTT.roll_command(@randomizer, key)
|
130
|
+
end.compact
|
131
|
+
return nil if results.empty?
|
132
|
+
|
133
|
+
return results.join("\n")
|
104
134
|
end
|
105
135
|
|
106
136
|
RTT = DiceTable::SaiFicSkillTable.new(
|
@@ -209,12 +239,12 @@ module BCDice
|
|
209
239
|
'妖魔忍法表・異霊',
|
210
240
|
'1D6',
|
211
241
|
[
|
212
|
-
'【逢魔時】(基本
|
213
|
-
'【神隠】(基本
|
214
|
-
'【狂骨】(基本
|
215
|
-
'【木魂】(基本
|
216
|
-
'【付喪神】(基本
|
217
|
-
'【生剥】(基本
|
242
|
+
'【逢魔時】(基本 p172)/【虚舟】(隠忍 p28)',
|
243
|
+
'【神隠】(基本 p172)/【夢喰】(隠忍 p28)',
|
244
|
+
'【狂骨】(基本 p172)/【金毛】(隠忍 p28)',
|
245
|
+
'【木魂】(基本 p172)/【朽縄】(隠忍 p28)',
|
246
|
+
'【付喪神】(基本 p172)/【香魂】(隠忍 p28)',
|
247
|
+
'【生剥】(基本 p172)/【三尸】(隠忍 p28)',
|
218
248
|
]
|
219
249
|
),
|
220
250
|
'DSN2' => DiceTable::Table.new(
|
@@ -538,12 +568,12 @@ module BCDice
|
|
538
568
|
'覚醒表',
|
539
569
|
'1D6',
|
540
570
|
[
|
541
|
-
'
|
571
|
+
'自分の力が急に恐ろしくなる。好きな覚醒済みデータを一つ選び、それを未覚醒データに変更する。',
|
542
572
|
'自分の力が暴走し、周囲に被害を与える。そのシーンに登場しているキャラクター全員(自分含む)に射撃戦ダメージを1点与える。',
|
543
|
-
'
|
573
|
+
'覚醒に伴い、身体の形が変化する。未覚醒忍法の中からランダムに一つを選び、それを覚醒済み忍法にする。',
|
544
574
|
'忍者の血に目覚め、力の制御方法が理解出来るようになる。好きな未覚醒忍法を一つを選び、それを覚醒済み忍法にする。',
|
545
575
|
'自分だけが操ることが出来る独自の力に目覚める。好きな未覚醒奥義一つを選び、それを覚醒済みの奥義にする。',
|
546
|
-
'
|
576
|
+
'自分の脳に直接何かが囁きかける。集団戦ダメージを1点受けると、好きな未覚醒データの中から一つ選び、それを覚醒済みデータに変更することができる。退魔編であれば、集団戦ダメージを受ける代わりに妖魔化することで、好きな未覚醒データの中から一つ選び、それを覚醒済みデータに変更することができる。'
|
547
577
|
]
|
548
578
|
),
|
549
579
|
'ONDT' => DiceTable::Table.new(
|
@@ -1187,7 +1217,7 @@ module BCDice
|
|
1187
1217
|
]
|
1188
1218
|
),
|
1189
1219
|
}.freeze
|
1190
|
-
register_prefix(RTT.prefixes, TABLES.keys, SCENE_TABLES.keys, DEMON_SKILL_TABLES.keys, DEMON_SKILL_TABLES_NEW.keys)
|
1220
|
+
register_prefix(RTT.prefixes.map { |k| "\\d*#{k}" }, TABLES.keys.map { |k| "\\d*#{k}" }, SCENE_TABLES.keys.map { |k| "\\d*#{k}" }, DEMON_SKILL_TABLES.keys.map { |k| "\\d*#{k}" }, DEMON_SKILL_TABLES_NEW.keys.map { |k| "\\d*#{k}" })
|
1191
1221
|
end
|
1192
1222
|
end
|
1193
1223
|
end
|
@@ -85,7 +85,7 @@ module BCDice
|
|
85
85
|
|
86
86
|
def eval_game_system_specific_command(command)
|
87
87
|
command_sn(command) || command_d(command) || command_avo(command) || command_snavo(command) ||
|
88
|
-
command_snd(command) || roll_tables(command, TABLES)
|
88
|
+
command_snd(command) || roll_tables(command, self.class::TABLES)
|
89
89
|
end
|
90
90
|
|
91
91
|
private
|
@@ -145,7 +145,7 @@ module BCDice
|
|
145
145
|
.sub("F/", "[#{translate('SkynautsBouken.fire')}]/").sub("S/", "[#{translate('SkynautsBouken.big_shake')}]/")
|
146
146
|
result = ["(#{command})", get_points_text(points, 0, 0)]
|
147
147
|
if ballistics != 0
|
148
|
-
dir = DIRECTION_INFOS[ballistics]
|
148
|
+
dir = self.class::DIRECTION_INFOS[ballistics]
|
149
149
|
diff_x, diff_y = dir[:position_diff]
|
150
150
|
result[-1] += "\n"
|
151
151
|
result << "《#{translate('SkynautsBouken.ballistics')}》#{dir[:name]}"
|
@@ -160,7 +160,7 @@ module BCDice
|
|
160
160
|
dmg = command.match(/^AVO@([2468])(.*?)$/)
|
161
161
|
return nil unless dmg
|
162
162
|
|
163
|
-
dir = DIRECTION_INFOS[dmg[1].to_i]
|
163
|
+
dir = self.class::DIRECTION_INFOS[dmg[1].to_i]
|
164
164
|
diff_x, diff_y = dir[:position_diff]
|
165
165
|
"《#{translate('SkynautsBouken.avoidance')}》#{dir[:name]} > " + dmg[2].gsub(/\(?\[(\d),(\d{1,2})\]\)?/) do
|
166
166
|
y = Regexp.last_match(1).to_i + diff_y
|
@@ -224,7 +224,7 @@ module BCDice
|
|
224
224
|
x = @randomizer.roll_sum(2, 6) # 横
|
225
225
|
|
226
226
|
[[x, y]] + range.map do |r|
|
227
|
-
xdiff, ydiff = DIRECTION_INFOS[r][:position_diff]
|
227
|
+
xdiff, ydiff = self.class::DIRECTION_INFOS[r][:position_diff]
|
228
228
|
[x + xdiff, y + ydiff]
|
229
229
|
end
|
230
230
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bcdice/game_system/SkynautsBouken"
|
4
|
+
|
5
|
+
module BCDice
|
6
|
+
module GameSystem
|
7
|
+
class SkynautsBouken_Korean < SkynautsBouken
|
8
|
+
# ゲームシステムの識別子
|
9
|
+
ID = 'SkynautsBouken:Korean'
|
10
|
+
|
11
|
+
# ゲームシステム名
|
12
|
+
NAME = '톱니바퀴 탑의 탐공사'
|
13
|
+
|
14
|
+
# ゲームシステム名の読みがな
|
15
|
+
SORT_KEY = '国際化:Korean:톱니바퀴 탑의 탐공사'
|
16
|
+
|
17
|
+
# ダイスボットの使い方
|
18
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
19
|
+
・행위판정(nSNt#f) n:다이스 수(생략시 2), t:목표치(생략시 7), f:펌블치(생략시 1)
|
20
|
+
예)SN6#2 3SN
|
21
|
+
・대미지 체크 (Dx/y@m) x:대미지 범위、y:공격횟수
|
22
|
+
m:《탄도학》(생략 가능)상:8, 하:2, 좌:4, 우:6
|
23
|
+
예) D/4 D19/2 D/3@8 D[진동]/2
|
24
|
+
・회피(AVO@m대미지)
|
25
|
+
m:회피 방향(상:8, 하:2, 좌:4, 우:6), 대미지: 대미지 체크 결과
|
26
|
+
예)AVO@8[1,4],[2,6],[3,8] AVO@2[6,4],[2,6]
|
27
|
+
・FT 펌블표(p76)
|
28
|
+
・NV 항행표
|
29
|
+
・항행이벤트표
|
30
|
+
・NEN 항행계
|
31
|
+
・NEE 조우계
|
32
|
+
・NEO 선내계
|
33
|
+
・NEH 곤란계
|
34
|
+
・NEL 장거리 여행계
|
35
|
+
|
36
|
+
■ 판정 세트
|
37
|
+
・《회피운동》판정+회피(nSNt#f/AVO@대미지)
|
38
|
+
nSNt#f → 성공하면 AVO@m
|
39
|
+
예)SN/AVO@8[1,4],[2,6],[3,8] 3SN#2/AVO@2[6,4],[2,6]
|
40
|
+
・포격 판정+대미지 체크 (nSNt#f/Dx/y@m)
|
41
|
+
행위 판정의 출발(出目) 변경 타이밍을 놓치므로 GM의 허가 필요
|
42
|
+
nSNt#f → 성공하면 Dx/y@m
|
43
|
+
예)SN/D/4 3SN#2/D[진동]/2
|
44
|
+
MESSAGETEXT
|
45
|
+
|
46
|
+
def initialize(command)
|
47
|
+
super(command)
|
48
|
+
@locale = :ko_kr
|
49
|
+
end
|
50
|
+
|
51
|
+
register_prefix_from_super_class()
|
52
|
+
|
53
|
+
TABLES = translate_tables(:ko_kr).freeze
|
54
|
+
DIRECTION_INFOS = translate_direction_infos(:ko_kr).freeze
|
55
|
+
end
|
56
|
+
end
|
57
|
+
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
|
-
RTT[1-6], AT[1-6]: 특기표(공백: 랜덤 1:
|
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는 변동있음
|