bcdice 3.10.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 +40 -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/DemonSpike.rb +89 -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/GundamSentinel.rb +377 -0
- 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/MamonoScramble.rb +98 -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 +170 -0
- 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/ZombiLine.rb +115 -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 +9 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +13 -3
@@ -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
|
@@ -96,7 +96,7 @@ module BCDice
|
|
96
96
|
"大漁\n船内マップ上にいるすべてのキャラクターの【生命点】の最大値を「2点」増加する。この効果は重複しない。\n 飛翔イカの群れだ! どうも、 窓から漏れる明かりにつられてやってきたらしい。網をはろう。今夜は新鮮なイカがたらふく食べられそうだ。",
|
97
97
|
"気流+1\n飛空艇コマを1スポット分進める。\n 他の空域よりも、比較的強い流れが一定の方向に吹き続けている空域。ときに探空士たちの手助けになり、ときに探空士たちに立ちはだかる。どの空域にどんな風が流れているかを見極めて進むのが、空の旅での基本だ。",
|
98
98
|
"ケセランパセラン\nキミは任意の船内マップ上に配置されてるパーツ1つを選択する。そのパーツが【快適度】のキーワード効果がある場合、このセッションの間、その数値は「1点」高いものとして扱う。\n ふわふわとした大きな綿毛のような浮遊生物。その毛のさわり心地は、上級階級のソファにも使われるほど柔らかい。捕まえて飼うことができれば、一服の癒やしをあたえてくれることだろう。",
|
99
|
-
"うさこぷたー\nキミの【生命点】を「3点」回復する。\n
|
99
|
+
"うさこぷたー\nキミの【生命点】を「3点」回復する。\n ふたつの耳を回転させて空を飛ぶうさぎのような浮遊生物が、ずっとこちらを見つめている。かわいいはかわいいのだが、こいつは一体なんなんだろう……。"
|
100
100
|
]
|
101
101
|
),
|
102
102
|
"NEO" => DiceTable::Table.new(
|
@@ -334,6 +334,11 @@ module BCDice
|
|
334
334
|
if command.modifier_after_half != 0
|
335
335
|
text += Format.modifier(command.modifier_after_half)
|
336
336
|
end
|
337
|
+
elsif command.one_and_a_half
|
338
|
+
text = "(#{text})*1.5"
|
339
|
+
if command.modifier_after_one_and_a_half != 0
|
340
|
+
text += Format.modifier(command.modifier_after_one_and_a_half)
|
341
|
+
end
|
337
342
|
end
|
338
343
|
sequence.push(text)
|
339
344
|
elsif command.half
|
@@ -342,6 +347,12 @@ module BCDice
|
|
342
347
|
text += Format.modifier(command.modifier_after_half)
|
343
348
|
end
|
344
349
|
sequence.push(text)
|
350
|
+
elsif command.one_and_a_half
|
351
|
+
text = "#{rateResults.first}*1.5"
|
352
|
+
if command.modifier_after_one_and_a_half != 0
|
353
|
+
text += Format.modifier(command.modifier_after_one_and_a_half)
|
354
|
+
end
|
355
|
+
sequence.push(text)
|
345
356
|
end
|
346
357
|
|
347
358
|
if round > 1
|
@@ -355,6 +366,11 @@ module BCDice
|
|
355
366
|
if command.modifier_after_half != 0
|
356
367
|
total += command.modifier_after_half
|
357
368
|
end
|
369
|
+
elsif command.one_and_a_half
|
370
|
+
total = (total * 1.5).ceil
|
371
|
+
if command.modifier_after_one_and_a_half != 0
|
372
|
+
total += command.modifier_after_one_and_a_half
|
373
|
+
end
|
358
374
|
end
|
359
375
|
|
360
376
|
total_text = total.to_s
|
@@ -39,6 +39,13 @@ module BCDice
|
|
39
39
|
クリティカル値を指定しない場合、クリティカルなしと扱われます。
|
40
40
|
例)HK20 K20h HK10-5@9 K10-5@9H K20gfH K20+8H+2 K20+8H+(1+1)
|
41
41
|
|
42
|
+
・レーティング表の1.5倍 (OHKx, KxOH+N)
|
43
|
+
レーティング表の先頭または末尾に"OH"をつけると、レーティング表を振って最終結果を1.5倍します。
|
44
|
+
末尾につけた場合、直後に修正ををつけることで、1.5倍後の加減算を行うことができます。
|
45
|
+
この際、複数の項による修正にはカッコで囲うことが必要です(カッコがないとパースに失敗します)
|
46
|
+
クリティカル値を指定しない場合、クリティカルなしと扱われます。
|
47
|
+
例)OHK20 K20oh OHK10-5@9 K20+8OH+2 K20+8OH+(1+1)
|
48
|
+
|
42
49
|
・ダイス目の修正(運命変転やクリティカルレイ用)
|
43
50
|
末尾に「$修正値」でダイス目に修正がかかります。
|
44
51
|
$+1と修正表記ならダイス目に+修正、$9のように固定値ならダイス目をその出目に差し替え。
|
@@ -82,7 +89,7 @@ module BCDice
|
|
82
89
|
アビスカース表を出すことができます。
|
83
90
|
INFO_MESSAGE_TEXT
|
84
91
|
|
85
|
-
register_prefix('H?K', 'Gr', '2D6?@\d+', 'FT', 'TT', 'Dru', 'ABT')
|
92
|
+
register_prefix('H?K', 'OHK', 'Gr', '2D6?@\d+', 'FT', 'TT', 'Dru', 'ABT')
|
86
93
|
|
87
94
|
def eval_game_system_specific_command(command)
|
88
95
|
case command
|
@@ -22,14 +22,14 @@ module BCDice
|
|
22
22
|
2VMF6+3
|
23
23
|
2VMI9H3
|
24
24
|
|
25
|
-
難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Winのチェックを行う
|
25
|
+
難易度指定:成功数のカウント、判定成功と失敗、Critical処理、Critical Win、Total Failureのチェックを行う
|
26
26
|
(Hungerダイスがある場合)Messy CriticalとBestial Failureチェックを行う
|
27
27
|
例) (難易度)VMF(通常ダイス)+(Hungerダイス)
|
28
28
|
(難易度)VMF(通常ダイス)
|
29
29
|
(難易度)VMI(通常ダイス)H(Hungerダイス)
|
30
30
|
(難易度)VMI(通常ダイス)
|
31
31
|
|
32
|
-
難易度省略:成功数のカウント、判定失敗、Critical
|
32
|
+
難易度省略:成功数のカウント、判定失敗、Critical処理、Total Failure、(Hungerダイスがある場合)Bestial Failureチェックを行う
|
33
33
|
判定成功、Messy Criticalのチェックを行わない
|
34
34
|
Critical Win、(Hungerダイスがある場合)Bestial Failure、Messy Criticalのヒントを出力
|
35
35
|
例) VMF(通常ダイス)+(Hungerダイス)
|
@@ -58,7 +58,7 @@ module BCDice
|
|
58
58
|
register_prefix('\d*(VMF|(VMI\d*(H\d?)?))')
|
59
59
|
|
60
60
|
def eval_game_system_specific_command(command)
|
61
|
-
m = /\A(\d+)?(((VMF)(\d)(\+(\d+))?)|((VMI)(\d)(H(\d+))?))$/.match(command)
|
61
|
+
m = /\A(\d+)?(((VMF)(\d+)(\+(\d+))?)|((VMI)(\d+)(H(\d+))?))$/.match(command)
|
62
62
|
unless m
|
63
63
|
return ''
|
64
64
|
end
|
@@ -67,6 +67,9 @@ module BCDice
|
|
67
67
|
if dice_pool < 0
|
68
68
|
return "ダイスプールより多いHungerダイスは指定できません。"
|
69
69
|
end
|
70
|
+
if hunger_dice_pool && hunger_dice_pool > 5
|
71
|
+
return "Hungerダイス指定は5ダイスが最大です。"
|
72
|
+
end
|
70
73
|
|
71
74
|
dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
|
72
75
|
result_text = "(#{dice_pool}D10"
|
@@ -128,6 +131,9 @@ module BCDice
|
|
128
131
|
if hunger_botch_dice > 0
|
129
132
|
return Result.fumble("#{result_text}:判定失敗! [Bestial Failure]")
|
130
133
|
end
|
134
|
+
if success_dice == 0
|
135
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
136
|
+
end
|
131
137
|
|
132
138
|
return Result.failure("#{result_text}:判定失敗!")
|
133
139
|
end
|
@@ -137,7 +143,7 @@ module BCDice
|
|
137
143
|
return Result.fumble("#{result_text}:判定失敗! [Bestial Failure]")
|
138
144
|
end
|
139
145
|
|
140
|
-
return Result.
|
146
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
141
147
|
else
|
142
148
|
if hunger_botch_dice > 0
|
143
149
|
result_text = "#{result_text}\n 判定失敗なら [Bestial Failure]"
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class WerewolfTheApocalypse5th < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = 'WerewolfTheApocalypse5th'
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = 'Werewolf: The Apocalypse 5th Edition'
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = 'わあうふるしあほかりふす5'
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
17
|
+
・判定コマンド(nWAFx+x または nWAIxRx)
|
18
|
+
WAFコマンドはRageダイスとダイスプールを個別に指定する。
|
19
|
+
WAIコマンドはRageダイスをダイスプールの内数として指定する。
|
20
|
+
|
21
|
+
例:難易度2、9ダイスプールでRageダイス3個の場合、それぞれ以下のようなコマンドとなる。
|
22
|
+
2WAF6+3
|
23
|
+
2WAI9R3
|
24
|
+
|
25
|
+
難易度指定:成功数のカウント、判定成功と失敗、(Rageダイスがある場合)Brutal outcome、Critical処理、Total Failure、Critical Winのチェックを行う
|
26
|
+
例) (難易度)WAF(通常ダイス)+(Rageダイス)
|
27
|
+
(難易度)WAF(通常ダイス)
|
28
|
+
(難易度)WAI(通常ダイス)R(Rageダイス)
|
29
|
+
(難易度)WAI(通常ダイス)
|
30
|
+
|
31
|
+
難易度省略:成功数のカウント、判定失敗、(Rageダイスがある場合)Brutal outcome、Critical処理、Total Failureのチェックを行う
|
32
|
+
判定成功チェックを行わない
|
33
|
+
Critical Winのヒントを出力
|
34
|
+
例) WAF(通常ダイス)+(Rageダイス)
|
35
|
+
WAF(通常ダイス)
|
36
|
+
WAI(通常ダイス)R(Rageダイス)
|
37
|
+
WAI(通常ダイス)
|
38
|
+
|
39
|
+
難易度0指定:Critical処理と成功数のカウントを行い、全てのチェックを行わない
|
40
|
+
例) 0WAF(通常ダイス)+(Rageダイス)
|
41
|
+
0WAF(通常ダイス)
|
42
|
+
0WAI(通常ダイス)+(Rageダイス)
|
43
|
+
0WAI(通常ダイス)
|
44
|
+
|
45
|
+
MESSAGETEXT
|
46
|
+
|
47
|
+
DIFFICULTY_INDEX = 1
|
48
|
+
DICE_POOL_RAGE_DICE_NO_INCLUDED_INDEX = 5
|
49
|
+
RAGE_DICE_NO_INCLUDED_INDEX = 7
|
50
|
+
COMMAND_RAGE_DICE_INCLUDED_INDEX = 9
|
51
|
+
DICE_POOL_RAGE_DICE_INCLUDED_INDEX = 10
|
52
|
+
RAGE_DICE_INCLUDED_INDEX = 12
|
53
|
+
|
54
|
+
# 難易度に指定可能な特殊値
|
55
|
+
NOT_CHECK_SUCCESS = -1 # 判定成功にかかわるチェックを行わない(判定失敗に関わるチェックは行う)
|
56
|
+
|
57
|
+
register_prefix('\d*(WAF|(WAI\d*(R\d?)?))')
|
58
|
+
|
59
|
+
def eval_game_system_specific_command(command)
|
60
|
+
m = /\A(\d+)?(((WAF)(\d+)(\+(\d+))?)|((WAI)(\d+)(R(\d+))?))$/.match(command)
|
61
|
+
unless m
|
62
|
+
return ''
|
63
|
+
end
|
64
|
+
|
65
|
+
dice_pool, rage_dice_pool = get_dice_pools(m)
|
66
|
+
if dice_pool < 0
|
67
|
+
return "ダイスプールより多いRageダイス指定はできません。"
|
68
|
+
end
|
69
|
+
if rage_dice_pool && rage_dice_pool > 5
|
70
|
+
return "5を超えるRageダイス指定はできません。"
|
71
|
+
end
|
72
|
+
|
73
|
+
dice_text, success_dice, ten_dice, = make_dice_roll(dice_pool)
|
74
|
+
result_text = "(#{dice_pool}D10"
|
75
|
+
|
76
|
+
if rage_dice_pool
|
77
|
+
rage_dice_text, rage_success_dice, rage_ten_dice, brutal_result_dice = make_dice_roll(rage_dice_pool)
|
78
|
+
|
79
|
+
brutal_outcome = brutal_result_dice / 2
|
80
|
+
ten_dice += rage_ten_dice
|
81
|
+
success_dice += rage_success_dice
|
82
|
+
|
83
|
+
result_text = "#{result_text}+#{rage_dice_pool}D10) > [#{dice_text}]+[#{rage_dice_text}] "
|
84
|
+
else
|
85
|
+
rage_ten_dice = 0
|
86
|
+
brutal_outcome = 0
|
87
|
+
result_text = "#{result_text}) > [#{dice_text}] "
|
88
|
+
end
|
89
|
+
|
90
|
+
success_dice += get_critical_success(ten_dice)
|
91
|
+
|
92
|
+
difficulty = m[DIFFICULTY_INDEX] ? m[DIFFICULTY_INDEX].to_i : NOT_CHECK_SUCCESS
|
93
|
+
|
94
|
+
return get_roll_result(result_text, success_dice, ten_dice, rage_ten_dice, brutal_outcome, difficulty)
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def get_dice_pools(m)
|
100
|
+
rage_dice_included_command = m[COMMAND_RAGE_DICE_INCLUDED_INDEX]
|
101
|
+
if rage_dice_included_command && rage_dice_included_command == "WAI"
|
102
|
+
# Rage Diceを内数処理するの場合
|
103
|
+
rage_dice_pool = m[RAGE_DICE_INCLUDED_INDEX]&.to_i
|
104
|
+
dice_pool = m[DICE_POOL_RAGE_DICE_INCLUDED_INDEX].to_i - (rage_dice_pool || 0)
|
105
|
+
else
|
106
|
+
# Rage DiceがPLによる内数指定の場合
|
107
|
+
rage_dice_pool = m[RAGE_DICE_NO_INCLUDED_INDEX]&.to_i
|
108
|
+
dice_pool = m[DICE_POOL_RAGE_DICE_NO_INCLUDED_INDEX].to_i
|
109
|
+
end
|
110
|
+
return dice_pool, rage_dice_pool
|
111
|
+
end
|
112
|
+
|
113
|
+
def get_roll_result(result_text, success_dice, ten_dice, _rage_ten_dice, brutal_outcome, difficulty)
|
114
|
+
is_critical = ten_dice >= 2
|
115
|
+
|
116
|
+
if brutal_outcome > 0 && difficulty != 0
|
117
|
+
success_dice += 4
|
118
|
+
result_text = "#{result_text} [Brutal outcome] 自動失敗、または 成功数=#{success_dice}"
|
119
|
+
else
|
120
|
+
result_text = "#{result_text} 成功数=#{success_dice}"
|
121
|
+
end
|
122
|
+
|
123
|
+
if difficulty > 0
|
124
|
+
result_text = "#{result_text} 難易度=#{difficulty}"
|
125
|
+
if success_dice >= difficulty
|
126
|
+
result_text = "#{result_text} 差分=#{success_dice - difficulty}"
|
127
|
+
|
128
|
+
if is_critical
|
129
|
+
result_data = Result.critical("#{result_text}:判定成功! [Critical Win]")
|
130
|
+
return brutal_outcome > 0 ? result_data.text : result_data
|
131
|
+
end
|
132
|
+
result_data = Result.success("#{result_text}:判定成功!")
|
133
|
+
return brutal_outcome > 0 ? result_data.text : result_data
|
134
|
+
else
|
135
|
+
if success_dice == 0
|
136
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
137
|
+
else
|
138
|
+
return Result.failure("#{result_text}:判定失敗!")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
elsif difficulty < 0
|
142
|
+
if success_dice == 0
|
143
|
+
return Result.fumble("#{result_text}:判定失敗! [Total Failure]")
|
144
|
+
else
|
145
|
+
if is_critical
|
146
|
+
result_text = "#{result_text}\n 判定成功なら [Critical Win]"
|
147
|
+
end
|
148
|
+
return result_text.to_s
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# 難易度0指定(=全ての判定チェックを行わない)
|
153
|
+
return result_text.to_s
|
154
|
+
end
|
155
|
+
|
156
|
+
def get_critical_success(ten_dice)
|
157
|
+
# 10の目が2個毎に追加2成功
|
158
|
+
return ((ten_dice / 2) * 2)
|
159
|
+
end
|
160
|
+
|
161
|
+
def make_dice_roll(dice_pool)
|
162
|
+
dice_list = @randomizer.roll_barabara(dice_pool, 10)
|
163
|
+
|
164
|
+
dice_text = dice_list.join(',')
|
165
|
+
success_dice = dice_list.count { |x| x >= 6 }
|
166
|
+
ten_dice = dice_list.count(10)
|
167
|
+
brutal_result_dice = dice_list.count(1) + dice_list.count(2)
|
168
|
+
|
169
|
+
return dice_text, success_dice, ten_dice, brutal_result_dice
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|