bcdice 3.0.0.pre.rc.1 → 3.0.0.pre.rc.2
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 +4 -0
- data/i18n/DetatokoSaga/ja_jp.yml +3 -2
- data/i18n/DetatokoSaga/ko_kr.yml +1 -0
- data/lib/bcdice.rb +2 -0
- data/lib/bcdice/arithmetic_evaluator.rb +2 -0
- data/lib/bcdice/common_command.rb +2 -0
- data/lib/bcdice/common_command/add_dice.rb +2 -0
- data/lib/bcdice/common_command/add_dice/randomizer.rb +2 -0
- data/lib/bcdice/common_command/barabara_dice.rb +2 -0
- data/lib/bcdice/common_command/barabara_dice/node.rb +2 -0
- data/lib/bcdice/common_command/calc.rb +2 -0
- data/lib/bcdice/common_command/d66_dice.rb +2 -0
- data/lib/bcdice/common_command/upper_dice.rb +2 -0
- data/lib/bcdice/common_command/version.rb +2 -0
- data/lib/bcdice/dice_table.rb +2 -0
- data/lib/bcdice/dice_table/chain_table.rb +2 -0
- data/lib/bcdice/dice_table/d66_grid_table.rb +2 -0
- data/lib/bcdice/dice_table/d66_parity_table.rb +2 -0
- data/lib/bcdice/dice_table/d66_range_table.rb +2 -0
- data/lib/bcdice/dice_table/d66_table.rb +2 -0
- data/lib/bcdice/dice_table/roll_result.rb +2 -0
- data/lib/bcdice/dice_table/table.rb +2 -0
- data/lib/bcdice/enum.rb +2 -0
- data/lib/bcdice/format.rb +2 -0
- data/lib/bcdice/game_system.rb +6 -0
- data/lib/bcdice/game_system/AlchemiaStruggle.rb +58 -24
- data/lib/bcdice/game_system/BBN.rb +6 -4
- data/lib/bcdice/game_system/BlindMythos.rb +0 -1
- data/lib/bcdice/game_system/CodeLayerd.rb +33 -65
- data/lib/bcdice/game_system/DesperateRun.rb +163 -0
- data/lib/bcdice/game_system/DetatokoSaga.rb +25 -7
- data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +3 -3
- data/lib/bcdice/game_system/DiceBot.rb +22 -4
- data/lib/bcdice/game_system/InfiniteBabeL.rb +518 -0
- data/lib/bcdice/game_system/JekyllAndHyde.rb +42 -0
- data/lib/bcdice/game_system/Peekaboo.rb +1 -1
- data/lib/bcdice/game_system/RecordOfLodossWar.rb +6 -4
- data/lib/bcdice/game_system/RyuTuber.rb +6 -4
- data/lib/bcdice/game_system/Satasupe.rb +0 -2
- data/lib/bcdice/game_system/ShoujoTenrankai.rb +1 -1
- data/lib/bcdice/game_system/SteamPunkers.rb +6 -4
- data/lib/bcdice/game_system/Yggdrasill.rb +605 -0
- data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +2 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +2 -0
- data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +2 -0
- data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +2 -0
- data/lib/bcdice/game_system/one_way_heroics/tables.rb +2 -0
- data/lib/bcdice/loader.rb +11 -4
- data/lib/bcdice/normalize.rb +2 -0
- data/lib/bcdice/randomizer.rb +2 -0
- data/lib/bcdice/repl.rb +2 -0
- data/lib/bcdice/result.rb +2 -0
- data/lib/bcdice/translate.rb +2 -0
- data/lib/bcdice/user_defined_dice_table.rb +2 -0
- data/lib/bcdice/version.rb +3 -1
- metadata +6 -2
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bcdice/game_system/DesperateRun"
|
4
|
+
|
5
|
+
module BCDice
|
6
|
+
module GameSystem
|
7
|
+
class JekyllAndHyde < DesperateRun
|
8
|
+
# ゲームシステムの識別子
|
9
|
+
ID = "JekyllAndHyde"
|
10
|
+
|
11
|
+
# ゲームシステム名
|
12
|
+
NAME = "ジキルとハイドとグリトグラ"
|
13
|
+
|
14
|
+
# ゲームシステム名の読みがな
|
15
|
+
SORT_KEY = "しきるとはいととくりとくら"
|
16
|
+
|
17
|
+
# ダイスボットの使い方
|
18
|
+
HELP_MESSAGE = <<~HELP
|
19
|
+
・難易度算出コマンド DDC
|
20
|
+
・判定コマンド RCx or RCx+y or RCx-y(x=難易度、y=修正値(省略可能))
|
21
|
+
・目標決定表 GOALT
|
22
|
+
HELP
|
23
|
+
|
24
|
+
TABLES = {
|
25
|
+
"GOALT" => DiceTable::Table.new(
|
26
|
+
"目標決定表",
|
27
|
+
"1D6",
|
28
|
+
[
|
29
|
+
"「主人格の目的達成」",
|
30
|
+
"「主人格の目的阻害」",
|
31
|
+
"「主人格のハッピーエンド(目的達成しなくてもよい)」",
|
32
|
+
"「主人格のバッドエンド(目的達成していてもよい)」",
|
33
|
+
"「自分の人格が目的を決定できる」",
|
34
|
+
"「主人格の目的達成」「主人格の目的阻害」「主人格のハッピーエンド(目的達成しなくてもよい)」「主人格のバッドエンド(目的達成していてもよい)」「自分の人格が目的を決定できる」のどれかを自由に選べる"
|
35
|
+
]
|
36
|
+
)
|
37
|
+
}.freeze
|
38
|
+
|
39
|
+
register_prefix('RC\d+', 'DDC', TABLES.keys)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -175,7 +175,7 @@ module BCDice
|
|
175
175
|
"2D6",
|
176
176
|
[
|
177
177
|
"オバケ狩りに遭遇してしまいますオバケ判定を行ってください。失敗すると2d6点のダメージを受けます。",
|
178
|
-
"
|
178
|
+
"リングの上司からレポートを提出しろといわれます。セッション終了に、今回の冒険がどんな話だったかをまとめ、GMに報告してください。GMが、その報告がうまくまとまっていると感じたら、そのスプーキーとイノセントのコンビがもらえる経験点が1点上昇します。",
|
179
179
|
"近所のお家に忍び込み、めぼしいものを探しました。オバケ判定を行ってください。成功すると、ルールブック228頁に書いてあるアイテム表を使ってランダムで決めたアイテム1個を入手します。",
|
180
180
|
"街の優しいおばけたちに頼まれます。そのシナリオに登場するはぐれオバケを説得し、悪事をやめさせることができれば、そのスプーキーとイノセントのコンビがもらえる経験点が1点上昇します。",
|
181
181
|
"オバケたちとギャンブルに興じます♪好きなだけ【魔力】を減少してください。サイコロを1個振ります。奇数が出たらギャンブルに勝利!減少した【魔力】の2倍の値だけ魔力が回復します。偶数が出たらギャンブルに敗北(しょぼん)。減少した魔力はかえってきません。",
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module BCDice
|
2
4
|
module GameSystem
|
3
5
|
class RecordOfLodossWar < Base
|
4
|
-
ID = 'RecordOfLodossWar'
|
5
|
-
NAME = 'ロードス島戦記RPG'
|
6
|
-
SORT_KEY = 'ろおとすとうせんきRPG'
|
6
|
+
ID = 'RecordOfLodossWar'
|
7
|
+
NAME = 'ロードス島戦記RPG'
|
8
|
+
SORT_KEY = 'ろおとすとうせんきRPG'
|
7
9
|
|
8
|
-
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
10
|
+
HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
|
9
11
|
●判定
|
10
12
|
LW<=(目標値)で判定。
|
11
13
|
達成値が目標値の1/10(端数切り上げ)以下であれば大成功。1~10であれば自動成功。
|
@@ -1,18 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "bcdice/dice_table/table"
|
2
4
|
|
3
5
|
module BCDice
|
4
6
|
module GameSystem
|
5
7
|
class RyuTuber < Base
|
6
8
|
# ゲームシステムの識別子
|
7
|
-
ID = 'RyuTuber'
|
9
|
+
ID = 'RyuTuber'
|
8
10
|
|
9
11
|
# ゲームシステム名
|
10
|
-
NAME = 'リューチューバーとちいさな奇跡'
|
12
|
+
NAME = 'リューチューバーとちいさな奇跡'
|
11
13
|
|
12
14
|
# ゲームシステム名の読みがな
|
13
|
-
SORT_KEY = 'りゆうちゆうはあとちいさなきせき'
|
15
|
+
SORT_KEY = 'りゆうちゆうはあとちいさなきせき'
|
14
16
|
|
15
|
-
HELP_MESSAGE = <<~MESSAGETEXT
|
17
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
16
18
|
◆判定
|
17
19
|
・判定 nB6<=1
|
18
20
|
※ n:サイコロの数 例)12B6<=1 サイコロの数12個の場合
|
@@ -131,7 +131,6 @@ module BCDice
|
|
131
131
|
isCriticalStop = false
|
132
132
|
|
133
133
|
# params => "[x,y,cS]"
|
134
|
-
# frozen_string_literal: true
|
135
134
|
# ゲームシステムの識別子
|
136
135
|
# ゲームシステム名
|
137
136
|
# ゲームシステム名の読みがな
|
@@ -166,7 +165,6 @@ module BCDice
|
|
166
165
|
debug('roll_times', roll_times)
|
167
166
|
|
168
167
|
debug('min_suc, total_suc', min_suc, total_suc)
|
169
|
-
# frozen_string_literal: true
|
170
168
|
# ゲームシステムの識別子
|
171
169
|
# ゲームシステム名
|
172
170
|
# ゲームシステム名の読みがな
|
@@ -36,7 +36,7 @@ module BCDice
|
|
36
36
|
register_prefix("SPRING", "SUMMER", "AUTUMN", "WINTER", "MORNING", "NOON", "AFTERNOON", "TWILIGHT", "NIGHT", "MIDNIGHT", "NORBLE", "MARCHEN", "COLONIAL", "SHELF", "LITTLE", "ELDER", "ATERIEL", "OPEN", "HAUNTED", "SIMPLE", "LARGE", "CORRIDOR", "STAIRS", "COSY", "TERRACE", "GARRET", "KITCHEN", "BATH", "REST", "CELLER", "LUMBER", "GARDEN", "WASTED", "RUIN", "SHORE")
|
37
37
|
|
38
38
|
def eval_game_system_specific_command(command)
|
39
|
-
info = EVENT_TABLES[command
|
39
|
+
info = self.class::EVENT_TABLES[command]
|
40
40
|
|
41
41
|
return nil if info.nil?
|
42
42
|
|
@@ -1,13 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'bcdice/dice_table/d66_range_table'
|
2
4
|
|
3
5
|
module BCDice
|
4
6
|
module GameSystem
|
5
7
|
class SteamPunkers < Base
|
6
|
-
ID = 'SteamPunkers'
|
7
|
-
NAME = 'スチームパンカーズ'
|
8
|
-
SORT_KEY = 'すちいむはんかあす'
|
8
|
+
ID = 'SteamPunkers'
|
9
|
+
NAME = 'スチームパンカーズ'
|
10
|
+
SORT_KEY = 'すちいむはんかあす'
|
9
11
|
|
10
|
-
HELP_MESSAGE = <<~MESSAGETEXT
|
12
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
11
13
|
・判定コマンド (SPn)
|
12
14
|
SP(判定ダイス数)>=(目標値)
|
13
15
|
SP4>=3のように入力し、5が出たらヒット数1,6が出たらヒット数2として成功数を数えます。
|
@@ -0,0 +1,605 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bcdice/base"
|
4
|
+
|
5
|
+
module BCDice
|
6
|
+
module GameSystem
|
7
|
+
class Yggdrasill < Base
|
8
|
+
ID = "Yggdrasill"
|
9
|
+
|
10
|
+
NAME = "鋼鉄のユグドラシル"
|
11
|
+
|
12
|
+
SORT_KEY = "こうてつのゆくとらしる"
|
13
|
+
|
14
|
+
HELP_MESSAGE = <<~HELP_MESSAGE
|
15
|
+
■ 行為判定 (CFx+nD6)
|
16
|
+
クリティカルとファンブルによるダイス追加を行う
|
17
|
+
先頭のcfを変更することで、動作が変更される
|
18
|
+
hcf: 達成値が半減
|
19
|
+
cfl: 付加効果【幸運】を付与
|
20
|
+
cfg: 付加効果【ギャンブル】を付与
|
21
|
+
cft: 【応急処置】判定 (tは末尾に記入してください)
|
22
|
+
例)
|
23
|
+
CF10+1D6, HCFL6+2D6, CFG11+1D6-2, cfgt10+1D6
|
24
|
+
|
25
|
+
■ 暴走ロール (RAx)
|
26
|
+
暴走率xの暴走ロールおよび臨界ロールを行う
|
27
|
+
例)
|
28
|
+
RA50, RA110, RA150
|
29
|
+
|
30
|
+
■ SOペナルティ表 (SOx)
|
31
|
+
スペック数がxオーバーした際のペナルティロールを行う
|
32
|
+
例)
|
33
|
+
SO1, SO5
|
34
|
+
|
35
|
+
■ 【応急処置】 (TREATx)
|
36
|
+
達成値xの【応急処置】による回復量を決定する
|
37
|
+
例)
|
38
|
+
TREAT1, TREAT18
|
39
|
+
|
40
|
+
■ その他の判定および表
|
41
|
+
down:気絶判定
|
42
|
+
cont:コンティニュー判定
|
43
|
+
risk:リスク判定
|
44
|
+
guki:偶奇判定
|
45
|
+
cond:コンディションロール
|
46
|
+
allr:オールレンジ発動ロール
|
47
|
+
pafe:パーフェクト発動ロール
|
48
|
+
stag:ステージ決定(電脳ロワイヤル用)
|
49
|
+
fatal1:後遺症
|
50
|
+
fatal2:因子変化ロール
|
51
|
+
mikuzi:浅草寺みくじ。1d100であなたの運勢を占います
|
52
|
+
HELP_MESSAGE
|
53
|
+
|
54
|
+
register_prefix(
|
55
|
+
'H?CF', 'RA', 'SO', 'DOWN', 'CO(NT)?',
|
56
|
+
'RISK', 'GUKI', 'COND', 'TREAT',
|
57
|
+
'ALLR', 'PAFE', 'FATAL', 'STAG', 'MIKUZI'
|
58
|
+
)
|
59
|
+
|
60
|
+
def eval_game_system_specific_command(command)
|
61
|
+
roll_tables(command, TABLES) ||
|
62
|
+
roll_cf(command) ||
|
63
|
+
roll_ra(command) ||
|
64
|
+
roll_treat(command) ||
|
65
|
+
roll_down(command) ||
|
66
|
+
roll_cond(command) ||
|
67
|
+
roll_guki(command) ||
|
68
|
+
roll_cont(command) ||
|
69
|
+
roll_allr(command) ||
|
70
|
+
roll_pafe(command)
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def roll_cf(command)
|
76
|
+
# マイナス補正にダイスロールを用いることはシステム上ありえないため、正規表現ではじく
|
77
|
+
m = /^(H)?CF([LG])?(T)?((?:[+-]*\d+|\+?\d+D\d+)(?:[+-]+\d+|\++\d+D\d+)*)$/.match(command)
|
78
|
+
return nil unless m
|
79
|
+
|
80
|
+
hoge = !m[1].nil?
|
81
|
+
lucky_state = m[2]
|
82
|
+
treat_flg = !m[3].nil?
|
83
|
+
|
84
|
+
expr = m[4]
|
85
|
+
|
86
|
+
node = CommonCommand::AddDice::Parser.parse(expr)
|
87
|
+
return nil unless node
|
88
|
+
|
89
|
+
add_dice_randomizer = CommonCommand::AddDice::Randomizer.new(@randomizer, self)
|
90
|
+
total = node.lhs.eval(self, add_dice_randomizer)
|
91
|
+
rand_values = @randomizer.rand_results.map(&:first)
|
92
|
+
|
93
|
+
n1 = count_fumble(rand_values, lucky_state)
|
94
|
+
n_max = count_critical(rand_values, lucky_state)
|
95
|
+
|
96
|
+
# ファンブルロール
|
97
|
+
fa_list = @randomizer.roll_barabara(n1, 6)
|
98
|
+
fa1 = fa_list.sum
|
99
|
+
fa2 = fa_list.join(",")
|
100
|
+
|
101
|
+
critical_rerolls = []
|
102
|
+
rerolls = n_max
|
103
|
+
while rerolls > 0
|
104
|
+
list = @randomizer.roll_barabara(rerolls, 6)
|
105
|
+
critical_rerolls.push(list)
|
106
|
+
|
107
|
+
rerolls = list.count(6)
|
108
|
+
end
|
109
|
+
# crの達成値を合計する・cr出目を見易く
|
110
|
+
cr1 = critical_rerolls.flatten.sum
|
111
|
+
cr2 = critical_rerolls.map { |x| "[#{x.join(',')}]" }.join()
|
112
|
+
|
113
|
+
# 修正値&一投目出目 -ファンブル +クリティカル
|
114
|
+
total_n = total - fa1 + cr1
|
115
|
+
total_n /= 2 if hoge == true
|
116
|
+
# 最終達成値
|
117
|
+
result = "計【 #{total_n} 】"
|
118
|
+
|
119
|
+
text = "(#{command}) > #{result} : #{node.lhs.output}"
|
120
|
+
# クリファン有無に応じて表示の追加
|
121
|
+
text += " (fa:#{n1})-#{fa1}[#{fa2}]" if n1 > 0
|
122
|
+
text += " (cr:#{n_max})+#{cr1}#{cr2} (cr:計#{critical_rerolls.flatten.size}回)" if cr1 > 0
|
123
|
+
|
124
|
+
if treat_flg == true
|
125
|
+
# TREAT追加処理
|
126
|
+
heal = eval_game_system_specific_command("TREAT#{total_n}")
|
127
|
+
text += "\n > #{heal}"
|
128
|
+
end
|
129
|
+
|
130
|
+
return text
|
131
|
+
end
|
132
|
+
|
133
|
+
def count_critical(dice_list, lucky_state)
|
134
|
+
threshold =
|
135
|
+
if lucky_state == "G"
|
136
|
+
4
|
137
|
+
elsif lucky_state
|
138
|
+
5
|
139
|
+
else
|
140
|
+
6
|
141
|
+
end
|
142
|
+
|
143
|
+
dice_list.count { |x| x >= threshold }
|
144
|
+
end
|
145
|
+
|
146
|
+
def count_fumble(dice_list, lucky_state)
|
147
|
+
threshold =
|
148
|
+
if lucky_state == "G"
|
149
|
+
3
|
150
|
+
elsif lucky_state
|
151
|
+
2
|
152
|
+
else
|
153
|
+
1
|
154
|
+
end
|
155
|
+
|
156
|
+
dice_list.count { |x| x <= threshold }
|
157
|
+
end
|
158
|
+
|
159
|
+
def roll_ra(command)
|
160
|
+
m = /^RA(\d+)?$/.match(command)
|
161
|
+
return nil unless m
|
162
|
+
|
163
|
+
body =
|
164
|
+
case m[1]&.to_i
|
165
|
+
when 50
|
166
|
+
RA50.roll(@randomizer)
|
167
|
+
when 70
|
168
|
+
RA70.roll(@randomizer)
|
169
|
+
when 90
|
170
|
+
RA90.roll(@randomizer)
|
171
|
+
when 110, 120, 130, 140
|
172
|
+
RA110.roll(@randomizer)
|
173
|
+
when 150
|
174
|
+
"> 因子崩壊【キャラロスト】"
|
175
|
+
when nil
|
176
|
+
"> このコマンドは数値を付けてください"
|
177
|
+
else
|
178
|
+
"> 指定の暴走率の暴走ロールはありません"
|
179
|
+
end
|
180
|
+
|
181
|
+
"(#{command}) #{body}"
|
182
|
+
end
|
183
|
+
|
184
|
+
def roll_treat(command)
|
185
|
+
m = /^TREAT(-?\d+)?$/.match(command)
|
186
|
+
return nil unless m
|
187
|
+
|
188
|
+
unless m[1]
|
189
|
+
return "AE【応急処置】 > このコマンドは数値を付けてください"
|
190
|
+
end
|
191
|
+
|
192
|
+
value = m[1]&.to_i
|
193
|
+
|
194
|
+
recovery =
|
195
|
+
if value <= 5
|
196
|
+
0
|
197
|
+
elsif value <= 7
|
198
|
+
1
|
199
|
+
elsif value <= 11
|
200
|
+
dice = @randomizer.roll_once(6)
|
201
|
+
total = dice / 2
|
202
|
+
"#{total}(#{dice}[#{dice}]/2)"
|
203
|
+
elsif value <= 14
|
204
|
+
dice = @randomizer.roll_once(6)
|
205
|
+
"#{dice}(#{dice}[#{dice}])"
|
206
|
+
elsif value <= 17
|
207
|
+
dice = @randomizer.roll_once(6)
|
208
|
+
total = dice + 3
|
209
|
+
"#{total}(#{dice}[#{dice}]+3)"
|
210
|
+
else
|
211
|
+
list = @randomizer.roll_barabara(2, 6)
|
212
|
+
dice = list.sum()
|
213
|
+
total = dice + 2
|
214
|
+
"#{total}(#{dice}[#{list.join(',')}]+2)"
|
215
|
+
end
|
216
|
+
|
217
|
+
"AE【応急処置】 > HPが#{recovery}回復"
|
218
|
+
end
|
219
|
+
|
220
|
+
def roll_down(command)
|
221
|
+
return nil unless command == 'DOWN'
|
222
|
+
|
223
|
+
dice = @randomizer.roll_once(6)
|
224
|
+
|
225
|
+
result =
|
226
|
+
if dice.even?
|
227
|
+
"回避"
|
228
|
+
else
|
229
|
+
fell = @randomizer.roll_once(6)
|
230
|
+
"気絶【#{fell}R行動不能】"
|
231
|
+
end
|
232
|
+
|
233
|
+
"気絶判定 > #{dice} > #{result}"
|
234
|
+
end
|
235
|
+
|
236
|
+
def roll_cond(command)
|
237
|
+
return nil unless command == 'COND'
|
238
|
+
|
239
|
+
hp_list = @randomizer.roll_barabara(2, 6)
|
240
|
+
hp_total = hp_list.sum
|
241
|
+
hp_str = hp_list.join(",")
|
242
|
+
|
243
|
+
pp_list = @randomizer.roll_barabara(2, 6)
|
244
|
+
pp_total = pp_list.sum
|
245
|
+
pp_str = pp_list.join(",")
|
246
|
+
|
247
|
+
return "(#{command}) > HP#{hp_total}[#{hp_str}] 、 PP#{pp_total}[#{pp_str}]"
|
248
|
+
end
|
249
|
+
|
250
|
+
def roll_guki(command)
|
251
|
+
return nil unless command == 'GUKI'
|
252
|
+
|
253
|
+
dice = @randomizer.roll_once(6)
|
254
|
+
result = dice.even? ? "成功" : "失敗"
|
255
|
+
|
256
|
+
"(GUKI) > #{dice} > #{result}"
|
257
|
+
end
|
258
|
+
|
259
|
+
def roll_cont(command)
|
260
|
+
return nil unless /CO(NT)?/.match?(command)
|
261
|
+
|
262
|
+
dice = @randomizer.roll_once(6)
|
263
|
+
text = dice <= 4 ? "1R追加" : "2R追加"
|
264
|
+
|
265
|
+
"コンティニュー判定 > #{dice} > #{text}"
|
266
|
+
end
|
267
|
+
|
268
|
+
def roll_allr(command)
|
269
|
+
return nil unless command == 'ALLR'
|
270
|
+
|
271
|
+
dice = @randomizer.roll_once(6)
|
272
|
+
text =
|
273
|
+
if dice == 1
|
274
|
+
"発動失敗【技対象が敵味方含めた全員となる】"
|
275
|
+
else
|
276
|
+
"発動成功"
|
277
|
+
end
|
278
|
+
|
279
|
+
"オールレンジ判定 > #{dice} > #{text}"
|
280
|
+
end
|
281
|
+
|
282
|
+
def roll_pafe(command)
|
283
|
+
return nil unless command == "PAFE"
|
284
|
+
|
285
|
+
dice = @randomizer.roll_once(6)
|
286
|
+
text =
|
287
|
+
if dice == 1
|
288
|
+
"発動失敗【通常命中・回避判定となり、発動時のアクション内の命中力&回避力が半減する】"
|
289
|
+
else
|
290
|
+
"発動成功"
|
291
|
+
end
|
292
|
+
|
293
|
+
"発動ロール > #{dice} > #{text}"
|
294
|
+
end
|
295
|
+
|
296
|
+
class YggTable < DiceTable::Table
|
297
|
+
def initialize(name, type, items, additonal_type:, additonal_format:, additonal_index:, out_of_control: nil)
|
298
|
+
super(name, type, items)
|
299
|
+
|
300
|
+
m = /(\d+)D(\d+)/i.match(additonal_type)
|
301
|
+
unless m
|
302
|
+
raise ArgumentError, "Unexpected table type: #{additonal_type}"
|
303
|
+
end
|
304
|
+
|
305
|
+
@additonal_times = m[1].to_i
|
306
|
+
@additonal_sides = m[2].to_i
|
307
|
+
@format = additonal_format
|
308
|
+
@index = additonal_index
|
309
|
+
@out_of_control = out_of_control
|
310
|
+
end
|
311
|
+
|
312
|
+
def roll(randomizer)
|
313
|
+
value = randomizer.roll_sum(@times, @sides)
|
314
|
+
chosen = choice(value)
|
315
|
+
|
316
|
+
return chosen unless @index.include?(value) || @out_of_control == value
|
317
|
+
|
318
|
+
body =
|
319
|
+
if @out_of_control == value
|
320
|
+
"#{chosen.body} : #{RA90.roll(randomizer)}"
|
321
|
+
else
|
322
|
+
list = randomizer.roll_barabara(@additonal_times, @additonal_sides)
|
323
|
+
chosen.body + format(@format, total: list.sum(), list: list.join(","))
|
324
|
+
end
|
325
|
+
|
326
|
+
DiceTable::RollResult.new(chosen.table_name, chosen.value, body)
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
class ChainTable < DiceTable::Table
|
331
|
+
def initialize(name, type, items, additonal_table:, additonal_index:)
|
332
|
+
super(name, type, items)
|
333
|
+
|
334
|
+
@additonal_table = additonal_table
|
335
|
+
@index = additonal_index
|
336
|
+
end
|
337
|
+
|
338
|
+
def roll(randomizer)
|
339
|
+
value = randomizer.roll_sum(@times, @sides)
|
340
|
+
chosen = choice(value)
|
341
|
+
|
342
|
+
return chosen unless @index.include?(value)
|
343
|
+
|
344
|
+
body = "#{chosen.body} > #{@additonal_table.roll(randomizer)}"
|
345
|
+
DiceTable::RollResult.new(chosen.table_name, chosen.value, body)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
PSY_TABLE = DiceTable::Table.new(
|
350
|
+
"能力タイプ",
|
351
|
+
"1D6",
|
352
|
+
[
|
353
|
+
'サイキッカー',
|
354
|
+
'エスパー',
|
355
|
+
'トランサー',
|
356
|
+
'クリエイター',
|
357
|
+
'アンノウン',
|
358
|
+
'好きな能力タイプを選択。ノーマル選択でも可'
|
359
|
+
]
|
360
|
+
)
|
361
|
+
|
362
|
+
RA50 = YggTable.new(
|
363
|
+
"暴走Lv.1",
|
364
|
+
"1D6",
|
365
|
+
[
|
366
|
+
'発作【自爆÷2ダメージ。(自身に能力攻撃ロールダメージ÷2)。防御無視】',
|
367
|
+
'高揚【1D6暴走率上昇】',
|
368
|
+
'高揚【1D6暴走率上昇】',
|
369
|
+
'自制【暴走なし】',
|
370
|
+
'自制【暴走なし】',
|
371
|
+
'自制【暴走なし】',
|
372
|
+
],
|
373
|
+
additonal_type: "1D6",
|
374
|
+
additonal_format: " : %{total}[%{list}] %",
|
375
|
+
additonal_index: [2, 3]
|
376
|
+
)
|
377
|
+
|
378
|
+
RA70 = YggTable.new(
|
379
|
+
"暴走Lv.3",
|
380
|
+
"1D6",
|
381
|
+
[
|
382
|
+
'自爆【自爆ダメージ。自身に能力攻撃ロールダメージ。防御無視】',
|
383
|
+
'自爆【自爆ダメージ。自身に能力攻撃ロールダメージ。防御無視】',
|
384
|
+
'暴発【ランダム攻撃。基本的に能力攻撃。対象は自分、キャラ、オブジェクトの三種類】',
|
385
|
+
'連鎖【2D6暴走率上昇】',
|
386
|
+
'発症',
|
387
|
+
'自制【暴走無し】'
|
388
|
+
],
|
389
|
+
additonal_type: "2D6",
|
390
|
+
additonal_format: " : %{total}[%{list}] %",
|
391
|
+
additonal_index: [4],
|
392
|
+
out_of_control: 5
|
393
|
+
)
|
394
|
+
|
395
|
+
RA90 = DiceTable::D66ParityTable.new(
|
396
|
+
"暴走状態表",
|
397
|
+
[
|
398
|
+
'能力異常【能力使用時に偶奇判定。奇数の場合は消費だけ行い能力発動失敗。暴走チェックごとに+2%される(発症時も発生)。能力精度の判定結果が半減】',
|
399
|
+
'言語異常【AE使用時に偶奇判定。奇数の場合は消費だけ行いAE発動失敗。話術の判定結果が半減】',
|
400
|
+
'記憶異常【命中判定結果が半減する。知識の判定結果が半減】',
|
401
|
+
'精神異常【自分のリアクション(回避判定など)で偶奇判定。奇数の場合は行動自動失敗。隠密、読心の判定結果が半減】',
|
402
|
+
'忘我【自プリアクション時に偶奇判定。奇数の場合は宣言せずにターン終了。あらゆる技能判定結果が半減】',
|
403
|
+
'自制【暴走無し】'
|
404
|
+
],
|
405
|
+
[
|
406
|
+
'制御異常【自プリアクション毎(行動決定前)に偶奇判定。奇数の場合は暴発によるランダム攻撃。(発症時も発生)。技術、幸運の判定結果が半減】',
|
407
|
+
'過負荷【ワンアクション毎に能力精度÷3の防御無視ダメージ(発症時も発生)。閃きの判定結果が半減】',
|
408
|
+
'聴覚異常【回避判定結果が半減する。察知の半減結果が半減】',
|
409
|
+
'視覚異常【SS&命中力&回避力が半減する※判定結果は半減しない。観察眼の判定結果が半減】',
|
410
|
+
'身体異常【防御を差し引く前のダメージロールが半減する。力技、俊敏の判定結果が半減】',
|
411
|
+
'自制【暴走なし】'
|
412
|
+
]
|
413
|
+
)
|
414
|
+
|
415
|
+
RA110 = YggTable.new(
|
416
|
+
"臨界ロール",
|
417
|
+
"1D6",
|
418
|
+
[
|
419
|
+
'自壊【自爆ダメージ。自身の最も高い攻撃ロールダメージ。防御無視】',
|
420
|
+
'超活性【HP・PPを2D6回復】',
|
421
|
+
'自壊【自爆ダメージ。自身の最も高い攻撃ロールダメージ。防御無視】',
|
422
|
+
'超活性【HP・PPを2D6回復】',
|
423
|
+
'自壊【自爆ダメージ。自身の最も高い攻撃ロールダメージ。防御無視】',
|
424
|
+
'超活性【HP・PPを2D6回復】'
|
425
|
+
],
|
426
|
+
additonal_type: "2D6",
|
427
|
+
additonal_format: " : %{total}[%{list}] 回復",
|
428
|
+
additonal_index: [2, 4, 6]
|
429
|
+
)
|
430
|
+
|
431
|
+
TABLES = {
|
432
|
+
"MIKUZI" => DiceTable::RangeTable.new(
|
433
|
+
"おみくじ",
|
434
|
+
"1D100",
|
435
|
+
[
|
436
|
+
[1..17, "大吉"],
|
437
|
+
[18..52, "吉"],
|
438
|
+
[53..57, "半吉"],
|
439
|
+
[58..61, "小吉"],
|
440
|
+
[62..64, "末小吉"],
|
441
|
+
[65..70, "末吉"],
|
442
|
+
[71..100, "凶"],
|
443
|
+
]
|
444
|
+
),
|
445
|
+
"SO1" => YggTable.new(
|
446
|
+
"SOペナルティ表 1オーバー",
|
447
|
+
"1D6",
|
448
|
+
[
|
449
|
+
'消費負荷【PP2倍消費 ※AE消費は含まない】',
|
450
|
+
'消費負荷【PP2倍消費 ※AE消費は含まない】',
|
451
|
+
'消費負荷【PP2倍消費 ※AE消費は含まない】',
|
452
|
+
'反動',
|
453
|
+
'反動',
|
454
|
+
'制御成功【発動成功 ペナルティ無し】'
|
455
|
+
],
|
456
|
+
additonal_type: "1D6",
|
457
|
+
additonal_format: "【命中&回避-1D6(%{total}[%{list}]) 1ラウンド継続】",
|
458
|
+
additonal_index: [4, 5]
|
459
|
+
),
|
460
|
+
"SO2" => YggTable.new(
|
461
|
+
"SOペナルティ表 2オーバー",
|
462
|
+
"1D6",
|
463
|
+
[
|
464
|
+
'自爆【自分へ能力攻撃ダメージ ※防御無視】',
|
465
|
+
'消費負荷【PP2倍消費 ※AE消費は含まない】',
|
466
|
+
'消費負荷【PP2倍消費 ※AE消費は含まない】',
|
467
|
+
'反動',
|
468
|
+
'反動',
|
469
|
+
'制御成功【発動成功 ペナルティ無し】'
|
470
|
+
],
|
471
|
+
additonal_type: "1D6",
|
472
|
+
additonal_format: "【命中&回避-1D6(%{total}[%{list}]) 1ラウンド継続】",
|
473
|
+
additonal_index: [4, 5]
|
474
|
+
),
|
475
|
+
"SO3" => YggTable.new(
|
476
|
+
"SOペナルティ表 3オーバー",
|
477
|
+
"1D6",
|
478
|
+
[
|
479
|
+
'自爆【自分へ能力攻撃ダメージ ※防御無視】',
|
480
|
+
'自爆【自分へ能力攻撃ダメージ ※防御無視】',
|
481
|
+
'消費負荷【PP2倍消費 ※AE消費は含まない】',
|
482
|
+
'過反動',
|
483
|
+
'過反動',
|
484
|
+
'制御成功【発動成功 ペナルティ無し】'
|
485
|
+
],
|
486
|
+
additonal_type: "2D6",
|
487
|
+
additonal_format: "【命中&回避-2D6(%{total}[%{list}]) 1ラウンド継続】",
|
488
|
+
additonal_index: [4, 5]
|
489
|
+
),
|
490
|
+
"SO4" => YggTable.new(
|
491
|
+
"SOペナルティ表 4オーバー",
|
492
|
+
"1D6",
|
493
|
+
[
|
494
|
+
'崩壊【自爆ダメージ×2 ※防御無視】',
|
495
|
+
'崩壊【自爆ダメージ×2 ※防御無視】',
|
496
|
+
'超負荷【PP3倍消費 ※AE消費は含まない】',
|
497
|
+
'過反動',
|
498
|
+
'過反動',
|
499
|
+
'制御成功【発動成功 ペナルティ無し】',
|
500
|
+
],
|
501
|
+
additonal_type: "2D6",
|
502
|
+
additonal_format: "【命中&回避-2D6(%{total}[%{list}]) 1ラウンド継続】",
|
503
|
+
additonal_index: [4, 5]
|
504
|
+
),
|
505
|
+
"SO5" => DiceTable::Table.new(
|
506
|
+
"SOペナルティ表 5オーバー",
|
507
|
+
"1D6",
|
508
|
+
[
|
509
|
+
'崩壊【自爆ダメージ×2 ※防御無視】',
|
510
|
+
'崩壊【自爆ダメージ×2 ※防御無視】',
|
511
|
+
'崩壊【自爆ダメージ×2 ※防御無視】',
|
512
|
+
'超負荷【PP3倍消費 ※AE消費は含まない】',
|
513
|
+
'超負荷【PP3倍消費 ※AE消費は含まない】',
|
514
|
+
'制御成功【発動成功 ペナルティ無し】'
|
515
|
+
]
|
516
|
+
),
|
517
|
+
"RISK" => DiceTable::Table.new(
|
518
|
+
"リスク判定",
|
519
|
+
"1D6",
|
520
|
+
[
|
521
|
+
'能力自爆【能力は発動せず、PPを2倍消費する。併用AEのPPは含まない。それに加え【自爆】する。能力攻撃力分を自身へ防御無視ダメージ】',
|
522
|
+
'能力不発【能力は発動せず、PPを2倍消費する。併用AEのPPは含まない】',
|
523
|
+
'効果不発【リスクの効果はゼロで能力発動】',
|
524
|
+
'通常発動【(能力精度÷3)+1D6を加える】',
|
525
|
+
'活性発動【(能力精度÷3)+2D6を加える】',
|
526
|
+
'覚醒発動【(能力精度÷3)+3D6を加える】'
|
527
|
+
]
|
528
|
+
),
|
529
|
+
"FATAL1" => DiceTable::Table.new(
|
530
|
+
"後遺症判定",
|
531
|
+
"1D6",
|
532
|
+
[
|
533
|
+
'聴覚崩壊【聴覚に異常が起きる。幻聴、難聴、失聴、など】',
|
534
|
+
'視覚崩壊【視覚に異常が起こる。幻覚、色盲、失明、など】',
|
535
|
+
'言語崩壊【言語の認識に異常が起きる。しゃべる事に支障をきたす。吃音、失語症、失読症、など】',
|
536
|
+
'身体崩壊【身体に異常が起こる。欠損、異形化、麻痺、など】',
|
537
|
+
'精神崩壊【精神に異常が起こる。人格破綻、性格変化、妄想・幻覚による異常行動、など】',
|
538
|
+
'記憶崩壊【記憶に異常が起こる。記憶障害、記憶喪失、など】'
|
539
|
+
]
|
540
|
+
),
|
541
|
+
"FATAL2" => ChainTable.new(
|
542
|
+
"因子変化判定",
|
543
|
+
"1D6",
|
544
|
+
[
|
545
|
+
'能力変化【能力がまったく別ものに変化する】',
|
546
|
+
'能力変化【能力がまったく別ものに変化する】',
|
547
|
+
'因子抑制【能力変化は起こらない】',
|
548
|
+
'因子抑制【能力変化は起こらない】',
|
549
|
+
'能力喪失・能力覚醒【能力を持つものは失い、ノーマルは能力に覚醒する。喪失者はノーマルのキャラ特性ポイントを1p獲得する。覚醒者はノーマルのキャラ特性ポイントを1p失い、キャラ特性を6つ取得していた場合は1つ喪失する】',
|
550
|
+
'能力喪失・能力覚醒【能力を持つものは失い、ノーマルは能力に覚醒する。喪失者はノーマルのキャラ特性ポイントを1p獲得する。覚醒者はノーマルのキャラ特性ポイントを1p失い、キャラ特性を6つ取得していた場合は1つ喪失する】',
|
551
|
+
],
|
552
|
+
additonal_table: PSY_TABLE,
|
553
|
+
additonal_index: [1, 2, 5, 6]
|
554
|
+
),
|
555
|
+
"STAG" => DiceTable::D66Table.new(
|
556
|
+
"ステージ決定",
|
557
|
+
D66SortType::NO_SORT,
|
558
|
+
{
|
559
|
+
11 => 'ロシアンルーレット【幸運にて判定。参加者は銃をこめかみにあて、1発の銃弾をひかないように祈る。 敗者は3D6ダメージ】',
|
560
|
+
12 => 'チキンレース【察知にて判定。に向ってバイクでダッシュだ。敗者は2D6ダメージ。落ちても大丈夫です、電脳だから】',
|
561
|
+
13 => '取り立て【力技or威圧にて判定。あのモヒカン借金払わないんですよ。よろしくお願いしますね。電脳を通しての実際の取り立てらしい】',
|
562
|
+
14 => '舌戦【威圧or話術にて判定。参加者同士で舌戦で勝者を決めろ!敗者は心に2D6ダメージ】',
|
563
|
+
15 => 'ギャンブル【読心or幸運にて判定。ポーカー、ルーレット、麻雀、好きなものを選べ。勝利の鍵は運か、それとも人の心か】',
|
564
|
+
16 => 'トラップ【SSにて判定。君達の目の前に広がるのはそう、地雷原だ。敗者は3D6ダメージ】',
|
565
|
+
|
566
|
+
21 => 'サバゲー【隠密or俊敏にて判定。軍人となって、相手を屠れ!敗者は死ぬ。敗者は2D6ダメージ】',
|
567
|
+
22 => '追跡【察知or隠密にて判定。ニンジャの姿となって下手人を追え!コアな人気を誇るステージ。ニンジャ人気すごい】',
|
568
|
+
23 => '推理【閃きにて判定。あなたたちは探偵となり、事件を解決に導く。犯人は、お前だ!2時間放送になるのが玉に瑕】',
|
569
|
+
24 => '潜入【隠密にて判定。スパイとなり、機密情報を盗め!あれ、これ実際の企業の機密情報じゃ・・・?】',
|
570
|
+
25 => 'かくれんぼ【隠密or読心にて判定。あなたを追うのはホラーな化け物・・・。スリリングなかくれんぼをどうぞ堪能下さい】',
|
571
|
+
26 => '絶対絶命!【回避力にて判定。君達はマフィアにおびき出されたのだ。大勢の銃が君を狙う。敗者は3D6ダメージ】',
|
572
|
+
|
573
|
+
31 => 'クイズ【知識にて判定。己の知識を存分に披露しろ!負けたら奈落に落されます。敗者は1D6ダメージ】',
|
574
|
+
32 => '迷路【察知or幸運にて判定。巨大迷路をクリアしろ!あれ、なんでこんなところに骸骨が・・・】',
|
575
|
+
33 => 'パズル【知識or閃きにて判定。3Dの難解パズルを解き明かせ!!時折金庫破りのパスワードがターゲットになってたり】',
|
576
|
+
34 => '間違い探し【観察眼or閃きにて判定。大量の鍵から正しい鍵を。美女の中からオカマを。そんな間違いを見つけるのだ!】',
|
577
|
+
35 => '目利き【観察眼or知識にて判定。あなたの鑑定で値段を当てろ!はずれたらかっこ悪いです】',
|
578
|
+
36 => 'スナイパー【命中力にて判定。一撃必殺でターゲットを仕留めろ!なお、ターゲットはお互いだ。敗者は2D6ダメージ】',
|
579
|
+
|
580
|
+
41 => '腕相撲【力技にて判定。必要なのは、力のみ!!敗者は2D6ダメージ】',
|
581
|
+
42 => 'インディジョーンズ【俊敏にて判定。なぜか大岩が後ろから!逃げろー!敗者は3D6ダメージ】',
|
582
|
+
43 => 'PK【力技or察知にて判定。見極め、ゴールしろ!パワーで破ってもいい】',
|
583
|
+
44 => 'ダンス【技術or俊敏にて判定。己の舞を魅せろ!ジャンル問わず】',
|
584
|
+
45 => 'ボディコンテスト【威圧にて判定。魅せるのはマッスルか、それとも美しい肢体か!容姿ボーナスはつきません】',
|
585
|
+
46 => '突破しろ!【ダメージ量にて判定。立ちはだかる扉をぶち破れ!扉は防御10】',
|
586
|
+
|
587
|
+
51 => '早食い【力技or俊敏にて判定。くって!くって!!くいまくれ!!敗者は胃に2D6ダメージ】',
|
588
|
+
52 => 'ナンパ天国【話術or読心にて判定。電脳世界で老若男女を口説き落せ!相手はプログラムだったり電脳に入っているアバターだったり】',
|
589
|
+
53 => 'スリーサイズ【観察眼にて判定。魅惑のボディをなめまわせ!勝利者はある意味で尊敬され、ある意味で嫌われる】',
|
590
|
+
54 => 'ワサビ寿司【観察眼or幸運にて判定。高級寿司の中に、死ぬほどの刺激が・・・!敗者は2D6ダメージ】',
|
591
|
+
55 => 'じゃんけん【読心にて判定。じゃんけんとは運ではない、読み合いなのだ!】',
|
592
|
+
56 => '瓦割り【ダメージ量にて判定。どんな方法でもいい。とにかく枚数を割れ!!!ダメージ量の2倍くらいが割った枚数】',
|
593
|
+
|
594
|
+
61 => '料理対決【知識or技術にて判定。胃袋をつかめ!絶品料理対決!料理によってはR18G指定になる場合がある】',
|
595
|
+
62 => '歌合戦【威圧or技術にて判定。その歌唱力で心をつかめ!アイドルデビューも夢じゃない!電脳なのでお好きな衣装でどうぞ】',
|
596
|
+
63 => '漫才【話術or閃きにて判定。即興漫才で画面の向こうを爆笑の渦へ!相方が必要な方は漫才プログラムアバターをレンタル。有料】',
|
597
|
+
64 => '画伯【技術にて判定。テーマをもとに、あなたの画力を見せつけろ!時々下手うまな人が勝つことも】',
|
598
|
+
65 => 'プレゼンテーション【話術にて判定。本日の商品は、こちら!!実際に販売します。してもらいます】',
|
599
|
+
66 => '無双撃破!【ダメージ量にて判定。た、大量のモヒカンだぁ~!ダメージ量の2倍くらいが倒した数。敗者は2D6ダメージ。SE【オールレンジ】技は成功で判定+10】'
|
600
|
+
}
|
601
|
+
)
|
602
|
+
}.freeze
|
603
|
+
end
|
604
|
+
end
|
605
|
+
end
|