bcdice 3.4.0 → 3.5.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 +36 -0
- data/i18n/BeginningIdol/ja_jp.yml +2806 -0
- data/i18n/BeginningIdol/ko_kr.yml +1400 -0
- data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
- data/i18n/MagicaLogia/ja_jp.yml +1 -1
- data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
- data/lib/bcdice/common_command/choice.rb +5 -1
- data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
- data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
- data/lib/bcdice/common_command/tally_dice.rb +19 -0
- data/lib/bcdice/common_command.rb +2 -0
- data/lib/bcdice/dice_table/d66_table.rb +5 -1
- data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
- data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
- data/lib/bcdice/game_system/BadLife.rb +264 -289
- data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
- data/lib/bcdice/game_system/BeginningIdol.rb +116 -2390
- data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
- data/lib/bcdice/game_system/CastleInGray.rb +133 -0
- data/lib/bcdice/game_system/Cthulhu.rb +2 -2
- data/lib/bcdice/game_system/Cthulhu7th.rb +6 -6
- data/lib/bcdice/game_system/DoubleCross.rb +5 -0
- data/lib/bcdice/game_system/Emoklore.rb +1 -1
- data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
- data/lib/bcdice/game_system/Karukami.rb +84 -0
- data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
- data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
- data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
- data/lib/bcdice/game_system/SwordWorld.rb +6 -2
- data/lib/bcdice/game_system/SwordWorld2_0.rb +20 -5
- data/lib/bcdice/game_system/SwordWorld2_5.rb +6 -0
- data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
- data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
- data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
- data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
- data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
- data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
- data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
- data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
- data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
- data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
- data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
- data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
- data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
- data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
- data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
- data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +46 -3
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +147 -106
- data/lib/bcdice/game_system.rb +8 -1
- data/lib/bcdice/version.rb +1 -1
- metadata +28 -3
@@ -56,6 +56,12 @@ module BCDice
|
|
56
56
|
・グレイテストフォーチュンは末尾に gf
|
57
57
|
例)K20gf K30+24@8GF K40+24@8$12r5gf
|
58
58
|
|
59
|
+
・威力表を1d+sfで参照 クリティカル後も継続 sf4
|
60
|
+
例)k10sf4 k0+5sf4@13 k70+26sf3@9
|
61
|
+
|
62
|
+
・威力表を1d+tfで参照 クリティカル後は2dで参照 tf3
|
63
|
+
例)k10tf3 k0+5tf4@13 k70+26tf3@9
|
64
|
+
|
59
65
|
・超越判定用に2d6ロールに 2D6@10 書式でクリティカル値付与が可能に。
|
60
66
|
例)2D6@10 2D6@10+11>=30
|
61
67
|
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class TalesFromTheLoop < Base
|
6
|
+
# ゲームシステムの識別子
|
7
|
+
ID = "TalesFromTheLoop"
|
8
|
+
|
9
|
+
# ゲームシステム名
|
10
|
+
NAME = "ザ・ループTRPG"
|
11
|
+
|
12
|
+
# ゲームシステム名の読みがな
|
13
|
+
SORT_KEY = "さるうふTRPG"
|
14
|
+
|
15
|
+
HELP_MESSAGE = <<~TEXT
|
16
|
+
■ 判定コマンド(nTFLx-x+x or nTFLx+x-x)
|
17
|
+
(必要成功数)TFL(判定ダイス数)+/-(修正ダイス数)
|
18
|
+
|
19
|
+
※ 必要成功数と修正ダイス数は省略可能
|
20
|
+
|
21
|
+
例1) 必要成功数1、判定ダイスは能力値3
|
22
|
+
1TFL3
|
23
|
+
|
24
|
+
例2)必要成功数不明、あるいはダイスボットの成功判定を使わない、判定ダイスは能力値3+技能1で4、アイテムの修正+1
|
25
|
+
TFL4+1
|
26
|
+
|
27
|
+
例3)必要成功数1、判定ダイスは能力値2+技能1で3、コンディションにチェックが2つ、アイテムの修正+1
|
28
|
+
1TFL3-2+1
|
29
|
+
あるいは以下のようにカッコ書きで内訳を詳細に記述することも可能。
|
30
|
+
1TFL(2+1)-(1+1)+1
|
31
|
+
修正ダイスのプラスとマイナスは逆でもよい。
|
32
|
+
1TFL(2+1)+1-(1+1)
|
33
|
+
TEXT
|
34
|
+
|
35
|
+
register_prefix('(\d+)?(TFL)')
|
36
|
+
|
37
|
+
def eval_game_system_specific_command(command)
|
38
|
+
parser = Command::Parser.new(/\d*TFL\d+/, round_type: round_type)
|
39
|
+
parsed = parser.parse(command)
|
40
|
+
return nil unless parsed
|
41
|
+
|
42
|
+
difficulty, dice_pool = parsed.command.split("TFL", 2).map(&:to_i)
|
43
|
+
dice_pool += parsed.modify_number
|
44
|
+
if dice_pool <= 0
|
45
|
+
dice_pool = 1
|
46
|
+
end
|
47
|
+
|
48
|
+
ability_dice_text, success_dice = make_dice_roll(dice_pool)
|
49
|
+
|
50
|
+
return make_dice_roll_text(difficulty, dice_pool, ability_dice_text, success_dice)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def make_dice_roll_text(difficulty, dice_pool, ability_dice_text, success_dice)
|
56
|
+
dice_count_text = "(#{dice_pool}D6) > #{ability_dice_text} 成功数:#{success_dice}"
|
57
|
+
push_dice = (dice_pool - success_dice)
|
58
|
+
|
59
|
+
if push_dice > 0
|
60
|
+
dice_count_text = "#{dice_count_text} 振り直し可能:#{push_dice}"
|
61
|
+
reroll_command = "\n振り直しコマンド: TFL#{push_dice}"
|
62
|
+
end
|
63
|
+
|
64
|
+
if difficulty > 0
|
65
|
+
if success_dice >= difficulty
|
66
|
+
return Result.success("#{dice_count_text} 成功!#{reroll_command}")
|
67
|
+
else
|
68
|
+
return Result.failure("#{dice_count_text} 失敗!#{reroll_command}")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
return "#{dice_count_text}#{reroll_command}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def make_dice_roll(dice_pool)
|
76
|
+
dice_list = @randomizer.roll_barabara(dice_pool, 6)
|
77
|
+
success_dice = dice_list.count(6)
|
78
|
+
|
79
|
+
return "[#{dice_list.join(',')}]", success_dice
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -19,15 +19,17 @@ module BCDice
|
|
19
19
|
|
20
20
|
・判定コマンド(nMYZx+x+x)
|
21
21
|
(難易度)MYZ(能力ダイス数)+(技能ダイス数)+(アイテムダイス数) # (1と6を数え、プッシュ可能数を表示)
|
22
|
+
(難易度)MYZ(能力ダイス数)-(技能ダイス数)+(アイテムダイス数) # (1と6を数え、プッシュ可能数を表示、技能のマイナス指定)
|
22
23
|
|
23
24
|
※ 難易度と技能、アイテムダイス数は省略可能
|
24
25
|
INFO_MESSAGE_TEXT
|
25
26
|
|
26
|
-
DIFFICULTY_INDEX =
|
27
|
-
COMMAND_TYPE_INDEX =
|
28
|
-
ABILITY_INDEX =
|
29
|
-
|
30
|
-
|
27
|
+
DIFFICULTY_INDEX = 1 # 難易度のインデックス
|
28
|
+
COMMAND_TYPE_INDEX = 2 # コマンドタイプのインデックス
|
29
|
+
ABILITY_INDEX = 3 # 能力値ダイスのインデックス
|
30
|
+
SKILL_SIGNED_INDEX = 5 # 技能値ダイス符号のインデックス
|
31
|
+
SKILL_INDEX = 6 # 技能値ダイスのインデックス
|
32
|
+
GEAR_INDEX = 8 # アイテムダイスのインデックス
|
31
33
|
|
32
34
|
register_prefix('(\d+)?(YZE|MYZ)')
|
33
35
|
|
@@ -42,7 +44,7 @@ module BCDice
|
|
42
44
|
end
|
43
45
|
|
44
46
|
def eval_game_system_specific_command(command)
|
45
|
-
m = /\A(\d+)?(YZE|MYZ)(\d+)(
|
47
|
+
m = /\A(\d+)?(YZE|MYZ)(\d+)((\+|-)(\d+))?(\+(\d+))?/.match(command)
|
46
48
|
unless m
|
47
49
|
return ''
|
48
50
|
end
|
@@ -70,18 +72,27 @@ module BCDice
|
|
70
72
|
dice_pool = m[SKILL_INDEX].to_i
|
71
73
|
skill_dice_text, success_dice, botch_dice = make_dice_roll(dice_pool)
|
72
74
|
|
73
|
-
|
75
|
+
skill_unsigned = m[SKILL_SIGNED_INDEX]
|
76
|
+
if command_type == 'YZE' && skill_unsigned == '-'
|
77
|
+
# YZEはシンプルに動作するコマンドなのでマイナス技能の処理は対応しない。
|
78
|
+
return "YZEコマンドでは技能ダイスをマイナス指定できません。"
|
79
|
+
elsif command_type == 'MYZ' && skill_unsigned == '-'
|
80
|
+
@total_success_dice -= success_dice # マイナス技能の成功は通常の成功と相殺される
|
81
|
+
else
|
82
|
+
@total_success_dice += success_dice
|
83
|
+
end
|
84
|
+
|
74
85
|
@total_botch_dice += botch_dice
|
75
|
-
@skill_botch_dice += botch_dice # 技能ダイスの1はpush
|
76
|
-
@push_dice += (dice_pool - success_dice) # 技能ダイスのみ1
|
86
|
+
@skill_botch_dice += botch_dice # 技能ダイスの1はpushで振り直し可能(例えマイナス技能でも)
|
87
|
+
@push_dice += (dice_pool - success_dice) # 技能ダイスのみ1を含むので、ここでは1を計算に入れない
|
77
88
|
|
78
|
-
dice_count_text += "
|
79
|
-
dice_text += "
|
89
|
+
dice_count_text += "#{skill_unsigned}(#{dice_pool}D6)"
|
90
|
+
dice_text += "#{skill_unsigned}#{skill_dice_text}"
|
80
91
|
end
|
81
92
|
|
82
|
-
if m[
|
83
|
-
dice_pool = m[
|
84
|
-
|
93
|
+
if m[GEAR_INDEX]
|
94
|
+
dice_pool = m[GEAR_INDEX].to_i
|
95
|
+
gear_dice_text, success_dice, botch_dice = make_dice_roll(dice_pool)
|
85
96
|
|
86
97
|
@total_success_dice += success_dice
|
87
98
|
@total_botch_dice += botch_dice
|
@@ -89,8 +100,9 @@ module BCDice
|
|
89
100
|
@push_dice += (dice_pool - (success_dice + botch_dice))
|
90
101
|
|
91
102
|
dice_count_text += "+(#{dice_pool}D6)"
|
92
|
-
dice_text += "+#{
|
103
|
+
dice_text += "+#{gear_dice_text}"
|
93
104
|
end
|
105
|
+
|
94
106
|
return make_result_text(command_type, dice_count_text, dice_text)
|
95
107
|
end
|
96
108
|
|
@@ -108,18 +120,27 @@ module BCDice
|
|
108
120
|
result_text = "#{dice_count_text} > #{dice_text} 成功数:#{@total_success_dice}"
|
109
121
|
if @difficulty > 0
|
110
122
|
if @total_success_dice >= @difficulty
|
111
|
-
|
123
|
+
return Result.success("#{result_text} 難易度=#{@difficulty}:判定成功!")
|
112
124
|
else
|
113
|
-
|
125
|
+
return Result.failure("#{result_text} 難易度=#{@difficulty}:判定失敗!")
|
114
126
|
end
|
115
127
|
end
|
116
128
|
return result_text
|
117
129
|
end
|
118
130
|
|
119
131
|
def make_result_with_myz(dice_count_text, dice_text)
|
120
|
-
result_text =
|
132
|
+
result_text = "#{dice_count_text} > #{dice_text} 成功数:#{@total_success_dice}"
|
133
|
+
atter_text = "\n出目1:[能力:#{@base_botch_dice},技能:#{@skill_botch_dice},アイテム:#{@gear_botch_dice}) プッシュ可能=#{@push_dice}ダイス"
|
134
|
+
|
135
|
+
if @difficulty > 0
|
136
|
+
if @total_success_dice >= @difficulty
|
137
|
+
return Result.success("#{result_text} 難易度=#{@difficulty}:判定成功!#{atter_text}")
|
138
|
+
else
|
139
|
+
return Result.failure("#{result_text} 難易度=#{@difficulty}:判定失敗!#{atter_text}")
|
140
|
+
end
|
141
|
+
end
|
121
142
|
|
122
|
-
return "#{result_text}
|
143
|
+
return "#{result_text}#{atter_text}"
|
123
144
|
end
|
124
145
|
|
125
146
|
def make_dice_roll(dice_pool)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class << self
|
7
|
+
private
|
8
|
+
|
9
|
+
# @params locale [Symbol]
|
10
|
+
# @return [ChainTable]
|
11
|
+
def translate_accessories_table(locale)
|
12
|
+
items = I18n.t("BeginningIdol.ACT.items", locale: locale)
|
13
|
+
subtables = [
|
14
|
+
DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.head", locale),
|
15
|
+
DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.hat", locale),
|
16
|
+
DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.body", locale),
|
17
|
+
DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.arm", locale),
|
18
|
+
DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.foot", locale),
|
19
|
+
DiceTable::D66Table.from_i18n("BeginningIdol.ACT.subtables.other", locale),
|
20
|
+
]
|
21
|
+
|
22
|
+
ChainTable.new(
|
23
|
+
I18n.t("BeginningIdol.ACT.name", locale: locale),
|
24
|
+
"1D6",
|
25
|
+
items.zip(subtables)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class BadStatusTable
|
7
|
+
def initialize(locale)
|
8
|
+
@locale = locale
|
9
|
+
end
|
10
|
+
|
11
|
+
def roll_command(randomizer, command)
|
12
|
+
m = /^BT(\d+)?$/.match(command)
|
13
|
+
unless m
|
14
|
+
return nil
|
15
|
+
end
|
16
|
+
|
17
|
+
roll_counts = m[1]&.to_i || 1
|
18
|
+
return roll(randomizer, roll_counts)
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param randomizer [BCDice::Randomizer]
|
22
|
+
# @param counts [Integer]
|
23
|
+
def roll(randomizer, roll_counts = 1)
|
24
|
+
if roll_counts <= 0
|
25
|
+
return nil
|
26
|
+
end
|
27
|
+
|
28
|
+
name = I18n.t("BeginningIdol.BT.name", locale: @locale)
|
29
|
+
items = I18n.t("BeginningIdol.BT.items", locale: @locale)
|
30
|
+
prefix_format = I18n.t("BeginningIdol.BT.prefix_format", locale: @locale)
|
31
|
+
|
32
|
+
dice_list = randomizer.roll_barabara(roll_counts, 6).sort
|
33
|
+
index_list = dice_list.uniq
|
34
|
+
|
35
|
+
result_prefix = format(prefix_format, count_bad_status: index_list.size) + "\n" if index_list.size > 1
|
36
|
+
result_text = index_list.map { |i| items[i - 1] }.join("\n")
|
37
|
+
|
38
|
+
return "#{name} > [#{dice_list.join(',')}] > #{result_prefix}#{result_text}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class ChainD66Table
|
7
|
+
# @param [String] name 表の名前
|
8
|
+
# @param [Array<Array<String, #roll>>] items 表の項目の配列
|
9
|
+
def initialize(name, items)
|
10
|
+
@name = name
|
11
|
+
@items = items.freeze
|
12
|
+
end
|
13
|
+
|
14
|
+
# 表を振る
|
15
|
+
# @param randomizer [#roll_sum] ランダマイザ
|
16
|
+
# @return [String] 結果
|
17
|
+
def roll(randomizer)
|
18
|
+
dice = randomizer.roll_barabara(2, 6).sort
|
19
|
+
|
20
|
+
value = dice[0] * 10 + dice[1]
|
21
|
+
chosen = @items[value]
|
22
|
+
body = chosen.map { |item| item.respond_to?(:roll) ? item.roll(randomizer) : item }.join("\n")
|
23
|
+
|
24
|
+
return "#{@name}(#{value}) > #{body}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class ChainTable
|
7
|
+
# @param [String] name 表の名前
|
8
|
+
# @param [String] type 項目を選ぶときのダイスロールの方法 '1D6'など
|
9
|
+
# @param [Array<Array<String, #roll>>] items 表の項目の配列
|
10
|
+
def initialize(name, type, items)
|
11
|
+
@name = name
|
12
|
+
@items = items.freeze
|
13
|
+
|
14
|
+
m = /^(\d+)D(\d+)$/i.match(type)
|
15
|
+
unless m
|
16
|
+
raise ArgumentError, "Unexpected table type: #{type}"
|
17
|
+
end
|
18
|
+
|
19
|
+
@times = m[1].to_i
|
20
|
+
@sides = m[2].to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
# 表を振る
|
24
|
+
# @param randomizer [#roll_sum] ランダマイザ
|
25
|
+
# @return [String] 結果
|
26
|
+
def roll(randomizer)
|
27
|
+
value = randomizer.roll_sum(@times, @sides)
|
28
|
+
index = value - @times
|
29
|
+
chosen = @items[index]
|
30
|
+
body = chosen.map { |item| item.respond_to?(:roll) ? item.roll(randomizer) : item }.join("\n")
|
31
|
+
|
32
|
+
return "#{@name}(#{value}) > #{body}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class CostumeTable
|
7
|
+
def self.from_i18n(key, locale)
|
8
|
+
table = I18n.t(key, locale: locale)
|
9
|
+
new(table[:name], table[:items])
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param name [String]
|
13
|
+
# @param items [Hash{Integer => String}]
|
14
|
+
def initialize(name, items)
|
15
|
+
@name = name
|
16
|
+
@items = items
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param randomizer [Randomizer]
|
20
|
+
# @return [String]
|
21
|
+
def roll(randomizer)
|
22
|
+
value = randomizer.roll_d66(D66SortType::ASC)
|
23
|
+
"#{@name}(#{value}) > #{@items[value]}"
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [DiceTable::D66Table]
|
27
|
+
def brand_only()
|
28
|
+
DiceTable::D66Table.new(
|
29
|
+
@name,
|
30
|
+
D66SortType::ASC,
|
31
|
+
@items.transform_values { |e| e.split("\n").first }
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class D6TwiceTable
|
7
|
+
# @param key [String]
|
8
|
+
# @param locale [Symbol]
|
9
|
+
# @return [D6TwiceTable]
|
10
|
+
def self.from_i18n(key, locale)
|
11
|
+
table = I18n.t(key, locale: locale)
|
12
|
+
new(table[:name], table[:items1], table[:items2])
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param name [String]
|
16
|
+
# @param items1 [Array<String>]
|
17
|
+
# @param items2 [Array<String>]
|
18
|
+
def initialize(name, items1, items2)
|
19
|
+
@name = name
|
20
|
+
@items1 = items1
|
21
|
+
@items2 = items2
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param [Randomizer]
|
25
|
+
# @return [String]
|
26
|
+
def roll(randomizer)
|
27
|
+
value1, value2 = randomizer.roll_barabara(2, 6)
|
28
|
+
chosen1 = @items1[value1 - 1]
|
29
|
+
chosen2 = @items2[value2 - 1]
|
30
|
+
|
31
|
+
"#{@name}[#{value1},#{value2}] > #{chosen1}#{chosen2}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class ItemTable
|
7
|
+
def initialize(locale)
|
8
|
+
@locale = locale
|
9
|
+
end
|
10
|
+
|
11
|
+
def roll_command(randomizer, command)
|
12
|
+
m = /^IT(\d+)?$/.match(command)
|
13
|
+
unless m
|
14
|
+
return nil
|
15
|
+
end
|
16
|
+
|
17
|
+
roll_counts = m[1]&.to_i || 1
|
18
|
+
return roll(randomizer, roll_counts)
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param randomizer [BCDice::Randomizer]
|
22
|
+
# @param counts [Integer]
|
23
|
+
def roll(randomizer, roll_counts = 1)
|
24
|
+
if roll_counts == 0
|
25
|
+
return nil
|
26
|
+
end
|
27
|
+
|
28
|
+
table = I18n.t("BeginningIdol.item_table", locale: @locale)
|
29
|
+
|
30
|
+
dice_list = randomizer.roll_barabara(roll_counts, 6).sort
|
31
|
+
grouped = dice_list.group_by(&:itself)
|
32
|
+
|
33
|
+
item_list = grouped.map do |dice, list|
|
34
|
+
item = table[:items][dice - 1]
|
35
|
+
if grouped.size != 1
|
36
|
+
item = format(table[:emph], item: item)
|
37
|
+
end
|
38
|
+
|
39
|
+
if dice_list.size == grouped.size
|
40
|
+
item
|
41
|
+
else
|
42
|
+
format(table[:counting], item: item, count: list.size)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
return "#{table[:name]} > [#{dice_list.join(',')}] > #{item_list.join(table[:sep])}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class MySkillNameTable
|
7
|
+
# @param locale [Symbol]
|
8
|
+
# @return [MySkillNameTable]
|
9
|
+
def initialize(locale)
|
10
|
+
@locale = locale
|
11
|
+
|
12
|
+
article = DiceTable::Table.from_i18n("BeginningIdol.MS.subtables.article", locale)
|
13
|
+
describe = DiceTable::D66Table.from_i18n("BeginningIdol.MS.subtables.describe", locale)
|
14
|
+
scene = DiceTable::D66Table.from_i18n("BeginningIdol.MS.subtables.scene", locale)
|
15
|
+
material = DiceTable::D66Table.from_i18n("BeginningIdol.MS.subtables.material", locale)
|
16
|
+
action = DiceTable::D66Table.from_i18n("BeginningIdol.MS.subtables.action", locale)
|
17
|
+
@chains = [
|
18
|
+
[describe, scene, material],
|
19
|
+
[describe, scene, action],
|
20
|
+
[describe, material, action],
|
21
|
+
[scene, material, action],
|
22
|
+
[describe, scene, article],
|
23
|
+
[material, action, article],
|
24
|
+
].freeze
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param randomizer [BCDice::Randomizer]
|
28
|
+
# @return [String]
|
29
|
+
def roll(randomizer)
|
30
|
+
index = randomizer.roll_once(6)
|
31
|
+
chosens = @chains[index - 1].map { |t| t.roll(randomizer) }
|
32
|
+
|
33
|
+
dice = chosens.map { |chosen| chosen.table_name + chosen.value.to_s }
|
34
|
+
|
35
|
+
name = I18n.t("BeginningIdol.MS.name", locale: @locale)
|
36
|
+
skill_name_format = I18n.t("BeginningIdol.MS.formats", locale: @locale)[index - 1]
|
37
|
+
skill_name = format(skill_name_format, *chosens.map(&:body))
|
38
|
+
|
39
|
+
"#{name} > [#{index},#{dice.join(',')}] > #{skill_name}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class RandomEventTable
|
7
|
+
# @param locale [Symbol]
|
8
|
+
# @return [MySkillNameTable]
|
9
|
+
def initialize(locale)
|
10
|
+
@locale = locale
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param randomizer [BCDice::Randomizer]
|
14
|
+
# @return [String]
|
15
|
+
def roll(randomizer)
|
16
|
+
first_index = randomizer.roll_once(6)
|
17
|
+
d66_index = randomizer.roll_d66(D66SortType::NO_SORT)
|
18
|
+
|
19
|
+
i18n_key = first_index.even? ? "BeginningIdol.RE.on_event" : "BeginningIdol.RE.off_event"
|
20
|
+
table = I18n.t(i18n_key, locale: @locale)
|
21
|
+
name = I18n.t("BeginningIdol.RE.name", locale: @locale)
|
22
|
+
result_format = I18n.t("BeginningIdol.RE.format", locale: @locale)
|
23
|
+
|
24
|
+
chosen = table[:items][d66_index]
|
25
|
+
|
26
|
+
return "#{name} > (1D6) > #{first_index}\n#{table[:name]} > [#{d66_index}] > #{format(result_format, event: chosen[0], page: chosen[1])}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDice
|
4
|
+
module GameSystem
|
5
|
+
class BeginningIdol < Base
|
6
|
+
class SkillTable < DiceTable::SaiFicSkillTable
|
7
|
+
def roll(randomizer)
|
8
|
+
roll_command(randomizer, "RTT")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class SkillGetTable < DiceTable::Table
|
13
|
+
def self.from_i18n(key, skill_table, locale)
|
14
|
+
table = I18n.t(key, locale: locale)
|
15
|
+
new(table[:name], table[:type], table[:items], skill_table, locale)
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(name, type, items, skill_table, locale)
|
19
|
+
super(name, type, items)
|
20
|
+
@skill_table = skill_table
|
21
|
+
|
22
|
+
skill_get_table = I18n.t("BeginningIdol.skill_get_table", locale: locale)
|
23
|
+
@reroll_reg = Regexp.new(skill_get_table[:reroll_reg])
|
24
|
+
@reroll = skill_get_table[:reroll]
|
25
|
+
@secondary_name = skill_get_table[:secondary_name]
|
26
|
+
end
|
27
|
+
|
28
|
+
def roll(randomizer)
|
29
|
+
chosen = super(randomizer)
|
30
|
+
|
31
|
+
m = @reroll_reg.match(chosen.body)
|
32
|
+
unless m
|
33
|
+
return chosen
|
34
|
+
end
|
35
|
+
|
36
|
+
reroll_category = m.captures
|
37
|
+
body = chosen.body + "\n"
|
38
|
+
loop do
|
39
|
+
skill = @skill_table.roll_skill(randomizer)
|
40
|
+
body += "#{@secondary_name} > [#{skill.category_dice},#{skill.row_dice}] > #{skill}"
|
41
|
+
unless reroll_category.include?(skill.category_name)
|
42
|
+
break
|
43
|
+
end
|
44
|
+
|
45
|
+
body += " > #{@reroll}\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
DiceTable::RollResult.new(chosen.table_name, chosen.value, body)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class SkillHometown
|
53
|
+
def initialize(skill_table)
|
54
|
+
@skill_name = skill_table
|
55
|
+
end
|
56
|
+
|
57
|
+
def roll(randomizer)
|
58
|
+
@skill_name.roll_command(randomizer, "AT6")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|