bcdice 3.11.0 → 3.12.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 +31 -0
- data/i18n/FutariSousa/ko_kr.yml +1625 -529
- data/i18n/Insane/ko_kr.yml +393 -258
- data/i18n/NinjaSlayer2/ja_jp.yml +34 -0
- data/lib/bcdice/game_system/Emoklore.rb +4 -6
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
- data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
- data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
- data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
- data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
- data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +9 -6
- data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
- data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
- data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +16 -0
- data/lib/bcdice/game_system/SwordWorld2_5.rb +8 -1
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +10 -4
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +173 -0
- data/lib/bcdice/game_system/sword_world/rating_options.rb +3 -0
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +9 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +173 -128
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
- data/lib/bcdice/game_system.rb +4 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +7 -2
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class NinjaSlayer2 < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = "NinjaSlayer2"
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = "ニンジャスレイヤーTRPG 2版"
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = "にんしやすれいやあTRPG2"
|
|
14
|
+
|
|
15
|
+
HELP_MESSAGE = <<~TEXT
|
|
16
|
+
- K{x1},{x2},...,{xn}
|
|
17
|
+
難易度K([K]ids)の成功判定({x1}B6>=2)を、ダイス{x1}個({x2}~を指定した場合はそれぞれ個々に)で実行します。
|
|
18
|
+
先頭の文字を変えることで、難易度E([E]asy),N([N]ormal),H([H]ard),U([U]ltra-hard)もしくはUH([U]ltra-[H]ard)でも実行可能です。(以下も同様)
|
|
19
|
+
|
|
20
|
+
- K{x1},{x2},...,{xn}[>={y}]
|
|
21
|
+
K{x1}のロールの結果を使って、[]内で指定された条件を満たすダイスの個数を追加で出力します。
|
|
22
|
+
判定式は「>=」の他に「>」「<=」「<」「=」「!=」が利用可能です。
|
|
23
|
+
[=5][=6]のように複数記述することで、それぞれで追加判定が可能です。
|
|
24
|
+
|
|
25
|
+
- K{x1},{x2},...,{xn}[S] or K{x1},{x2},...,{xn}[S{y}]
|
|
26
|
+
- K{x1},{x2},...,{xn}[C] or K{x1},{x2},...,{xn}[C{y}]
|
|
27
|
+
いずれもK{x1},{x2},...,{xn}[>={y}]のショートカットです。({y}省略時は固定値6で処理します。)
|
|
28
|
+
出力時のテキストが、Sの場合は「サツバツ!」に、Cの場合は「クリティカル!」になります。
|
|
29
|
+
こちらも複数記述することで、それぞれで追加判定が可能です。
|
|
30
|
+
|
|
31
|
+
- SB or SB@{x}
|
|
32
|
+
{x}(1-6/省略時はd6)に対応したサツバツ([S]atz-[B]atz)・クリティカル表の内容を返します。
|
|
33
|
+
|
|
34
|
+
- WS{x}
|
|
35
|
+
{x}(1-12/省略不可)に対応する[W]as[s]hoi!判定(2d6<={x})を行います
|
|
36
|
+
|
|
37
|
+
- WSE or WSE@{x}
|
|
38
|
+
{x}(1-6/省略時はd6)に対応する死神のエントリー決定表([W]as[s]hoi! [E]ntry)の内容を返します。
|
|
39
|
+
|
|
40
|
+
- NRS_E{x} or NRS_E{x}@{y} or NRS@{y}
|
|
41
|
+
ダイス{x}個で難易度[E]asy(>=3)のNRS判定({x}省略時はスキップ)を行い、失敗した場合は{y}(1~7/省略時は難易度に応じたダイス目)に対応するNRS発狂表を返します。
|
|
42
|
+
「_E」部分を変更することで、難易度N,H,U,UHでも利用可能です。(Kはありません)
|
|
43
|
+
TEXT
|
|
44
|
+
|
|
45
|
+
# Base::eval_game_system_specific_commandの実装
|
|
46
|
+
# @param command [String]
|
|
47
|
+
# @return [String, nil]
|
|
48
|
+
def eval_game_system_specific_command(command)
|
|
49
|
+
# @debug = true
|
|
50
|
+
debug("input: #{command}")
|
|
51
|
+
|
|
52
|
+
begin
|
|
53
|
+
case command
|
|
54
|
+
when RE_JUDGE_DICEROLL
|
|
55
|
+
# 2版用のダイス判定
|
|
56
|
+
proc_result = proc_dice_2nd(Regexp.last_match)
|
|
57
|
+
|
|
58
|
+
# 結果は文字列と達成値という形で受け取る
|
|
59
|
+
if proc_result[1] > 0
|
|
60
|
+
return Result.success(proc_result[0])
|
|
61
|
+
else
|
|
62
|
+
return Result.failure(proc_result[0])
|
|
63
|
+
end
|
|
64
|
+
else
|
|
65
|
+
# ダイスでなければ定型文処理
|
|
66
|
+
return proc_text(command)
|
|
67
|
+
end
|
|
68
|
+
rescue StandardError => e
|
|
69
|
+
# 解析できずにエラーが出たら構文ミスと皆してnilを返す
|
|
70
|
+
debug("#{e.message} \n#{e.backtrace}")
|
|
71
|
+
return nil
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
# 文字列stringを数値化する。nilの場合はdefaultで指定された値を返す
|
|
78
|
+
# @param string [String]
|
|
79
|
+
# @param default [Integer]
|
|
80
|
+
# @return [Integer]
|
|
81
|
+
def s_to_i(string, default)
|
|
82
|
+
return string.nil? ? default : string.to_i
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# 判定結果の出力テキストと成功数のカウントを返す。
|
|
86
|
+
# @param dice_array [Array<Integer>]
|
|
87
|
+
# @param difficulty [Integer]
|
|
88
|
+
# @param cmp_op [String]
|
|
89
|
+
# @param title_text [String]
|
|
90
|
+
# @return [String, Integer]
|
|
91
|
+
def check_difficulty(dice_array, difficulty, cmp_op, title_text)
|
|
92
|
+
success_num = 0
|
|
93
|
+
success_dice = []
|
|
94
|
+
dice_array.each do |dice_value|
|
|
95
|
+
if dice_value.send(Normalize.comparison_operator(cmp_op), difficulty)
|
|
96
|
+
success_num += 1
|
|
97
|
+
success_dice.push(dice_value)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
success_dice_s = success_dice.empty? ? "" : "[#{success_dice.sort.reverse.join(',')}]"
|
|
102
|
+
return "#{title_text}:#{success_num}#{success_dice_s}", success_num
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# ダイス処理(2版用)
|
|
106
|
+
# @param command [String]
|
|
107
|
+
# @return [String, Integer]
|
|
108
|
+
def proc_dice_2nd(match)
|
|
109
|
+
output_text = ''
|
|
110
|
+
total_success_num = 0
|
|
111
|
+
|
|
112
|
+
difficulty = DIFFICULTY_SYMBOL_TO_INTEGER.fetch(match[1])
|
|
113
|
+
appendix = match[3]
|
|
114
|
+
|
|
115
|
+
match[2].split(",").each do |sub_command|
|
|
116
|
+
dice_num = sub_command.to_i
|
|
117
|
+
|
|
118
|
+
# D6バラバラロール
|
|
119
|
+
roll_command = "#{dice_num}B6>=#{difficulty}"
|
|
120
|
+
roll_result = BCDice::CommonCommand::BarabaraDice.eval(roll_command, self, @randomizer)
|
|
121
|
+
|
|
122
|
+
output_text += "(#{roll_command}) > #{roll_result.last_dice_list.join(',')} > 成功数:#{roll_result.success_num}"
|
|
123
|
+
success_num = roll_result.success_num
|
|
124
|
+
|
|
125
|
+
# Appendix部分の処理
|
|
126
|
+
unless appendix.nil?
|
|
127
|
+
debug("---- appendix: [#{appendix}]")
|
|
128
|
+
ap_command_array = appendix.split("\]\[")
|
|
129
|
+
ap_command_array.each do |ap_command|
|
|
130
|
+
debug("----- ap_command: #{ap_command}")
|
|
131
|
+
case ap_command
|
|
132
|
+
when RE_COUNT_SATZ_BATZ
|
|
133
|
+
# サツバツ!カウント
|
|
134
|
+
check_result = check_difficulty(roll_result.last_dice_list, s_to_i(Regexp.last_match[1], 6), ">=", "サツバツ!")
|
|
135
|
+
output_text += ", #{check_result[0]}"
|
|
136
|
+
success_num += check_result[1]
|
|
137
|
+
when RE_COUNT_CRITICAL
|
|
138
|
+
# クリティカル!カウント
|
|
139
|
+
check_result = check_difficulty(roll_result.last_dice_list, s_to_i(Regexp.last_match[1], 6), ">=", "クリティカル!")
|
|
140
|
+
output_text += ", #{check_result[0]}"
|
|
141
|
+
success_num += check_result[1]
|
|
142
|
+
when RE_COUNT_JUDGE
|
|
143
|
+
# 追加判定カウント
|
|
144
|
+
check_result = check_difficulty(roll_result.last_dice_list, Regexp.last_match[2].to_i, Regexp.last_match[1], "追加判定")
|
|
145
|
+
output_text += ", #{check_result[0]}"
|
|
146
|
+
success_num += check_result[1]
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
output_text += " \n"
|
|
151
|
+
|
|
152
|
+
total_success_num += success_num
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
return output_text, total_success_num
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# サツバツ!の処理を実行する
|
|
159
|
+
# @param type [Integer]
|
|
160
|
+
# @return [Result]
|
|
161
|
+
def proc_satz_batz(type)
|
|
162
|
+
# サツバツ判定(d6)
|
|
163
|
+
if type > 0
|
|
164
|
+
return "サツバツ!!(#{type}) > #{translate('NinjaSlayer2.table.SATSUBATSU.items')[type - 1]}"
|
|
165
|
+
else
|
|
166
|
+
return DiceTable::Table.from_i18n("NinjaSlayer2.table.SATSUBATSU", @locale).roll(@randomizer)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Wasshoi!判定の処理を実行する
|
|
171
|
+
# @param dkk [Integer]
|
|
172
|
+
# @return [Result]
|
|
173
|
+
def proc_wasshoi(dkk)
|
|
174
|
+
dice_array = @randomizer.roll_barabara(2, 6)
|
|
175
|
+
output_text = "Wasshoi!判定(2D6) > (#{dice_array.join('+')}) > #{dice_array.sum()}"
|
|
176
|
+
|
|
177
|
+
if dice_array.sum() > dkk
|
|
178
|
+
output_text += "(>#{dkk}) 判定失敗"
|
|
179
|
+
return Result.success(output_text)
|
|
180
|
+
else
|
|
181
|
+
output_text += "(<=#{dkk}) 判定成功!! \nニンジャスレイヤー=サンのエントリーだ!!"
|
|
182
|
+
return Result.failure(output_text)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Wasshoi!の処理を実行する
|
|
187
|
+
# @param type [Integer]
|
|
188
|
+
# @return [Result]
|
|
189
|
+
def proc_wasshoi_entry(type)
|
|
190
|
+
# Wasshoi!判定
|
|
191
|
+
output_text = ""
|
|
192
|
+
if type > 0
|
|
193
|
+
output_text += "ニンジャスレイヤー=サンのエントリー!!(#{type}) > #{translate('NinjaSlayer2.table.WASSHOI.items')[type - 1]}"
|
|
194
|
+
else
|
|
195
|
+
# DKKの指定無し、もしくはロール結果がDKKを超えたら死神のエントリー決定表(d6)
|
|
196
|
+
table = DiceTable::Table.from_i18n("NinjaSlayer2.table.WASSHOI", @locale)
|
|
197
|
+
output_text += table.roll(@randomizer).to_s
|
|
198
|
+
end
|
|
199
|
+
return output_text
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# NRS判定の処理を実行する
|
|
203
|
+
# @param dice_num [Integer]
|
|
204
|
+
# @param dificulty_s [String]
|
|
205
|
+
# @param type [Integer]
|
|
206
|
+
# @return [Result]
|
|
207
|
+
def proc_nrs(dice_num, dificulty_s, type)
|
|
208
|
+
# 難易度も乱数表の番号も指定が無ければコマンドミス
|
|
209
|
+
dificulty_i = dificulty_s.nil? ? 0 : DIFFICULTY_SYMBOL_TO_INTEGER.fetch(dificulty_s)
|
|
210
|
+
if dificulty_i == 0 && type == 0
|
|
211
|
+
return nil
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# NRS判定
|
|
215
|
+
output_text = ""
|
|
216
|
+
if dificulty_i > 0
|
|
217
|
+
roll_command = "#{dice_num}B6>=#{dificulty_i}"
|
|
218
|
+
roll_result = BCDice::CommonCommand::BarabaraDice.eval(roll_command, self, @randomizer)
|
|
219
|
+
output_text += "NRS判定(#{roll_command}) > #{roll_result.last_dice_list.join(',')} > 成功数:#{roll_result.success_num}"
|
|
220
|
+
if roll_result.success_num > 0
|
|
221
|
+
output_text += " NRS克服!!"
|
|
222
|
+
return Result.success(output_text)
|
|
223
|
+
else
|
|
224
|
+
output_text += " NRS発症!! \n"
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# NRS発狂表の決定
|
|
229
|
+
dice_face = 0
|
|
230
|
+
additional = 0
|
|
231
|
+
if type == 0
|
|
232
|
+
case dificulty_s
|
|
233
|
+
when "E"
|
|
234
|
+
dice_face = 3
|
|
235
|
+
when "N"
|
|
236
|
+
dice_face = 6
|
|
237
|
+
when "H", "U"
|
|
238
|
+
dice_face = 6
|
|
239
|
+
additional = 1
|
|
240
|
+
end
|
|
241
|
+
type = @randomizer.roll_once(dice_face) + additional
|
|
242
|
+
end
|
|
243
|
+
roll_command = "1D#{dice_face}#{additional > 0 ? '+' + additional.to_s : ''}"
|
|
244
|
+
output_text += "NRS発狂#{dice_face > 0 ? "(#{roll_command}) > " : ''}(#{type}) > #{translate('NinjaSlayer2.table.NRS.items')[type - 1]}"
|
|
245
|
+
return Result.failure(output_text)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
# テキスト系処理
|
|
249
|
+
# @param command [String]
|
|
250
|
+
# @return [String, Integer]
|
|
251
|
+
def proc_text(command)
|
|
252
|
+
debug("text: #{command}")
|
|
253
|
+
case command
|
|
254
|
+
when RE_JUDGE_SATZ_BATZ
|
|
255
|
+
# サツバツ判定(d6)
|
|
256
|
+
return proc_satz_batz(Regexp.last_match[1].to_i)
|
|
257
|
+
when RE_JUDGE_WASSHOI
|
|
258
|
+
# Wasshoi!判定
|
|
259
|
+
return proc_wasshoi(Regexp.last_match[1].to_i)
|
|
260
|
+
when RE_JUDGE_WASSHOI_ENTRY
|
|
261
|
+
# Wasshoi!判定
|
|
262
|
+
return proc_wasshoi_entry(Regexp.last_match[1].to_i)
|
|
263
|
+
when RE_JUDGE_NRS
|
|
264
|
+
# NRS判定
|
|
265
|
+
return proc_nrs(Regexp.last_match[2].to_i, Regexp.last_match[1], Regexp.last_match[3].to_i)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
RE_COUNT_SATZ_BATZ = /S([1-6])?/i.freeze
|
|
270
|
+
RE_COUNT_CRITICAL = /C([1-6])?/i.freeze
|
|
271
|
+
RE_COUNT_JUDGE = /(=|!=|>=|>|<=|<)([1-6])/.freeze
|
|
272
|
+
|
|
273
|
+
RE_JUDGE_DICEROLL = /^(UH|[KENHU])([\d,]+)(?:\[((?:(?:S([1-6])?|C([1-6])?|(=|!=|>=|>|<=|<)([1-6]))(?:\]\[)?)+)\])?$/i.freeze
|
|
274
|
+
RE_JUDGE_SATZ_BATZ = /^SB(?:@([1-6]))?$/i.freeze
|
|
275
|
+
RE_JUDGE_WASSHOI = /^WS([1-9]|10|11|12)$/i.freeze
|
|
276
|
+
RE_JUDGE_WASSHOI_ENTRY = /^WSE(?:@([1-6]))?$/i.freeze
|
|
277
|
+
RE_JUDGE_NRS = /^NRS(?:_(E|N|H|U|UH)(\d+))?(?:@([1-7]))?$/i.freeze
|
|
278
|
+
|
|
279
|
+
# 難易度の文字表現から整数値への対応
|
|
280
|
+
DIFFICULTY_SYMBOL_TO_INTEGER = {
|
|
281
|
+
'K' => 2,
|
|
282
|
+
'E' => 3,
|
|
283
|
+
'N' => 4,
|
|
284
|
+
'H' => 5,
|
|
285
|
+
'U' => 6,
|
|
286
|
+
'UH' => 6
|
|
287
|
+
}.freeze
|
|
288
|
+
|
|
289
|
+
register_prefix(
|
|
290
|
+
"UH",
|
|
291
|
+
"[KENHU]",
|
|
292
|
+
"SB",
|
|
293
|
+
"WS",
|
|
294
|
+
"WSE",
|
|
295
|
+
"NRS"
|
|
296
|
+
)
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
end
|
|
@@ -128,10 +128,10 @@ module BCDice
|
|
|
128
128
|
note_str = "クリティカル/スペシャル、ファンブルは未処理。必要なら確認すること。"
|
|
129
129
|
|
|
130
130
|
if roll_value >= 96
|
|
131
|
-
# 96
|
|
131
|
+
# 96以上は無条件で失敗
|
|
132
132
|
Result.failure("#{result_prefix_str} 失敗\n#{note_str}")
|
|
133
133
|
elsif roll_value <= 5 || roll_value <= modifiy_value
|
|
134
|
-
#
|
|
134
|
+
# 05以下あるいは修正値以下は無条件で成功
|
|
135
135
|
Result.success("#{result_prefix_str} 成功\n#{note_str}")
|
|
136
136
|
else
|
|
137
137
|
# 上記全てが当てはまらない時に突破可能な能力値を算出
|
|
@@ -151,15 +151,18 @@ module BCDice
|
|
|
151
151
|
elsif (roll_value == 100) || (roll_value >= (100 - funmble_value + 1))
|
|
152
152
|
# ファンブル(00は必ずファンブル)
|
|
153
153
|
Result.fumble("#{result_str} ファンブル")
|
|
154
|
+
elsif roll_value >= 96 || ((roll_value > success_value) && (roll_value > 5))
|
|
155
|
+
# 失敗(96以上は必ず失敗、出目が01-05ではなく技能値より上なら失敗)
|
|
156
|
+
Result.failure("#{result_str} 失敗")
|
|
154
157
|
elsif roll_value <= special_value
|
|
155
158
|
# スペシャル
|
|
156
159
|
Result.success("#{result_str} スペシャル")
|
|
157
|
-
elsif (roll_value <=
|
|
158
|
-
# 成功(
|
|
160
|
+
elsif (roll_value <= 5) || (roll_value <= success_value)
|
|
161
|
+
# 成功(05以下は必ず成功)
|
|
159
162
|
Result.success("#{result_str} 成功")
|
|
160
163
|
else
|
|
161
|
-
#
|
|
162
|
-
Result.failure("#{result_str}
|
|
164
|
+
# ここには到達しないはずだが、念のため捕捉
|
|
165
|
+
Result.failure("#{result_str} エラー")
|
|
163
166
|
end
|
|
164
167
|
end
|
|
165
168
|
end
|
|
@@ -51,15 +51,17 @@ module BCDice
|
|
|
51
51
|
|
|
52
52
|
dice_list = @randomizer.roll_barabara(2, 10).map { |d| d == 10 ? 0 : d }
|
|
53
53
|
total = dice_list.sum
|
|
54
|
+
success_level = 1 + dice_list.count { |val| val <= level }
|
|
54
55
|
|
|
55
56
|
return Result.new.tap do |result|
|
|
56
57
|
result.condition = total <= target
|
|
58
|
+
result.rands = dice_list
|
|
57
59
|
|
|
58
60
|
sequence = [
|
|
59
61
|
"(2D10<=#{target})",
|
|
60
62
|
"#{total}[#{dice_list.join(',')}]",
|
|
61
63
|
("チャンス" if dice_list.include?(0)),
|
|
62
|
-
result.success? ? "成功" : "失敗"
|
|
64
|
+
result.success? ? "成功(+#{success_level})" : "失敗"
|
|
63
65
|
].compact
|
|
64
66
|
|
|
65
67
|
result.text = sequence.join(" > ")
|
|
@@ -91,6 +93,7 @@ module BCDice
|
|
|
91
93
|
|
|
92
94
|
return Result.new.tap do |r|
|
|
93
95
|
r.condition = total <= target
|
|
96
|
+
r.rands = dice_list
|
|
94
97
|
r.critical = criticals >= 1
|
|
95
98
|
r.text = [
|
|
96
99
|
"(2D10<=#{target})",
|
|
@@ -114,6 +117,7 @@ module BCDice
|
|
|
114
117
|
|
|
115
118
|
return Result.new.tap do |r|
|
|
116
119
|
r.condition = total <= target
|
|
120
|
+
r.rands = dice_list
|
|
117
121
|
r.critical = criticals >= 1
|
|
118
122
|
r.text = [
|
|
119
123
|
"(3D10<=#{target})",
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bcdice/game_system/SajinsenkiAGuS'
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class SajinsenkiAGuS2E < SajinsenkiAGuS
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = 'SajinsenkiAGuS2E'
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = '砂塵戦機アーガス2ndEdition'
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
SORT_KEY = 'さしんせんきああかす2'
|
|
16
|
+
|
|
17
|
+
# ダイスボットの使い方
|
|
18
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
|
19
|
+
・一般判定Lv(チャンス出目0→判定0) nAG+x
|
|
20
|
+
nは習得レベル、Lv0の場合nの省略可能。xは判定値修正(数式による修正可)、省略した場合はレベル修正0
|
|
21
|
+
例)AG:習得レベル0の一般技能、1AG+1:習得レベル1・判定値修正+1の技能、AG+2-1:習得レベル0・判定値修正2-1の技能、(1-1)AG:習得レベル1・レベル修正-1の技能
|
|
22
|
+
|
|
23
|
+
・適正距離での命中判定(チャンス出目0→判定0、HR算出)OM+y@z
|
|
24
|
+
yは命中補正値(数式可)、zはクリティカル値。クリティカル値省略時は0
|
|
25
|
+
HRの算出時には、HRが大きくなる場合に出目0を10に読み替えます。
|
|
26
|
+
例)OM+18-6@2:命中補正値+18-6でクリティカル値2、適正距離の判定
|
|
27
|
+
|
|
28
|
+
・非適正距離での命中判定(チャンス出目0→判定0、HR算出)NM+y@z
|
|
29
|
+
yは命中補正値(数式可)、zはクリティカル値。クリティカル値省略時は0
|
|
30
|
+
HRの算出時には、HRが大きくなる場合に出目0を10に読み替えます。
|
|
31
|
+
例)NM+4-3:命中補正値+4-3で非適正距離の判定
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
・『西風旅徨』で導入されたファンブル・ルールを用いた判定
|
|
35
|
+
判定時にダイスがすべて8以上ならファンブル(自動失敗)です。
|
|
36
|
+
それぞれのコマンドにWを付けると『西風旅徨』モードになります。
|
|
37
|
+
・一般判定 nAGW+x
|
|
38
|
+
・適正距離での命中判定 OMW+y@z
|
|
39
|
+
・非適正距離での命中判定 NMW+y@z
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
・クリティカル表 CR
|
|
44
|
+
・鹵獲結果表 CAP
|
|
45
|
+
・幕間クエスト表 INT
|
|
46
|
+
・サルベージ表 SAL
|
|
47
|
+
・赤字ペナルティー表 DEF
|
|
48
|
+
・特殊戦況表 SPE
|
|
49
|
+
|
|
50
|
+
※通常の1D10などの10面ダイスにおいて出目10の読み替えはしません。コマンドのみです。
|
|
51
|
+
ページ参照は、何もない場合は「ルールブック」、wは「西風旅徨」を示します。
|
|
52
|
+
|
|
53
|
+
INFO_MESSAGE_TEXT
|
|
54
|
+
|
|
55
|
+
def initialize(command)
|
|
56
|
+
super(command)
|
|
57
|
+
@enabled_d9 = true
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def eval_game_system_specific_command(command)
|
|
61
|
+
super(command) ||
|
|
62
|
+
roll_ippan_west(command) ||
|
|
63
|
+
roll_hit_check_west(command) ||
|
|
64
|
+
roll_tables(command, SECOND_ED_TABLES)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def roll_ippan_west(command)
|
|
68
|
+
m = /AGW/.match(command)
|
|
69
|
+
return nil unless m
|
|
70
|
+
|
|
71
|
+
result = roll_ippan(command.sub(/(AG)W/) { ::Regexp.last_match(1) })
|
|
72
|
+
return change_fumble(result)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def roll_hit_check_west(command)
|
|
76
|
+
m = /[ON]MW/.match(command)
|
|
77
|
+
return nil unless m
|
|
78
|
+
|
|
79
|
+
result = roll_hit_check(command.sub(/([ON]M)W/) { ::Regexp.last_match(1) })
|
|
80
|
+
return change_fumble(result)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def change_fumble(result)
|
|
84
|
+
return nil if result.nil?
|
|
85
|
+
|
|
86
|
+
fumble_counts = result.rands.count { |val| val >= 8 }
|
|
87
|
+
if fumble_counts >= 2
|
|
88
|
+
result.text = result.text.sub(/(成功|失敗).*$/, 'ファンブル')
|
|
89
|
+
result.failure = true
|
|
90
|
+
result.success = false
|
|
91
|
+
result.fumble = true
|
|
92
|
+
end
|
|
93
|
+
return result
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
SECOND_ED_TABLES = {
|
|
97
|
+
"CAP" => DiceTable::Table.new(
|
|
98
|
+
"鹵獲結果表",
|
|
99
|
+
"2D10",
|
|
100
|
+
[
|
|
101
|
+
'0:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
|
|
102
|
+
'1:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
|
|
103
|
+
'2:敵A:GuS を完全な状態で鹵獲︕ ※総合価格÷ 2 で売却可。',
|
|
104
|
+
'3:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
|
|
105
|
+
'4:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
|
|
106
|
+
'5:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
|
|
107
|
+
'6:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
|
|
108
|
+
'7:敵A:GuS の兵装を鹵獲︕ ※敵A:GuS の装備している任意の兵装1つを獲得。',
|
|
109
|
+
'8:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
|
|
110
|
+
'9:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
|
|
111
|
+
'10:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
|
|
112
|
+
'11:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
|
|
113
|
+
'12:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
|
|
114
|
+
'13:使えそうな兵装を発見︕ ※1D10 を振り、出目の部位の兵装1つを獲得。',
|
|
115
|
+
'14:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
|
|
116
|
+
'15:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
|
|
117
|
+
'16:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
|
|
118
|
+
'17:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
|
|
119
|
+
'18:残念、完全にスクラップだ……。※部品代として[バランス値×300]cdtを獲得。',
|
|
120
|
+
]
|
|
121
|
+
),
|
|
122
|
+
"INT" => DiceTable::RangeTable.new(
|
|
123
|
+
"幕間クエスト表",
|
|
124
|
+
"1D100",
|
|
125
|
+
[
|
|
126
|
+
[1, '慰労 PC/クルー1名が、労ってくれる。 最大HP+4'],
|
|
127
|
+
[2..3, '感謝 PC/クルー1名が、感謝の気持ちを伝える。 最大HP+4'],
|
|
128
|
+
[4..5, '安堵 PC/ クルー1名が、安堵の気持ちを伝える。 最大HP+4'],
|
|
129
|
+
[6..7, '治療 戦闘中の怪我や急な病気で医療班のお世話になることに。 最大HP+4'],
|
|
130
|
+
[8..9, '日常 PC/クルー1名と、他愛のない日常の会話をする。 最大HP+4'],
|
|
131
|
+
[10..11, '遊興 PC/クルー1名と遊びに興じ、楽しい時を過ごす。 XP+1'],
|
|
132
|
+
[12..13, '勤労 PC/クルー1名と協力し、船内の仕事を行う。 XP+1'],
|
|
133
|
+
[14..15, '評価 PC/クルー1名が、仕事の出来を評価してくれる。 XP+1'],
|
|
134
|
+
[16..17, '調達 PC/クルー1名とともに生活品の買い出しを行うことに。 XP+1'],
|
|
135
|
+
[18..19, '社交 取引や補給などの仕事を通し、船外での社会経験を得る。 XP+1'],
|
|
136
|
+
[20..21, '注意 PC/クルー1名が、君の危険な戦闘行動について指摘する。 SP+1'],
|
|
137
|
+
[22..23, '反省 PC/クルー1名と、作戦行動の反省会を行う。 SP+1'],
|
|
138
|
+
[24..25, '鍛錬 PC/クルー1名に、模擬戦に付き合ってもらう。 SP+1'],
|
|
139
|
+
[26..27, '感心 PC/クルー1名の仕事や戦闘行動に対し、感銘を受ける。 SP+1'],
|
|
140
|
+
[28..29, '改良 整備班と協力し、A:GuSのプログラムの改良に努める。 SP+1'],
|
|
141
|
+
[30..31, '割引 兵装が割引されているのを発見し、格安で購入できる。 基本兵装1つを半額で購入可。'],
|
|
142
|
+
[32..33, '発見 クルー1名が、兵装を入手した。 基本兵装1つを半額で購入可。'],
|
|
143
|
+
[34..35, '発明 クルー1名が、兵装を開発した。 基本兵装1つを半額で購入可。'],
|
|
144
|
+
[36..37, '大発見 クルー1名が、強力な兵装を入手した! 上級兵装1つを購入可。(p37参照)'],
|
|
145
|
+
[38..39, '大発明 クルー1名が、新たな兵装を開発した! 上級兵装1つを購入可。(p37参照)'],
|
|
146
|
+
[40..41, '昔話 PC/クルー1名に、自分の過去について語ってしまう。 最大LP+1'],
|
|
147
|
+
[42..43, '願望 PC/クルー1名に、自分の夢や未来について語ってしまう。 最大LP+1'],
|
|
148
|
+
[44..45, '家族 PC/クルー1名に、自分の家族について語ってしまう。 最大LP+1'],
|
|
149
|
+
[46..47, '望郷 PC/クルー1名に、自分の故郷について語ってしまう。 最大LP+1'],
|
|
150
|
+
[48..49, '知人 PC/クルー1名に、自分の知人を重ね合わせてしまう。 最大LP+1'],
|
|
151
|
+
[50..51, '個人収入 チームとは関係ない個人的な商売や取引で利益を得る。 4,000cdtを獲得。'],
|
|
152
|
+
[52..53, '臨時収入 思いがけない臨時の収入が入る。 4,000cdt を獲得。'],
|
|
153
|
+
[54..55, '取引 クルー1 名と取引を行い、予算を獲得することに成功する。 4,000cdtを獲得。'],
|
|
154
|
+
[56..57, '裏取引 クルー1 名と秘密の取引を行い、見返りとして予算を獲得。 6,000cdtを獲得。'],
|
|
155
|
+
[58..59, '賞与 オーナーが特別に報酬を用意してくれた! 6,000cdtを獲得。'],
|
|
156
|
+
[60..61, '改造 整備班とともに機体の改造に明け暮れる。 任意の改造Lv+1。(上限:2Lv)'],
|
|
157
|
+
[62..63, '鹵獲 鹵獲品の中から機体の改造に使えるものを発見。 任意の改造Lv+1。(上限:2Lv)'],
|
|
158
|
+
[64..65, '強化 案機体を強化するための画期的なアイディアを思いつく。 任意の改造Lv+1。(上限:2Lv)'],
|
|
159
|
+
[66..67, '懇願 整備班に頼みこみ、機体の改造をしてもらう。 任意の改造Lv+1。(上限:3Lv)'],
|
|
160
|
+
[68..69, '掘出物 掘出物を発見、整備班が早速機体に取り付けてくれた。 任意の改造Lv+1。(上限:3Lv)'],
|
|
161
|
+
[70..71, '募集 クルーの募集を行ったところ、何名か候補が現れた。 クルー1名を割安(20,000cdt)で雇用可。'],
|
|
162
|
+
[72..73, '勧誘 有能な人材を発見した。ぜひ雇い入れたいものだが。 クルー1名を割安(20,000cdt)で雇用可。'],
|
|
163
|
+
[74..75, '推薦 依頼人からの推薦で、クルーを1名紹介される。 クルー1名を割安(20,000cdt)で雇用可。'],
|
|
164
|
+
[76..77, '志願 クルーとして雇って欲しい、という人物が現れる。クルー1名を割安(15,000cdt)で雇用可。'],
|
|
165
|
+
[78..79, '成長 見習いクルーが大分成長してきた。もう1人前と見てもいい。クルー1名を割安(15,000cdt)で雇用可。'],
|
|
166
|
+
[80..81, '交渉 依頼人との交渉がうまくいき、少し報酬を割増ししてもらえる。 チーム予算を8,000cdt獲得。'],
|
|
167
|
+
[82..83, '節約 経費が思ったよりも節約できた。経理やオーナーの機嫌が良い。 チーム予算を8,000cdt獲得。'],
|
|
168
|
+
[84..85, '賞金 今回の敵は賞金がかかっていたようで臨時収入が入った。 チーム予算を8,000cdt獲得。'],
|
|
169
|
+
[86..87, '名声 チームの名声が高まっており、クルーの自尊心が刺激される。 チーム予算を12,000cdt獲得。'],
|
|
170
|
+
[88..89, '一致団結 オーナーからの労いがあり、クルー一同の結束力が高まる。 チーム予算を12,000cdt獲得。'],
|
|
171
|
+
[90..91, '点検 PC/クルー1名とシップに異状がないか点検作業を行う。 拠点AP+10。'],
|
|
172
|
+
[92..93, '補修 整備班とともにくたびれたシップの改装作業を行う。 拠点AP+10。'],
|
|
173
|
+
[94..95, '全面改修 艦内の問題箇所を全面的に改修する。 拠点AP+10。'],
|
|
174
|
+
[96..97, '自由 行動自由気ままに好きなことをして過ごす。 00~49の任意の効果を適用可。(p69参照)'],
|
|
175
|
+
[98..99, '歓迎 街の住民にたいへんな歓迎を受ける。 50~95の任意の効果を適用可。(p69参照)'],
|
|
176
|
+
[100, '慰労 PC/クルー1名が、労ってくれる。 最大HP+4'],
|
|
177
|
+
]
|
|
178
|
+
),
|
|
179
|
+
"SAL" => DiceTable::RangeTable.new(
|
|
180
|
+
"サルベージ表",
|
|
181
|
+
"1D100",
|
|
182
|
+
[
|
|
183
|
+
[1..2, '大失敗…。大変な損失を出してしまった…。 -5,000cdt'],
|
|
184
|
+
[3..5, '失敗…。かなりの損失を出してしまった…。 -3,000cdt'],
|
|
185
|
+
[6..9, '失敗…。損失を出してしまった…。 -1,000cdt'],
|
|
186
|
+
[10, '大成功!大きな収益を上げることができた! +5,000cdt'],
|
|
187
|
+
[11..19, '空振り……何の成果も得られなかった…。 0cdt'],
|
|
188
|
+
[20, '掘り出し物を発見!2Lv改造済の【基本携行兵装】一つを獲得! 一般兵装(→p34)'],
|
|
189
|
+
[21..22, 'ジャンク品を発見。船の装甲強化くらいには使えそうだ。 拠点AP+[5]'],
|
|
190
|
+
[23..25, 'ジャンク品を発見。少し赤字だがまあやむを得まい。 +1,000cdt'],
|
|
191
|
+
[26..29, 'ジャンク品を発見。手間賃くらいにはなった。 +2,000cdt'],
|
|
192
|
+
[30, '掘り出し物を発見!2Lv改造済の【基本外装兵装】一つを獲得! 一般兵装(→p35)'],
|
|
193
|
+
[31..32, '成功!少しだが利益を出すことができた! +3,000cdt'],
|
|
194
|
+
[33..35, '成功!まずまずの利益を出すことができた! +5,000cdt'],
|
|
195
|
+
[36..39, '大成功!大きな利益を出すことができた! +7,000cdt'],
|
|
196
|
+
[40..41, '良質のバッテリーを獲得。 EP+[4]'],
|
|
197
|
+
[42..43, '良質の装甲版を獲得。 AP+[4]'],
|
|
198
|
+
[44, '大失敗…。大きな損失を出してしまった…。 -5,000cdt'],
|
|
199
|
+
[45, 'ブレードを獲得。 →p34'],
|
|
200
|
+
[46, 'ランスを獲得。 →p34'],
|
|
201
|
+
[47, 'アンカーブレードを獲得。 →p34'],
|
|
202
|
+
[48, 'パイルバンカーを獲得。 →p34'],
|
|
203
|
+
[49, 'ハンドガンを獲得。 →p35'],
|
|
204
|
+
[50, 'ヘビーハンドガンを獲得。 →p35'],
|
|
205
|
+
[51, 'ライフルを獲得。 →p35'],
|
|
206
|
+
[52, 'アンカーショットを獲得。 →p35'],
|
|
207
|
+
[53, 'マシンガンSを獲得。 →p35'],
|
|
208
|
+
[54, 'マシンガンLを獲得。 →p35'],
|
|
209
|
+
[55, 'ミサイルポッドSを獲得。 →p35'],
|
|
210
|
+
[56, 'ミサイルポッドLを獲得。 →p35'],
|
|
211
|
+
[57, 'バズーカを獲得。 →p35'],
|
|
212
|
+
[58, 'カノンを獲得。 →p35'],
|
|
213
|
+
[59, 'ライトシールドを獲得。 →p35'],
|
|
214
|
+
[60, 'ミドルシールドを獲得。 →p35'],
|
|
215
|
+
[61, 'ヘビーシールドを獲得。 →p35'],
|
|
216
|
+
[62, 'レーダーユニットを獲得。 →p35'],
|
|
217
|
+
[63, 'ECMユニットを獲得。 →p35'],
|
|
218
|
+
[64, 'サブブースターを獲得。 →p36'],
|
|
219
|
+
[65, 'ディフェンスサポートを獲得。 →p36'],
|
|
220
|
+
[66, 'コンバットサポートを獲得。 →p36'],
|
|
221
|
+
[67, '大失敗…。大きな損失を出してしまった…。 -5,000cdt'],
|
|
222
|
+
[68, 'ショットサポートを獲得。 →p36'],
|
|
223
|
+
[69, 'パワーローダーを獲得。 →p36'],
|
|
224
|
+
[70, 'サブバッテリーを獲得。 →p36'],
|
|
225
|
+
[71, 'サブバッテリー+を獲得。 →p36'],
|
|
226
|
+
[72, 'ファランクスを獲得。 →p36'],
|
|
227
|
+
[73, 'リアクティブアーマーを獲得。 →p36'],
|
|
228
|
+
[74, '強化装甲版を獲得。 →p36'],
|
|
229
|
+
[75, 'ヘビーマシンガンSを獲得。 →p35'],
|
|
230
|
+
[76, 'ヘビーマシンガンLを獲得。 →p35'],
|
|
231
|
+
[77, '掘り出し物を発見!25,000cdt以下の【上級外装兵装】一つを獲得! 上級兵装 (→p37)'],
|
|
232
|
+
[78..79, '失敗…。かなりの損失を出してしまった…。 -3,000cdt'],
|
|
233
|
+
[80, '医療用品を獲得! 調息値+[1](全PC)'],
|
|
234
|
+
[81, '大型ソーラーパネルを獲得! 整備値+[1](全PC)'],
|
|
235
|
+
[82, '艦内用の環境設備を獲得! サポート使用回数+[1]'],
|
|
236
|
+
[83, 'リニアガンを獲得。 →p37'],
|
|
237
|
+
[84, 'リニアマシンガンを獲得。 →p37'],
|
|
238
|
+
[85, 'ジャマ―ユニットを獲得。 →p37'],
|
|
239
|
+
[86, 'センサー+を獲得。 →p37'],
|
|
240
|
+
[87, 'パワーローダー++を獲得。 →p37'],
|
|
241
|
+
[88, 'サブバッテリー++を獲得。 →p37'],
|
|
242
|
+
[89, 'フレームカバーを獲得。 →p37'],
|
|
243
|
+
[90, '空振り……何の成果も得られなかった…。 0cdt'],
|
|
244
|
+
[91..92, '良質なA:GuSのパーツを獲得!機体の改造や予備パーツとして使えそうだ! 改造Lv+[1](上限:3Lv)'],
|
|
245
|
+
[93..95, 'A:GuSのパーツを獲得!機体の改造や予備パーツとして使えそうだ。 改造Lv+[1](上限:1Lv)'],
|
|
246
|
+
[96..98, '多少傷ついているが、A:GuS1機を獲得!→10,000cdtで売却可能→10,000cdt支払えば補修して取得が可能。 (→p30~33)(→w23)'],
|
|
247
|
+
[99, 'A:GuS1機をほぼ完全な状態で獲得! (→p30~33)(→w23)'],
|
|
248
|
+
[100, '掘り出し物を発見!25,000cdt以下の【上級携行兵装】一つを獲得! 上級兵装 (→p37)'],
|
|
249
|
+
]
|
|
250
|
+
),
|
|
251
|
+
"DEF" => DiceTable::RangeTable.new(
|
|
252
|
+
"赤字ペナルティー表",
|
|
253
|
+
"1D10",
|
|
254
|
+
[
|
|
255
|
+
[1, '解雇 クルー1名を失う。10,000cdtを得る。'],
|
|
256
|
+
[2..3, '劣化 任意のチーム能力一つは-1Lv。10,000cdtを得る。'],
|
|
257
|
+
[4..5, '借金 次回の維持費が+20,000cdt。10,000cdtを得る。'],
|
|
258
|
+
[6..7, '酷使 各PCは最大HP-4。10,000cdtを得る。'],
|
|
259
|
+
[8..9, '売却 各PCはオプション以外の兵装を一つずつ廃棄。10,000cdtを得る。'],
|
|
260
|
+
[10, '解雇 クルー1名を失う。10,000cdtを得る。'],
|
|
261
|
+
]
|
|
262
|
+
),
|
|
263
|
+
# DiceTable::Tableが現状1D9に未対応
|
|
264
|
+
"SPE" => DiceTable::Table.new(
|
|
265
|
+
"特殊戦況表",
|
|
266
|
+
"1D10",
|
|
267
|
+
[
|
|
268
|
+
'混戦 以下のエリアのユニットをシャッフルする。♠:A⇔C ♣:B⇔D ♦:A⇔D ♥:B⇔C',
|
|
269
|
+
'乱戦 R中、すべての攻撃は[距離:○]になる。',
|
|
270
|
+
'逸失 敵拠点エリアのユニットを[♠♣:A ♦♥:B]に移動。味方拠点エリアのユニットを[♠♣:D ♦♥:C]に移動。',
|
|
271
|
+
'突風 艦船、オブジェクト以外の全ユニットを「風向き」方向に移動。',
|
|
272
|
+
'流砂 以下のエリアのユニットは脱出のため、MPとEPを[3]点失う。[♠:A ♣:B ♦:C ♥:D]',
|
|
273
|
+
'混乱 母船内でトラブル発生。R中、【整備】は行えない。[♠♥:味方側 ♣♦:敵側]',
|
|
274
|
+
'岩盤 以下のエリアのユニットは岩盤に乗り上げ、《クリティカル》が1回発生。[♠:A ♣:B ♦:C ♥:D]',
|
|
275
|
+
'混乱 R中、イニシア値を逆順で処理する。 ※【エイミング】等の高低も逆として処理する。',
|
|
276
|
+
'飛礫 飛礫によって、すべてのユニットはAPを[1D10](以下のエリアでは[2D10])点失う。[♠:A ♣:B ♦:C ♥:D]',
|
|
277
|
+
'雨 雨は砂を土へと変えてしまう。R中、全ユニット移動/突撃不可。',
|
|
278
|
+
]
|
|
279
|
+
),
|
|
280
|
+
}.freeze
|
|
281
|
+
register_prefix_from_super_class()
|
|
282
|
+
register_prefix('-?\d*AGW', 'OMW', 'NMW', SECOND_ED_TABLES.keys)
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|