bcdice 3.9.0 → 3.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -1
- data/README.md +0 -1
- data/lib/bcdice/game_system/CastleInGray.rb +6 -4
- data/lib/bcdice/game_system/DemonSpike.rb +89 -0
- data/lib/bcdice/game_system/Emoklore.rb +3 -3
- data/lib/bcdice/game_system/GundamSentinel.rb +377 -0
- data/lib/bcdice/game_system/HeroScale.rb +837 -0
- data/lib/bcdice/game_system/KemonoNoMori.rb +133 -1
- data/lib/bcdice/game_system/MamonoScramble.rb +98 -0
- data/lib/bcdice/game_system/MonotoneMuseum.rb +4 -2
- data/lib/bcdice/game_system/NSSQ.rb +24 -11
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +167 -0
- data/lib/bcdice/game_system/ShinobiGami.rb +155 -26
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +40 -12
- data/lib/bcdice/game_system/Ventangle.rb +133 -0
- data/lib/bcdice/game_system/ZombiLine.rb +115 -0
- data/lib/bcdice/game_system/cthulhu7th/rollable.rb +2 -0
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +2 -0
- data/lib/bcdice/game_system.rb +7 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5804af6296cb509b73b2489953c75a3ebc2c88a6be93f398cfa6b46d69eabe26
|
4
|
+
data.tar.gz: a1b868d3706fd20040ed1720f572cbbc60479b7b43f500361cd49af5d8dce5b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c84ded2153b972ef840a345142fa2d599f6e023eb309ee3e5761bd8f74b9a8e2f6c2437b0c8cbbbf40b8dffe273910179e0baac2db10c9194b65dab5ea630c35
|
7
|
+
data.tar.gz: 744050243951df6df9b0816f3d7c6f71ff82796278b42438a828c1e9797224d18cf830ad6818ee8715fe4c6f799ef5d2cf4a7fad18655d09a086bde44d133ce4
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,38 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 3.11.0 2023/08/23
|
4
|
+
|
5
|
+
### 対応ゲームシステムの追加
|
6
|
+
- ガンダム・センチネルRPG (GundamSentinel): Facelessさんありがとうっ! ([#633](https://github.com/bcdice/BCDice/pull/633), [#634](https://github.com/bcdice/BCDice/pull/634))
|
7
|
+
- マモノスクランブル (MamonoScramble): ([#635](https://github.com/bcdice/BCDice/pull/635))
|
8
|
+
- デモンスパイク (DemonSpike): ([#636](https://github.com/bcdice/BCDice/pull/636))
|
9
|
+
- RuneQuest:Roleplaying in Glorantha (RuneQuestRoleplayingInGlorantha): フレッド緑野さんありがとうっ! ([#637](https://github.com/bcdice/BCDice/pull/637))
|
10
|
+
- ゾンビライン (ZombiLine): 蜂紫さんありがとうっ! ([#638](https://github.com/bcdice/BCDice/pull/638/files))
|
11
|
+
|
12
|
+
## 3.10.0 2023/07/15
|
13
|
+
|
14
|
+
### 対応ゲームシステムの追加
|
15
|
+
- 英雄の尺度 (HeroScale): モグさんありがとうっ! ([#613](https://github.com/bcdice/BCDice/pull/613))
|
16
|
+
- Ventangle (Ventangle): 三木里 秀予さんありがとうっ! ([#626](https://github.com/bcdice/BCDice/pull/626))
|
17
|
+
|
18
|
+
### 追加機能
|
19
|
+
- Vampire:The Masquerade5th: Hungerダイスを内数指定できるコマンドを追加。フレッド緑野さんありがとうっ! ([#615](https://github.com/bcdice/BCDice/pull/615))
|
20
|
+
- モノトーンミュージアムRPG: 目標値 `?` に対応。えいむさんありがとうっ! ([#617](https://github.com/bcdice/BCDice/pull/617))
|
21
|
+
- シノビガミ: ヘルプメッセージを修正 ([#618](https://github.com/bcdice/BCDice/pull/618))
|
22
|
+
- シノビガミ: 表を多数追加。NiSLaさんありがとうっ! ([#625](https://github.com/bcdice/BCDice/pull/625))
|
23
|
+
- 獸ノ森: 「嚙神ノ宴」の表を追加。ゆいこさんありがとうっ! ([#629](https://github.com/bcdice/BCDice/pull/629))
|
24
|
+
- SRSじゃない世界樹の迷宮TRPG: 判定の成否を表示するよう変更。ゆいこさんありがとうっ! ([#630](https://github.com/bcdice/BCDice/pull/630))
|
25
|
+
|
26
|
+
### 変更
|
27
|
+
- SRSじゃない世界樹の迷宮TRPG: 各種表記を公式ルールの用語に合わせて変更。ゆいこさんありがとうっ! ([#630](https://github.com/bcdice/BCDice/pull/630))
|
28
|
+
|
29
|
+
### 誤植修正
|
30
|
+
- シノビガミ: ヘルプメッセージを修正 ([#618](https://github.com/bcdice/BCDice/pull/618))
|
31
|
+
- エモクロアTRPG: ヘルプメッセージを修正。電気魚さんありがとうっ! ([#622](https://github.com/bcdice/BCDice/pull/622))
|
32
|
+
|
33
|
+
### バグ修正
|
34
|
+
- シノビガミ: 異形表を修正。クキソージさんありがとうっ! ([#621](https://github.com/bcdice/BCDice/pull/621))
|
35
|
+
|
3
36
|
## 3.9.0 2023/03/25
|
4
37
|
|
5
38
|
### 対応ゲームシステムの追加
|
@@ -9,11 +42,12 @@
|
|
9
42
|
### 追加機能
|
10
43
|
- 初音ミクTRPG: 表をいくつか追加。カルメヤキさんありがとうっ! ([#602](https://github.com/bcdice/BCDice/pull/602))
|
11
44
|
- スタンダードRPGシステム系: クリティカルを `@` で、ファンブルを `#` で指定できるように。三木里 秀予さんありがとうっ! ([#605](https://github.com/bcdice/BCDice/pull/605))
|
45
|
+
- シノビガミ: 表を多数追加。NiSLaさん、hetaregirl1802さん、三木里 秀予さんありがとうっ! ([#608](https://github.com/bcdice/BCDice/pull/608))
|
12
46
|
- ダンジョンズ&ドラゴンズ第5版: 両手持ちのダメージ算出コマンドを追加。Facelessさんありがとうっ! ([#612](https://github.com/bcdice/BCDice/pull/612))
|
13
47
|
- ダンジョンズ&ドラゴンズ第5版: 攻撃ロールでクリティカル値を指定できるように。Facelessさんありがとうっ! ([#612](https://github.com/bcdice/BCDice/pull/612))
|
14
48
|
|
15
49
|
### 変更
|
16
|
-
- シノビガミ: 変調表と戦場表の内容を改訂版に変更。 ([#
|
50
|
+
- シノビガミ: 変調表と戦場表の内容を改訂版に変更。NiSLaさんありがとうっ! ([#608](https://github.com/bcdice/BCDice/pull/608))
|
17
51
|
|
18
52
|
### 誤植修正
|
19
53
|
- 歯車の塔の探空士(冒険企画局): 航行イベント表 困難系の誤植を修正。おさむさんありがとうっ! ([#607](https://github.com/bcdice/BCDice/pull/607))
|
data/README.md
CHANGED
@@ -4,7 +4,6 @@
|
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/bcdice.svg)](https://badge.fury.io/rb/bcdice)
|
5
5
|
[![YARD](https://img.shields.io/badge/yard-docs-blue.svg)](https://yard.bcdice.org/)
|
6
6
|
[![codecov](https://codecov.io/gh/bcdice/BCDice/branch/master/graph/badge.svg)](https://codecov.io/gh/bcdice/BCDice)
|
7
|
-
[![Maintainability](https://api.codeclimate.com/v1/badges/15261694a7d758c4309f/maintainability)](https://codeclimate.com/github/bcdice/BCDice/maintainability)
|
8
7
|
[![Discord](https://img.shields.io/discord/597133335243784192.svg?color=7289DA&logo=discord&logoColor=fff)][invite discord]
|
9
8
|
|
10
9
|
様々なTRPGシステムの判定に対応したオンセツール用ダイスコマンドエンジン
|
@@ -1,16 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BCDice
|
2
4
|
module GameSystem
|
3
5
|
class CastleInGray < Base
|
4
6
|
# ゲームシステムの識別子
|
5
|
-
ID = "CastleInGray"
|
7
|
+
ID = "CastleInGray"
|
6
8
|
|
7
9
|
# ゲームシステム名
|
8
|
-
NAME = "灰色城綺譚"
|
10
|
+
NAME = "灰色城綺譚"
|
9
11
|
|
10
12
|
# ゲームシステム名の読みがな
|
11
|
-
SORT_KEY = "はいいろしようきたん"
|
13
|
+
SORT_KEY = "はいいろしようきたん"
|
12
14
|
|
13
|
-
HELP_MESSAGE = <<~TEXT
|
15
|
+
HELP_MESSAGE = <<~TEXT
|
14
16
|
■ 色占い (BnWm)
|
15
17
|
n: 黒
|
16
18
|
m: 白
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class DemonSpike < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = 'DemonSpike'
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = 'デモンスパイク'
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = 'てもんすはいく'
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
17
|
+
・行為判定 xDS+y
|
18
|
+
行為判定を行い、達成値、成否、成功度を出力する。
|
19
|
+
x: ダイス数(省略:2)
|
20
|
+
y: 能力値やスパイク能力による達成値の修正(省略可)
|
21
|
+
INFO_MESSAGE_TEXT
|
22
|
+
|
23
|
+
register_prefix('\d*DS')
|
24
|
+
|
25
|
+
def eval_game_system_specific_command(command)
|
26
|
+
roll_action(command)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def roll_action(command)
|
32
|
+
parser = Command::Parser.new("DS", round_type: @round_type)
|
33
|
+
.enable_prefix_number
|
34
|
+
.restrict_cmp_op_to(nil)
|
35
|
+
parsed = parser.parse(command)
|
36
|
+
unless parsed
|
37
|
+
return nil
|
38
|
+
end
|
39
|
+
|
40
|
+
parsed.prefix_number ||= 2
|
41
|
+
if parsed.prefix_number < 2
|
42
|
+
return nil
|
43
|
+
end
|
44
|
+
|
45
|
+
step = roll_step(parsed.prefix_number)
|
46
|
+
step_list = [step]
|
47
|
+
while step[:dice_sum] == 10
|
48
|
+
step = roll_step(parsed.prefix_number)
|
49
|
+
step_list.push(step)
|
50
|
+
end
|
51
|
+
|
52
|
+
is_fumble = step_list[0][:dice_sum] == 2
|
53
|
+
total = is_fumble ? 0 : step_list.sum { |s| s[:dice_sum] } + parsed.modify_number
|
54
|
+
success_level = total / 10
|
55
|
+
is_success = total >= 10
|
56
|
+
|
57
|
+
res =
|
58
|
+
if is_success
|
59
|
+
"成功, 成功度#{success_level}"
|
60
|
+
elsif is_fumble
|
61
|
+
"自動的失敗"
|
62
|
+
else
|
63
|
+
"失敗"
|
64
|
+
end
|
65
|
+
|
66
|
+
sequence = [
|
67
|
+
"(#{parsed})",
|
68
|
+
step_list.map { |s| "#{s[:dice_sum]}[#{s[:dice_list].join(',')}]" },
|
69
|
+
total,
|
70
|
+
res,
|
71
|
+
].flatten
|
72
|
+
|
73
|
+
return Result.new.tap do |r|
|
74
|
+
r.condition = is_success
|
75
|
+
r.critical = step_list.length > 1
|
76
|
+
r.fumble = is_fumble
|
77
|
+
r.text = sequence.join(" > ")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def roll_step(times)
|
82
|
+
dice_list = @randomizer.roll_barabara(times, 6).sort.reverse
|
83
|
+
dice_sum = (dice_list[0] + dice_list[1]).clamp(2, 10)
|
84
|
+
|
85
|
+
return {dice_list: dice_list, dice_sum: dice_sum}
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -22,10 +22,10 @@ module BCDice
|
|
22
22
|
ダイスの個数は省略可能で、省略した場合1個になります。
|
23
23
|
例)2DM<=5 DM<=8
|
24
24
|
・技能値判定(sDAa+z)
|
25
|
-
"(技能レベル)DA(能力値)+(
|
26
|
-
|
25
|
+
"(技能レベル)DA(能力値)+(ダイスボーナス)"で指定します。
|
26
|
+
ダイスボーナスの個数は省略可能で、省略した場合0になります。
|
27
27
|
技能レベルは1~3の数値、またはベース技能の場合"b"が入ります。
|
28
|
-
|
28
|
+
ダイスの個数は技能レベルとダイスボーナスの個数により決定し、s+z個のダイスを振ります。(s="b"の場合はs=1)
|
29
29
|
判定値はs+aとなります。(s="b"の場合はs=0)
|
30
30
|
MESSAGETEXT
|
31
31
|
|
@@ -0,0 +1,377 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class GundamSentinel < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = 'GundamSentinel'
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = 'ガンダム・センチネルRPG'
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = 'かんたむせんちねる'
|
14
|
+
|
15
|
+
# ダイスボットの使い方
|
16
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
17
|
+
・基本戦闘(BB, BBM)
|
18
|
+
BB[+修正][>回避値]で基本戦闘を判定します。回避値を指定すると、命中・回避も表示します。
|
19
|
+
BBM[+修正][>回避値]でモブ用の基本戦闘を判定します。クリティカルを判定します。回避値を指定すると、命中・回避も表示します。
|
20
|
+
|
21
|
+
例)BB BBM BB+5>14 BBM+5>15
|
22
|
+
|
23
|
+
・一般技能(GS)
|
24
|
+
GS[+修正][>目標値]で一般技能を判定します。目標値を指定しない場合は、目標値10で判定します。
|
25
|
+
|
26
|
+
例)GS GS+5 GS+5>10
|
27
|
+
|
28
|
+
|
29
|
+
・各種表
|
30
|
+
敵MSクリティカルヒットチャート (ECHC)
|
31
|
+
PC用脱出判定チャート (PEJC[+m] m:修正)
|
32
|
+
艦船追加ダメージ決定チャート (ASDC)
|
33
|
+
対空砲結果チャート (AARC[+m]=t m:修正, t:対空防御力)
|
34
|
+
リハビリ判定チャート (RTJC[+m] m:修正)
|
35
|
+
二次被害判定チャート (SDDC)
|
36
|
+
INFO_MESSAGE_TEXT
|
37
|
+
|
38
|
+
def initialize(command)
|
39
|
+
super(command)
|
40
|
+
|
41
|
+
@round_type = RoundType::CEIL
|
42
|
+
@d66_sort_type = D66SortType::NO_SORT
|
43
|
+
end
|
44
|
+
|
45
|
+
def eval_game_system_specific_command(command)
|
46
|
+
roll_basic_battle(command) ||
|
47
|
+
roll_general_skill(command) ||
|
48
|
+
roll_anti_aircraft_gun_result_chart(command) ||
|
49
|
+
roll_escape_chart(command) ||
|
50
|
+
roll_rehabilitation_chart(command) ||
|
51
|
+
roll_tables(command, TABLES)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
# 基本戦闘ロール
|
57
|
+
def roll_basic_battle(command)
|
58
|
+
m = /^BB(M)?([-+][-+\d]+)?(>([-+\d]+))?/.match(command)
|
59
|
+
return nil unless m
|
60
|
+
|
61
|
+
mob = m[1]
|
62
|
+
modify = ArithmeticEvaluator.eval(m[2])
|
63
|
+
have_modify = false
|
64
|
+
have_modify = true if m[2]
|
65
|
+
avoid = ArithmeticEvaluator.eval(m[4])
|
66
|
+
have_avoid = false
|
67
|
+
have_avoid = true if m[4]
|
68
|
+
|
69
|
+
d60 = @randomizer.roll_once(6)
|
70
|
+
d06 = @randomizer.roll_once(6)
|
71
|
+
total_d = d60 * 10 + d06
|
72
|
+
d60 += (d06 + modify - 1).div(6)
|
73
|
+
d06 = (d06 + modify - 1).modulo(6) + 1
|
74
|
+
total = d60 * 10 + d06
|
75
|
+
total = 11 if total < 11
|
76
|
+
|
77
|
+
success = false
|
78
|
+
failure = false
|
79
|
+
critical = false
|
80
|
+
|
81
|
+
modify_label = nil
|
82
|
+
if have_modify
|
83
|
+
if modify >= 0
|
84
|
+
modify_label = "#{total_d}+#{modify}"
|
85
|
+
else
|
86
|
+
modify_label = "#{total_d}#{modify}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
critical_label = nil
|
91
|
+
if mob && (total >= 66)
|
92
|
+
critical_label = "クリティカル"
|
93
|
+
critical = true
|
94
|
+
end
|
95
|
+
|
96
|
+
result = nil
|
97
|
+
if have_avoid
|
98
|
+
if total > avoid
|
99
|
+
result = "命中(+" + count_success(total, avoid).to_s + ")"
|
100
|
+
success = true
|
101
|
+
else
|
102
|
+
result = "回避"
|
103
|
+
failure = true
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
sequence = [
|
108
|
+
"(#{command})",
|
109
|
+
modify_label,
|
110
|
+
total,
|
111
|
+
result,
|
112
|
+
critical_label,
|
113
|
+
].compact
|
114
|
+
|
115
|
+
Result.new(sequence.join(" > ")).tap do |r|
|
116
|
+
r.success = success
|
117
|
+
r.failure = failure
|
118
|
+
r.critical = critical
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def count_success(dice, avoid)
|
123
|
+
d60 = dice.div(10)
|
124
|
+
d06 = dice.modulo(10)
|
125
|
+
a60 = avoid.div(10)
|
126
|
+
a06 = avoid.modulo(10)
|
127
|
+
|
128
|
+
return ((d60 * 6 + d06) - (a60 * 6 + a06))
|
129
|
+
end
|
130
|
+
|
131
|
+
# 一般技能ロール
|
132
|
+
def roll_general_skill(command)
|
133
|
+
m = /^GS([-+][-+\d]+)?(>([-+\d]+))?/.match(command)
|
134
|
+
return nil unless m
|
135
|
+
|
136
|
+
modify = ArithmeticEvaluator.eval(m[1])
|
137
|
+
have_modify = false
|
138
|
+
have_modify = true if m[1]
|
139
|
+
target = ArithmeticEvaluator.eval(m[3])
|
140
|
+
target = 10 unless m[3]
|
141
|
+
|
142
|
+
success = false
|
143
|
+
failure = false
|
144
|
+
|
145
|
+
dice = @randomizer.roll_sum(2, 6)
|
146
|
+
|
147
|
+
modify_label = nil
|
148
|
+
if have_modify
|
149
|
+
if modify >= 0
|
150
|
+
modify_label = "#{dice}+#{modify}"
|
151
|
+
else
|
152
|
+
modify_label = "#{dice}#{modify}"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
total = dice + modify
|
156
|
+
if total > target
|
157
|
+
result = "成功"
|
158
|
+
success = true
|
159
|
+
else
|
160
|
+
result = "失敗"
|
161
|
+
failure = true
|
162
|
+
end
|
163
|
+
|
164
|
+
sequence = [
|
165
|
+
"(#{command})",
|
166
|
+
modify_label,
|
167
|
+
total,
|
168
|
+
result,
|
169
|
+
].compact
|
170
|
+
|
171
|
+
Result.new(sequence.join(" > ")).tap do |r|
|
172
|
+
r.success = success
|
173
|
+
r.failure = failure
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# 各種表
|
178
|
+
|
179
|
+
# 対空砲結果チャート
|
180
|
+
GUN_RESULT_CHART = [
|
181
|
+
["D", "H", "H", "H", 10, 8, 6, 5, 4, 2, 1, "-", "-"],
|
182
|
+
["D", "H", "H", "H", 12, 10, 9, 8, 6, 5, 3, 2, "-"],
|
183
|
+
["D", "D", "H", "H", "H", 12, 10, 9, 7, 6, 4, 3, 1],
|
184
|
+
["D", "D", "H", "H", "H", 14, 13, 12, 10, 8, 6, 5, 3],
|
185
|
+
["D", "D", "D", "H", "H", "H", 14, 13, 11, 9, 7, 6, 4],
|
186
|
+
["D", "D", "D", "H", "H", "H", "H", 16, 14, 12, 11, 8, 6],
|
187
|
+
].freeze
|
188
|
+
|
189
|
+
def roll_anti_aircraft_gun_result_chart(command)
|
190
|
+
parser = Command::Parser.new("AARC", round_type: @round_type).restrict_cmp_op_to(:==)
|
191
|
+
parsed = parser.parse(command)
|
192
|
+
|
193
|
+
return nil unless parsed
|
194
|
+
|
195
|
+
target = parsed.target_number.clamp(1, 6)
|
196
|
+
dice = @randomizer.roll_sum(2, 6)
|
197
|
+
total = (dice + parsed.modify_number).clamp(1, 13)
|
198
|
+
|
199
|
+
cmd =
|
200
|
+
if parsed.modify_number != 0
|
201
|
+
"(#{dice}#{Format.modifier(parsed.modify_number)}=#{total})"
|
202
|
+
else
|
203
|
+
total.to_s
|
204
|
+
end
|
205
|
+
result = GUN_RESULT_CHART[target - 1][total - 1]
|
206
|
+
|
207
|
+
Result.new().tap do |r|
|
208
|
+
r.text = "対空砲結果チャート(#{cmd}vs#{target}) > 結果「#{result}」"
|
209
|
+
r.condition = result.is_a?(Integer)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
# PC用脱出判定チャート
|
214
|
+
ESCAPE_CHART = [
|
215
|
+
'*',
|
216
|
+
'*',
|
217
|
+
'無傷で脱出',
|
218
|
+
'無傷で脱出',
|
219
|
+
'無傷で脱出',
|
220
|
+
'軽傷で脱出「1D6ダメージ。」',
|
221
|
+
'中傷で脱出「2D6ダメージ。」',
|
222
|
+
'重傷で脱出「3D6ダメージ。」',
|
223
|
+
'重体で脱出「1D3の耐久力が残る。」',
|
224
|
+
'戦死「二階級特進。」',
|
225
|
+
'戦死「二階級特進。」',
|
226
|
+
'戦死「二階級特進。」',
|
227
|
+
'戦死「二階級特進。」',
|
228
|
+
].freeze
|
229
|
+
|
230
|
+
def roll_escape_chart(command)
|
231
|
+
parser = Command::Parser.new("PEJC", round_type: @round_type).restrict_cmp_op_to(nil)
|
232
|
+
parsed = parser.parse(command)
|
233
|
+
return nil unless parsed
|
234
|
+
|
235
|
+
dice = @randomizer.roll_sum(2, 6)
|
236
|
+
total = (dice + parsed.modify_number).clamp(2, 12)
|
237
|
+
|
238
|
+
cmd =
|
239
|
+
if parsed.modify_number != 0
|
240
|
+
"#{dice}#{Format.modifier(parsed.modify_number)}=#{total}"
|
241
|
+
else
|
242
|
+
total.to_s
|
243
|
+
end
|
244
|
+
result = ESCAPE_CHART[total]
|
245
|
+
|
246
|
+
Result.new("PC用脱出判定チャート(#{cmd}) > #{result}")
|
247
|
+
end
|
248
|
+
|
249
|
+
REHABILITATION_CHART = [
|
250
|
+
'*',
|
251
|
+
'*',
|
252
|
+
'なし',
|
253
|
+
'1ヶ月',
|
254
|
+
'2ヶ月',
|
255
|
+
'3ヶ月',
|
256
|
+
'4ヶ月',
|
257
|
+
'5ヶ月',
|
258
|
+
'6ヶ月',
|
259
|
+
'10ヶ月',
|
260
|
+
'1年',
|
261
|
+
'1年6ヶ月',
|
262
|
+
'1年と、もう一度このチャートで振った結果分を足した期間',
|
263
|
+
].freeze
|
264
|
+
|
265
|
+
def roll_rehabilitation_chart(command)
|
266
|
+
parser = Command::Parser.new("RTJC", round_type: @round_type).restrict_cmp_op_to(nil)
|
267
|
+
parsed = parser.parse(command)
|
268
|
+
return nil unless parsed
|
269
|
+
|
270
|
+
dice = @randomizer.roll_sum(2, 6)
|
271
|
+
total = (dice + parsed.modify_number).clamp(2, 12)
|
272
|
+
|
273
|
+
cmd =
|
274
|
+
if parsed.modify_number != 0
|
275
|
+
"#{dice}#{Format.modifier(parsed.modify_number)}=#{total}"
|
276
|
+
else
|
277
|
+
total.to_s
|
278
|
+
end
|
279
|
+
result = REHABILITATION_CHART[total]
|
280
|
+
|
281
|
+
Result.new("リハビリ判定チャート(#{cmd}) > #{result}")
|
282
|
+
end
|
283
|
+
|
284
|
+
TABLES = {
|
285
|
+
'ECHC' => DiceTable::Table.new(
|
286
|
+
'敵MSクリティカルヒットチャート',
|
287
|
+
'2D6',
|
288
|
+
[
|
289
|
+
'コックピット直撃:目標MSは残骸となる。',
|
290
|
+
'腕破損:同時に携帯武器も失う。携帯武装の交換も行えない。直ちにモラル判定を-4で行う。',
|
291
|
+
'射撃武装破損:目標MSはその時点で使用しているナンバーの若い武装を1つ失う。全ての武装を失った場合、モラル判定を行う。',
|
292
|
+
'頭部直撃:目標MSはメインカメラを失い、以後射撃、格闘の命中判定に-6の修正を受ける。頭部に装備されている武装も失われる。',
|
293
|
+
'パイロット気絶:目標MSは回復するまで行動不能。',
|
294
|
+
'目標MSへのダメージ2倍。',
|
295
|
+
'目標MSへのダメージ2倍。',
|
296
|
+
'目標MSへのダメージ3倍。',
|
297
|
+
'脚破損:目標MSは、以後の回避値に-6の修正を受ける。',
|
298
|
+
'コントロール不能:目標MSは1D6ラウンドの間、行動不能。',
|
299
|
+
'熱核ジェネレーター直撃:目標MSは直ちに爆発(耐久力0)する。',
|
300
|
+
]
|
301
|
+
),
|
302
|
+
'ASDC' => DiceTable::Table.new(
|
303
|
+
'艦船追加ダメージ決定チャート',
|
304
|
+
'2D6',
|
305
|
+
[
|
306
|
+
'ブリッジ損傷「複数ある艦は、総てのブリッジが損傷すると以後の対空防御は修正を+5する。」',
|
307
|
+
'カタパルト損傷「複数ある艦は、総てのカタパルトが損傷すると、MSの発着艦ができなくなる。」',
|
308
|
+
'追加ダメージ「追加2D6×2ダメージ。」',
|
309
|
+
'主砲大破「主砲1門を失う。」',
|
310
|
+
'副砲大破「副砲1門を失う。」',
|
311
|
+
'追加ダメージ「追加2D6ダメージ。」',
|
312
|
+
'追加ダメージ「追加2D6ダメージ。」',
|
313
|
+
'追加ダメージ「追加2D6ダメージ。」',
|
314
|
+
'1ターン行動不能「1ターンはその艦は何も行動ができない。」',
|
315
|
+
'航行不能「その艦はそのヘックスから動けなくなる。」',
|
316
|
+
'エンジン誘爆「1D6×10%の耐久力を失う。」',
|
317
|
+
]
|
318
|
+
),
|
319
|
+
'SDDC' => DiceTable::D66GridTable.new(
|
320
|
+
'二次被害判定チャート',
|
321
|
+
[
|
322
|
+
[
|
323
|
+
'奇蹟的に無傷「不発!?今回のダメージは0。」',
|
324
|
+
'メインカメラ破損「以後、射撃、格闘の命中判定に-3の修正を受ける。」',
|
325
|
+
'コクピット破損「以後の追加ダメージ判定に-1の修正を受ける。」',
|
326
|
+
'右腕損傷「携帯していた武装も失う。また右腕での武器の使用はできなくなる。」',
|
327
|
+
'左腕損傷「携帯していた武装も失う。また左腕での武器の使用はできなくなる。」',
|
328
|
+
'気絶「気絶判定の余地無く、必ず気絶する。」',
|
329
|
+
],
|
330
|
+
[
|
331
|
+
'気絶「気絶判定を-6の修正で行う。」',
|
332
|
+
'気絶「気絶判定を-4の修正で行う。」',
|
333
|
+
'気絶「気絶判定を-2の修正で行う。」',
|
334
|
+
'気絶「気絶判定を行う。」',
|
335
|
+
'予備弾倉破損「携帯している予備弾倉かEパックを1つ失う。」',
|
336
|
+
'サブカメラ破損「以後、射撃、格闘の命中判定に-1の修正を受ける。」',
|
337
|
+
],
|
338
|
+
[
|
339
|
+
'固定武装破損「固定されている武装を1つ失う。」',
|
340
|
+
'予備武装破損「携帯している以外の武装を1つ失う。」',
|
341
|
+
'頭部破損「メインカメラも失い、以後、射撃、格闘の命中判定に-3の修正を受ける。」',
|
342
|
+
'右脚破損「以後、回避値が1D3低下する。」',
|
343
|
+
'左脚破損「以後、回避値が1D3低下する。」',
|
344
|
+
'操縦機構破損「以後、すべての行動は消費行動ポイントを1ポイント余分に消費する。」',
|
345
|
+
],
|
346
|
+
[
|
347
|
+
'軽傷「パイロットは1D6のダメージを受ける。また気絶判定を行う。」',
|
348
|
+
'中傷「パイロットは2D6のダメージを受ける。また気絶判定を-6修正で行う。」',
|
349
|
+
'重傷「パイロットは3D6のダメージを受ける。また気絶判定を-9修正で行う。」',
|
350
|
+
'操縦伝達部破損「以後すべての射撃、格闘の命中判定と回避値に-1の修正を受ける。」',
|
351
|
+
'センサー破損「イニシアティブ決定に-1の修正を受ける。」',
|
352
|
+
'脱出機構破損「脱出判定に+3の修正を受ける。」',
|
353
|
+
],
|
354
|
+
[
|
355
|
+
'熱核ジェネレーター損傷「行動の「追加移動」が行えなくなる。」',
|
356
|
+
'右腕の携帯武装破損「右腕に持っていた武装を1つ失う。」',
|
357
|
+
'左腕の携帯武装破損「左腕に持っていた武装を1つ失う。」',
|
358
|
+
'サブスラスター破損「回避値が1低下する。」',
|
359
|
+
'プロペラントタンク破損「プロペラントタンクを1つ失う。」',
|
360
|
+
'バックパック破損「推進剤3D6ポイント失う。」',
|
361
|
+
],
|
362
|
+
[
|
363
|
+
'メインスラスター破損「回避値が1D6低下する。」',
|
364
|
+
'動力パイプ破損「以後、行動ポイント決定のダイスに-1の修正を受ける。」',
|
365
|
+
'動力伝達機構破損「以後、行動ポイント決定のサイコロに-1D3の修正を受ける。」',
|
366
|
+
'サブスラスター破損「旋回が120度までしかできなくなる。」',
|
367
|
+
'メインスラスター破損「旋回が60度までしかできなくなる。」',
|
368
|
+
'熱核ジェネレーター直撃「そのMSは爆発する。PCは直ちに脱出判定を行う。」',
|
369
|
+
]
|
370
|
+
]
|
371
|
+
),
|
372
|
+
}.freeze
|
373
|
+
|
374
|
+
register_prefix('BBM?', 'GS', 'AARC', 'PEJC', 'RTJC', TABLES.keys)
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|