bcdice 3.11.0 → 3.13.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 +58 -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/arithmetic/parser.rb +4 -2
- data/lib/bcdice/base.rb +1 -1
- data/lib/bcdice/command/parser.rb +4 -2
- data/lib/bcdice/common_command/add_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/barabara_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/calc/parser.rb +4 -2
- data/lib/bcdice/common_command/reroll_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/tally_dice/parser.rb +4 -2
- data/lib/bcdice/common_command/upper_dice/parser.rb +4 -2
- data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
- data/lib/bcdice/game_system/Alsetto.rb +2 -2
- data/lib/bcdice/game_system/AniMalus.rb +221 -0
- data/lib/bcdice/game_system/ArknightsFan.rb +182 -0
- data/lib/bcdice/game_system/Avandner.rb +1 -1
- data/lib/bcdice/game_system/BBN.rb +1 -1
- data/lib/bcdice/game_system/BadLife.rb +3 -3
- data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
- data/lib/bcdice/game_system/Chill3.rb +6 -6
- data/lib/bcdice/game_system/DarkSouls.rb +1 -1
- data/lib/bcdice/game_system/Elric.rb +1 -1
- data/lib/bcdice/game_system/Emoklore.rb +4 -6
- data/lib/bcdice/game_system/FullFace.rb +92 -0
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +44 -19
- data/lib/bcdice/game_system/HunterTheReckoning5th.rb +10 -3
- data/lib/bcdice/game_system/InfiniteFantasia.rb +4 -1
- data/lib/bcdice/game_system/Insane_Korean.rb +11 -11
- data/lib/bcdice/game_system/Irisbane.rb +1 -1
- data/lib/bcdice/game_system/KamitsubakiCityUnderConstructionNarrative.rb +251 -0
- data/lib/bcdice/game_system/KillDeathBusiness.rb +1 -1
- data/lib/bcdice/game_system/KyokoShinshoku.rb +158 -0
- data/lib/bcdice/game_system/Liminal.rb +136 -0
- data/lib/bcdice/game_system/MetalHead.rb +1 -1
- data/lib/bcdice/game_system/MetalHeadExtream.rb +1 -1
- data/lib/bcdice/game_system/NRR.rb +122 -0
- data/lib/bcdice/game_system/NSSQ.rb +1 -1
- data/lib/bcdice/game_system/NightWizard.rb +1 -1
- data/lib/bcdice/game_system/NightWizard3rd.rb +15 -2
- data/lib/bcdice/game_system/NinjaSlayer.rb +3 -1
- data/lib/bcdice/game_system/NinjaSlayer2.rb +299 -0
- data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
- data/lib/bcdice/game_system/PastFutureParadox.rb +1238 -0
- data/lib/bcdice/game_system/Postman.rb +3 -3
- data/lib/bcdice/game_system/RecordOfSteam.rb +1 -1
- data/lib/bcdice/game_system/RuneQuestRoleplayingInGlorantha.rb +10 -7
- data/lib/bcdice/game_system/Ryutama.rb +4 -4
- data/lib/bcdice/game_system/SajinsenkiAGuS.rb +5 -1
- data/lib/bcdice/game_system/SajinsenkiAGuS2E.rb +285 -0
- data/lib/bcdice/game_system/Siren.rb +97 -0
- data/lib/bcdice/game_system/Skynauts.rb +1 -1
- data/lib/bcdice/game_system/SkynautsBouken.rb +1 -1
- data/lib/bcdice/game_system/Strave.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/TherapieSein.rb +1 -1
- data/lib/bcdice/game_system/TrinitySeven.rb +1 -1
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +21 -9
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +179 -0
- data/lib/bcdice/game_system/cthulhu7th/full_auto.rb +1 -1
- 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 +177 -130
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -1
- data/lib/bcdice/game_system.rb +12 -0
- data/lib/bcdice/loader.rb +1 -1
- data/lib/bcdice/version.rb +1 -1
- metadata +32 -5
@@ -57,11 +57,11 @@ module BCDice
|
|
57
57
|
diceCount = 2 if diceCount < 2
|
58
58
|
|
59
59
|
modify = (Regexp.last_match(2) || 0).to_i
|
60
|
-
modifyAddString =
|
60
|
+
modifyAddString = Regexp.last_match(3) || ''
|
61
61
|
|
62
|
-
type =
|
62
|
+
type = Regexp.last_match(6) || ''
|
63
63
|
target = (Regexp.last_match(7) || 0).to_i
|
64
|
-
targetAddString =
|
64
|
+
targetAddString = Regexp.last_match(8) || ''
|
65
65
|
|
66
66
|
modify_list = modifyAddString.scan(/[+-]\d+/)
|
67
67
|
modify_list.each { |i| modify += i.to_i }
|
@@ -7,7 +7,7 @@ module BCDice
|
|
7
7
|
ID = 'RuneQuestRoleplayingInGlorantha'
|
8
8
|
|
9
9
|
# ゲームシステム名
|
10
|
-
NAME = '
|
10
|
+
NAME = 'ルーンクエスト:ロールプレイング・イン・グローランサ'
|
11
11
|
|
12
12
|
# ゲームシステム名の読みがな
|
13
13
|
SORT_KEY = 'るうんくえすと4'
|
@@ -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
|
@@ -108,8 +108,8 @@ module BCDice
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def isValidDice(dice1, dice2)
|
111
|
-
return
|
112
|
-
|
111
|
+
return isValidDiceOne(dice1) &&
|
112
|
+
isValidDiceOne(dice2)
|
113
113
|
end
|
114
114
|
|
115
115
|
def isValidDiceOne(dice)
|
@@ -144,7 +144,7 @@ module BCDice
|
|
144
144
|
return ''
|
145
145
|
end
|
146
146
|
|
147
|
-
if
|
147
|
+
if total >= difficulty
|
148
148
|
return "成功"
|
149
149
|
end
|
150
150
|
|
@@ -152,7 +152,7 @@ module BCDice
|
|
152
152
|
end
|
153
153
|
|
154
154
|
def isFamble(value1, value2)
|
155
|
-
return (
|
155
|
+
return (value1 == 1) && (value2 == 1)
|
156
156
|
end
|
157
157
|
|
158
158
|
def isCritical(value1, value2, dice1, dice2)
|
@@ -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
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bcdice/command/parser'
|
4
|
+
|
5
|
+
module BCDice
|
6
|
+
module GameSystem
|
7
|
+
class Siren < Base
|
8
|
+
# ゲームシステムの識別子
|
9
|
+
ID = "Siren"
|
10
|
+
|
11
|
+
# ゲームシステム名
|
12
|
+
NAME = "終末アイドル育成TRPG セイレーン"
|
13
|
+
|
14
|
+
# ゲームシステム名の読みがな
|
15
|
+
SORT_KEY = "せいれえん"
|
16
|
+
|
17
|
+
HELP_MESSAGE = <<~TEXT
|
18
|
+
・判定: SL+a<=b±c
|
19
|
+
a=達成値への修正(0の場合は省略)
|
20
|
+
b=能力値
|
21
|
+
c=判定への修正(0の場合は省略、複数可)
|
22
|
+
例)判定修正-10の装備を装着しながら【技術:60】〈兵器:2〉で判定する場合。
|
23
|
+
SL+2<=60+40-10
|
24
|
+
|
25
|
+
・育成: TR$a<=b
|
26
|
+
a=育成した回数
|
27
|
+
b=ヘルス
|
28
|
+
例)ヘルスの現在値が60で2回目の【身体】の育成を行う場合。
|
29
|
+
TR$2<=60
|
30
|
+
TEXT
|
31
|
+
|
32
|
+
def eval_game_system_specific_command(command)
|
33
|
+
case command
|
34
|
+
when /^SL/ then check_action(command)
|
35
|
+
when /^TR/ then check_training(command)
|
36
|
+
else return nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def check_action(command)
|
41
|
+
parser = Command::Parser.new('SL', round_type: @round_type).restrict_cmp_op_to(:<=)
|
42
|
+
parsed = parser.parse(command)
|
43
|
+
return nil if parsed.nil?
|
44
|
+
|
45
|
+
target = parsed.target_number
|
46
|
+
|
47
|
+
dice = @randomizer.roll_once(100)
|
48
|
+
|
49
|
+
if dice > target
|
50
|
+
return Result.failure("(1D100<=#{target}) > #{dice} > 失敗")
|
51
|
+
end
|
52
|
+
|
53
|
+
dig10 = dice / 10
|
54
|
+
dig1 = dice % 10
|
55
|
+
if dig10 == 0
|
56
|
+
dig10 = 10
|
57
|
+
end
|
58
|
+
if dig1 == 0
|
59
|
+
dig1 = 10
|
60
|
+
end
|
61
|
+
achievement_value = dig10 + dig1 + parsed.modify_number
|
62
|
+
return Result.success("(1D100<=#{target}) > #{dice} > 成功(達成値:#{achievement_value})")
|
63
|
+
end
|
64
|
+
|
65
|
+
def check_training(command)
|
66
|
+
parser = Command::Parser.new('TR', round_type: @round_type).restrict_cmp_op_to(:<=).enable_dollar.disable_modifier
|
67
|
+
parsed = parser.parse(command)
|
68
|
+
return nil if parsed.nil?
|
69
|
+
|
70
|
+
count = parsed.dollar
|
71
|
+
return nil if count.nil?
|
72
|
+
|
73
|
+
target = parsed.target_number
|
74
|
+
|
75
|
+
dice = @randomizer.roll_once(100)
|
76
|
+
|
77
|
+
dig10 = dice / 10
|
78
|
+
dig1 = dice % 10
|
79
|
+
if dig10 == 0
|
80
|
+
dig10 = 10
|
81
|
+
end
|
82
|
+
if dig1 == 0
|
83
|
+
dig1 = 10
|
84
|
+
end
|
85
|
+
achievement_value = dig10 + dig1
|
86
|
+
|
87
|
+
if dice > target
|
88
|
+
return Result.failure("(1D100<=#{target}) > #{dice} > 失敗(能力値減少:10 / ヘルス減少:#{achievement_value})")
|
89
|
+
end
|
90
|
+
|
91
|
+
return Result.success("(1D100<=#{target}) > #{dice} > 成功(能力値上昇:#{count * 5 + achievement_value} / ヘルス減少:#{achievement_value})")
|
92
|
+
end
|
93
|
+
|
94
|
+
register_prefix('SL', 'TR')
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -50,7 +50,7 @@ module BCDice
|
|
50
50
|
private
|
51
51
|
|
52
52
|
def get_judge_result(command)
|
53
|
-
return nil unless (m =
|
53
|
+
return nil unless (m = /^2D6<=(\d)$/i.match(command) || /^SN(\d*)$/i.match(command))
|
54
54
|
|
55
55
|
debug("====get_judge_result====")
|
56
56
|
|
@@ -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(
|
@@ -90,7 +90,7 @@ module BCDice
|
|
90
90
|
result = "(#{diceCount}D10\<\=#{target}) > #{diceText} > Hits:#{successCount}*#{damage} > #{totalDamage}ダメージ"
|
91
91
|
else
|
92
92
|
result = "(#{diceCount}D10\<\=#{target}) > #{diceText}"
|
93
|
-
if
|
93
|
+
if successCount > 0
|
94
94
|
result += " > 【成功】"
|
95
95
|
else
|
96
96
|
result += " > 【失敗】"
|
@@ -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
|