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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/i18n/BeginningIdol/ja_jp.yml +2806 -0
  4. data/i18n/BeginningIdol/ko_kr.yml +1400 -0
  5. data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
  6. data/i18n/MagicaLogia/ja_jp.yml +1 -1
  7. data/i18n/MonotoneMuseum/ko_kr.yml +526 -53
  8. data/lib/bcdice/common_command/choice.rb +5 -1
  9. data/lib/bcdice/common_command/tally_dice/node.rb +135 -0
  10. data/lib/bcdice/common_command/tally_dice/parser.rb +302 -0
  11. data/lib/bcdice/common_command/tally_dice.rb +19 -0
  12. data/lib/bcdice/common_command.rb +2 -0
  13. data/lib/bcdice/dice_table/d66_table.rb +5 -1
  14. data/lib/bcdice/game_system/Aoharubaan.rb +91 -0
  15. data/lib/bcdice/game_system/AssaultEngine.rb +91 -0
  16. data/lib/bcdice/game_system/BadLife.rb +264 -289
  17. data/lib/bcdice/game_system/Bakenokawa.rb +244 -0
  18. data/lib/bcdice/game_system/BeginningIdol.rb +116 -2390
  19. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +10 -2312
  20. data/lib/bcdice/game_system/CastleInGray.rb +133 -0
  21. data/lib/bcdice/game_system/Cthulhu.rb +2 -2
  22. data/lib/bcdice/game_system/Cthulhu7th.rb +6 -6
  23. data/lib/bcdice/game_system/DoubleCross.rb +5 -0
  24. data/lib/bcdice/game_system/Emoklore.rb +1 -1
  25. data/lib/bcdice/game_system/FateCoreSystem.rb +117 -0
  26. data/lib/bcdice/game_system/Karukami.rb +84 -0
  27. data/lib/bcdice/game_system/KurayamiCrying.rb +1 -1
  28. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +4 -4
  29. data/lib/bcdice/game_system/{SterileLife.rb → StellarLife.rb} +162 -226
  30. data/lib/bcdice/game_system/SwordWorld.rb +6 -2
  31. data/lib/bcdice/game_system/SwordWorld2_0.rb +20 -5
  32. data/lib/bcdice/game_system/SwordWorld2_5.rb +6 -0
  33. data/lib/bcdice/game_system/TalesFromTheLoop.rb +83 -0
  34. data/lib/bcdice/game_system/YearZeroEngine.rb +40 -19
  35. data/lib/bcdice/game_system/beginning_idol/accessories_table.rb +31 -0
  36. data/lib/bcdice/game_system/beginning_idol/bad_status_table.rb +43 -0
  37. data/lib/bcdice/game_system/beginning_idol/chain_d66_table.rb +29 -0
  38. data/lib/bcdice/game_system/beginning_idol/chain_table.rb +37 -0
  39. data/lib/bcdice/game_system/beginning_idol/costume_table.rb +37 -0
  40. data/lib/bcdice/game_system/beginning_idol/d6_twice_table.rb +36 -0
  41. data/lib/bcdice/game_system/beginning_idol/item_table.rb +51 -0
  42. data/lib/bcdice/game_system/beginning_idol/my_skill_name_table.rb +44 -0
  43. data/lib/bcdice/game_system/beginning_idol/random_event_table.rb +31 -0
  44. data/lib/bcdice/game_system/beginning_idol/skill_table.rb +63 -0
  45. data/lib/bcdice/game_system/beginning_idol/table.rb +193 -0
  46. data/lib/bcdice/game_system/beginning_idol/with_abnormality.rb +74 -0
  47. data/lib/bcdice/game_system/beginning_idol/work_table.rb +57 -0
  48. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +4 -4
  49. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +46 -3
  50. data/lib/bcdice/game_system/sword_world/rating_parser.rb +147 -106
  51. data/lib/bcdice/game_system.rb +8 -1
  52. data/lib/bcdice/version.rb +1 -1
  53. 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 = 1 # 難易度のインデックス
27
- COMMAND_TYPE_INDEX = 2 # コマンドタイプのインデックス
28
- ABILITY_INDEX = 3 # 能力値ダイスのインデックス
29
- SKILL_INDEX = 5 # 技能値ダイスのインデックス
30
- MODIFIED_INDEX = 7 # 修正ダイスのインデックス
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+)(\+(\d+))?(\+(\d+))?/.match(command)
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
- @total_success_dice += success_dice
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 += "+(#{dice_pool}D6)"
79
- dice_text += "+#{skill_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[MODIFIED_INDEX]
83
- dice_pool = m[MODIFIED_INDEX].to_i
84
- modified_dice_text, success_dice, botch_dice = make_dice_roll(dice_pool)
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 += "+#{modified_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
- result_text = "#{result_text} 難易度=#{@difficulty}:判定成功!"
123
+ return Result.success("#{result_text} 難易度=#{@difficulty}:判定成功!")
112
124
  else
113
- result_text = "#{result_text} 難易度=#{@difficulty}:判定失敗!"
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 = make_result_with_yze(dice_count_text, dice_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}\n出目1:[能力:#{@base_botch_dice},技能:#{@skill_botch_dice},アイテム:#{@gear_botch_dice}) プッシュ可能=#{@push_dice}ダイス"
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