bcdice 3.1.2 → 3.4.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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +154 -75
  3. data/README.md +3 -2
  4. data/i18n/Cthulhu/zh_hans.yml +11 -0
  5. data/i18n/MagicaLogia/zh_hans.yml +564 -0
  6. data/i18n/StellarKnights/ja_jp.yml +498 -0
  7. data/i18n/StellarKnights/ko_kr.yml +498 -0
  8. data/i18n/zh_hans.yml +7 -0
  9. data/lib/bcdice/command/parsed.rb +11 -3
  10. data/lib/bcdice/command/parser.rb +179 -100
  11. data/lib/bcdice/common_command/add_dice.rb +1 -1
  12. data/lib/bcdice/common_command/barabara_dice/node.rb +2 -2
  13. data/lib/bcdice/common_command/barabara_dice/result.rb +6 -0
  14. data/lib/bcdice/common_command/calc.rb +1 -1
  15. data/lib/bcdice/common_command/choice.rb +78 -7
  16. data/lib/bcdice/dice_table.rb +3 -0
  17. data/lib/bcdice/dice_table/d66_half_grid_table.rb +33 -0
  18. data/lib/bcdice/dice_table/d66_left_range_table.rb +29 -0
  19. data/lib/bcdice/dice_table/d66_one_third_table.rb +34 -0
  20. data/lib/bcdice/game_system.rb +10 -0
  21. data/lib/bcdice/game_system/AceKillerGene.rb +1 -1
  22. data/lib/bcdice/game_system/Ainecadette.rb +68 -0
  23. data/lib/bcdice/game_system/Airgetlamh.rb +1 -1
  24. data/lib/bcdice/game_system/Alsetto.rb +1 -1
  25. data/lib/bcdice/game_system/AlterRaise.rb +2 -2
  26. data/lib/bcdice/game_system/Amadeus.rb +110 -93
  27. data/lib/bcdice/game_system/AngelGear.rb +10 -5
  28. data/lib/bcdice/game_system/AnimaAnimus.rb +16 -9
  29. data/lib/bcdice/game_system/Arianrhod.rb +6 -8
  30. data/lib/bcdice/game_system/Avandner.rb +1 -1
  31. data/lib/bcdice/game_system/BarnaKronika.rb +1 -1
  32. data/lib/bcdice/game_system/BattleTech.rb +109 -28
  33. data/lib/bcdice/game_system/BeastBindTrinity.rb +28 -12
  34. data/lib/bcdice/game_system/BeginningIdol.rb +5 -5
  35. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +5 -5
  36. data/lib/bcdice/game_system/BladeOfArcana.rb +1 -1
  37. data/lib/bcdice/game_system/BlindMythos.rb +39 -38
  38. data/lib/bcdice/game_system/BloodCrusade.rb +6 -7
  39. data/lib/bcdice/game_system/BloodMoon.rb +9 -8
  40. data/lib/bcdice/game_system/CardRanker.rb +8 -7
  41. data/lib/bcdice/game_system/ChaosFlare.rb +21 -15
  42. data/lib/bcdice/game_system/Chill.rb +10 -10
  43. data/lib/bcdice/game_system/Chill3.rb +9 -9
  44. data/lib/bcdice/game_system/CodeLayerd.rb +39 -39
  45. data/lib/bcdice/game_system/ColossalHunter.rb +34 -47
  46. data/lib/bcdice/game_system/CrashWorld.rb +1 -1
  47. data/lib/bcdice/game_system/Cthulhu.rb +1 -1
  48. data/lib/bcdice/game_system/Cthulhu7th.rb +50 -12
  49. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +1 -1
  50. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +1 -1
  51. data/lib/bcdice/game_system/Cthulhu_SimplifiedChinese.rb +60 -0
  52. data/lib/bcdice/game_system/DarkBlaze.rb +0 -11
  53. data/lib/bcdice/game_system/DarkDaysDrive.rb +8 -7
  54. data/lib/bcdice/game_system/DeadlineHeroes.rb +11 -10
  55. data/lib/bcdice/game_system/DemonParasite.rb +5 -13
  56. data/lib/bcdice/game_system/DesperateRun.rb +1 -1
  57. data/lib/bcdice/game_system/DoubleCross.rb +3 -1
  58. data/lib/bcdice/game_system/Dracurouge.rb +3 -2
  59. data/lib/bcdice/game_system/EclipsePhase.rb +14 -14
  60. data/lib/bcdice/game_system/Elric.rb +18 -14
  61. data/lib/bcdice/game_system/Elysion.rb +1 -1
  62. data/lib/bcdice/game_system/EmbryoMachine.rb +9 -8
  63. data/lib/bcdice/game_system/Emoklore.rb +25 -20
  64. data/lib/bcdice/game_system/Fiasco.rb +1 -1
  65. data/lib/bcdice/game_system/FilledWith.rb +4 -0
  66. data/lib/bcdice/game_system/FutariSousa.rb +12 -10
  67. data/lib/bcdice/game_system/GURPS.rb +17 -28
  68. data/lib/bcdice/game_system/Garako.rb +1 -1
  69. data/lib/bcdice/game_system/GardenOrder.rb +12 -7
  70. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +1 -1
  71. data/lib/bcdice/game_system/GoblinSlayer.rb +1 -1
  72. data/lib/bcdice/game_system/Gorilla.rb +2 -8
  73. data/lib/bcdice/game_system/GranCrest.rb +189 -417
  74. data/lib/bcdice/game_system/Gundog.rb +9 -8
  75. data/lib/bcdice/game_system/GundogRevised.rb +10 -9
  76. data/lib/bcdice/game_system/GundogZero.rb +1 -1
  77. data/lib/bcdice/game_system/GurpsFW.rb +16 -16
  78. data/lib/bcdice/game_system/HarnMaster.rb +19 -26
  79. data/lib/bcdice/game_system/HatsuneMiku.rb +1 -1
  80. data/lib/bcdice/game_system/Hieizan.rb +12 -21
  81. data/lib/bcdice/game_system/HouraiGakuen.rb +1 -1
  82. data/lib/bcdice/game_system/HuntersMoon.rb +5 -10
  83. data/lib/bcdice/game_system/InfiniteFantasia.rb +19 -17
  84. data/lib/bcdice/game_system/Insane.rb +13 -20
  85. data/lib/bcdice/game_system/Irisbane.rb +154 -0
  86. data/lib/bcdice/game_system/IthaWenUa.rb +8 -15
  87. data/lib/bcdice/game_system/JamesBond.rb +10 -10
  88. data/lib/bcdice/game_system/JekyllAndHyde.rb +1 -1
  89. data/lib/bcdice/game_system/Kamigakari.rb +1 -1
  90. data/lib/bcdice/game_system/KanColle.rb +4 -9
  91. data/lib/bcdice/game_system/KemonoNoMori.rb +26 -39
  92. data/lib/bcdice/game_system/KillDeathBusiness.rb +7 -15
  93. data/lib/bcdice/game_system/KurayamiCrying.rb +141 -2
  94. data/lib/bcdice/game_system/LiveraDoll.rb +254 -304
  95. data/lib/bcdice/game_system/LogHorizon.rb +13 -10
  96. data/lib/bcdice/game_system/MagicaLogia_SimplifiedChinese.rb +66 -0
  97. data/lib/bcdice/game_system/MeikyuDays.rb +10 -8
  98. data/lib/bcdice/game_system/MeikyuKingdom.rb +26 -26
  99. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +4 -3
  100. data/lib/bcdice/game_system/MetalHead.rb +12 -22
  101. data/lib/bcdice/game_system/MetalHeadExtream.rb +5 -5
  102. data/lib/bcdice/game_system/MonotoneMuseum.rb +8 -6
  103. data/lib/bcdice/game_system/Nechronica.rb +63 -90
  104. data/lib/bcdice/game_system/NinjaSlayer.rb +6 -7
  105. data/lib/bcdice/game_system/NjslyrBattle.rb +8 -11
  106. data/lib/bcdice/game_system/OneWayHeroics.rb +1 -1
  107. data/lib/bcdice/game_system/Paradiso.rb +3 -3
  108. data/lib/bcdice/game_system/ParasiteBlood.rb +1 -1
  109. data/lib/bcdice/game_system/Peekaboo.rb +4 -9
  110. data/lib/bcdice/game_system/Pendragon.rb +7 -7
  111. data/lib/bcdice/game_system/PersonaO.rb +86 -0
  112. data/lib/bcdice/game_system/PhantasmAdventure.rb +8 -8
  113. data/lib/bcdice/game_system/Postman.rb +1 -1
  114. data/lib/bcdice/game_system/PulpCthulhu.rb +1 -1
  115. data/lib/bcdice/game_system/Raisondetre.rb +2 -2
  116. data/lib/bcdice/game_system/Revulture.rb +123 -0
  117. data/lib/bcdice/game_system/RuneQuest.rb +8 -8
  118. data/lib/bcdice/game_system/Ryutama.rb +1 -1
  119. data/lib/bcdice/game_system/SRS.rb +17 -16
  120. data/lib/bcdice/game_system/SamsaraBallad.rb +38 -11
  121. data/lib/bcdice/game_system/Satasupe.rb +32 -32
  122. data/lib/bcdice/game_system/ScreamHighSchool.rb +5 -5
  123. data/lib/bcdice/game_system/SharedFantasia.rb +19 -23
  124. data/lib/bcdice/game_system/ShinobiGami.rb +14 -6
  125. data/lib/bcdice/game_system/Skynauts.rb +103 -142
  126. data/lib/bcdice/game_system/SkynautsBouken.rb +228 -0
  127. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  128. data/lib/bcdice/game_system/SteamPunkers.rb +25 -7
  129. data/lib/bcdice/game_system/StellarKnights.rb +85 -706
  130. data/lib/bcdice/game_system/StellarKnights_Korean.rb +79 -0
  131. data/lib/bcdice/game_system/SterileLife.rb +2 -3
  132. data/lib/bcdice/game_system/StratoShout.rb +8 -16
  133. data/lib/bcdice/game_system/Strave.rb +1 -1
  134. data/lib/bcdice/game_system/SwordWorld.rb +16 -7
  135. data/lib/bcdice/game_system/SwordWorld2_0.rb +2 -2
  136. data/lib/bcdice/game_system/SwordWorld2_5.rb +2 -2
  137. data/lib/bcdice/game_system/TherapieSein.rb +1 -1
  138. data/lib/bcdice/game_system/TokumeiTenkousei.rb +4 -3
  139. data/lib/bcdice/game_system/TokyoGhostResearch.rb +1 -1
  140. data/lib/bcdice/game_system/TorgEternity.rb +2 -2
  141. data/lib/bcdice/game_system/ToshiakiHolyGrailWar.rb +92 -0
  142. data/lib/bcdice/game_system/TrinitySeven.rb +279 -280
  143. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +1 -1
  144. data/lib/bcdice/game_system/Utakaze.rb +53 -48
  145. data/lib/bcdice/game_system/Villaciel.rb +1 -1
  146. data/lib/bcdice/game_system/WARPS.rb +11 -9
  147. data/lib/bcdice/game_system/WaresBlade.rb +4 -9
  148. data/lib/bcdice/game_system/Warhammer.rb +15 -6
  149. data/lib/bcdice/game_system/Warhammer4.rb +15 -11
  150. data/lib/bcdice/game_system/WitchQuest.rb +1 -1
  151. data/lib/bcdice/game_system/YankeeYogSothoth.rb +4 -9
  152. data/lib/bcdice/game_system/Yggdrasill.rb +1 -1
  153. data/lib/bcdice/game_system/ZettaiReido.rb +20 -25
  154. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +1 -1
  155. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +4 -4
  156. data/lib/bcdice/game_system/sword_world/rating_parser.rb +1 -1
  157. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +26 -8
  158. data/lib/bcdice/repl.rb +1 -1
  159. data/lib/bcdice/result.rb +26 -0
  160. data/lib/bcdice/version.rb +1 -1
  161. metadata +22 -5
@@ -7,7 +7,7 @@ require "bcdice/common_command/add_dice/randomizer"
7
7
  module BCDice
8
8
  module CommonCommand
9
9
  module AddDice
10
- PREFIX_PATTERN = /[+\-\dD(]+/.freeze
10
+ PREFIX_PATTERN = /[+\-(]*\d+/.freeze
11
11
 
12
12
  class << self
13
13
  def eval(command, game_system, randomizer)
@@ -43,8 +43,8 @@ module BCDice
43
43
  Result.new.tap do |r|
44
44
  r.secret = @secret
45
45
  r.text = sequence.join(" > ")
46
- r.rands = randomizer.rand_results
47
- r.detailed_rands = randomizer.detailed_rand_results
46
+ r.last_dice_list_list = dice_list_list
47
+ r.last_dice_list = dice_list
48
48
  r.success_num = success_num
49
49
  end
50
50
  end
@@ -7,6 +7,10 @@ module BCDice
7
7
  module BarabaraDice
8
8
  # バラバラロールの結果を表すクラス
9
9
  class Result < ::BCDice::Result
10
+ # @return [Array<Array<Integer>>] 出目のグループの配列
11
+ attr_accessor :last_dice_list_list
12
+ # @return [Array<Integer>] すべての出目が格納される配列
13
+ attr_accessor :last_dice_list
10
14
  # @return [Integer] 成功数
11
15
  attr_accessor :success_num
12
16
 
@@ -14,6 +18,8 @@ module BCDice
14
18
  def initialize(text = nil)
15
19
  super(text)
16
20
 
21
+ @last_dice_list_list = []
22
+ @last_dice_list = []
17
23
  @success_num = 0
18
24
  end
19
25
  end
@@ -5,7 +5,7 @@ require "bcdice/common_command/calc/parser"
5
5
  module BCDice
6
6
  module CommonCommand
7
7
  module Calc
8
- PREFIX_PATTERN = /C/.freeze
8
+ PREFIX_PATTERN = /C[+\-(]*\d+/.freeze
9
9
 
10
10
  class << self
11
11
  def eval(command, game_system, _randomizer)
@@ -29,6 +29,17 @@ module BCDice
29
29
  # choice A,B X,Y -> "A,B" と "X,Y" から選ぶ
30
30
  # choice(A[], B[], C[]) -> "A[]", "B[]", "C[]" から選ぶ
31
31
  # choice[A(), B(), C()] -> "A()", "B()", "C()" から選ぶ
32
+ #
33
+ # "choise"の後に数を指定することで、列挙した要素から重複なしで複数個を選ぶ
34
+ # choice2[A,B,C] -> "A", "B", "C" から重複なしで2個選ぶ
35
+ #
36
+ # 指定したい要素が「AからD」のように連続する項目の場合に「A-D」と省略して記述できる
37
+ # 略記の展開はアルファベット1文字もしくは数字の範囲に限り、略記1つを指定したときのみ展開される
38
+ # choice[A-D] -> choice[A,B,C,D] と等価
39
+ # choice[b-g] -> choice[b,c,d,e,f,g] と等価
40
+ # choice[3-7] -> choice[3,4,5,6,7] と等価
41
+ # choice[A-D,Z] -> 展開されない。 "A-D", "Z" から選ぶ
42
+ # choice[D-A] -> 展開されない。
32
43
  class Choice
33
44
  PREFIX_PATTERN = /choice/.freeze
34
45
 
@@ -44,6 +55,12 @@ module BCDice
44
55
  space: /\s+/,
45
56
  }.freeze
46
57
 
58
+ DELIMITER_CHAR = {
59
+ bracket: ", ",
60
+ paren: ", ",
61
+ space: " ",
62
+ }.freeze
63
+
47
64
  TERMINATION = {
48
65
  bracket: /\]/,
49
66
  paren: /\)/,
@@ -77,6 +94,11 @@ module BCDice
77
94
  return nil
78
95
  end
79
96
 
97
+ takes = scanner.scan(/\d+/)&.to_i || 1
98
+ if takes == 0
99
+ return nil
100
+ end
101
+
80
102
  type =
81
103
  case scanner.scan(/\(|\[|\s+/)
82
104
  when "["
@@ -105,47 +127,96 @@ module BCDice
105
127
  items.push(last_item.delete_suffix(SUFFIX[type]))
106
128
 
107
129
  items = items.map(&:strip).reject(&:empty?)
108
- if items.empty?
130
+ if items.size == 1
131
+ items = parse_multi_item_shorthand(items.first)
132
+ end
133
+
134
+ if items.empty? || items.size < takes
109
135
  return nil
110
136
  end
111
137
 
112
138
  new(
113
139
  secret: secret,
114
140
  block_delimiter: type,
141
+ takes: takes,
115
142
  items: items
116
143
  )
117
144
  end
145
+
146
+ def parse_multi_item_shorthand(str)
147
+ parse_multi_nums_shorthand(str) || parse_multi_chars_shorthand(str) || []
148
+ end
149
+
150
+ def parse_multi_nums_shorthand(str)
151
+ m = /^(\d+)-(\d+)$/.match(str)
152
+ unless m
153
+ return nil
154
+ end
155
+
156
+ first = m[1].to_i
157
+ last = m[2].to_i
158
+ if first > last
159
+ return nil
160
+ end
161
+
162
+ return first.upto(last).to_a
163
+ end
164
+
165
+ def parse_multi_chars_shorthand(str)
166
+ m = /^([a-z])-([a-z])$/.match(str) || /^([A-Z])-([A-Z])$/.match(str)
167
+ unless m
168
+ return nil
169
+ end
170
+
171
+ first = m[1]
172
+ last = m[2]
173
+ if first > last
174
+ return nil
175
+ end
176
+
177
+ return first.upto(last).to_a
178
+ end
118
179
  end
119
180
 
120
181
  # @param secret [Boolean]
121
182
  # @param block_delimiter [BlockDelimiter::BRACKET, BlockDelimiter::PAREN, BlockDelimiter::SPACE]
183
+ # @param takes [Integer] 何個チョイスするか
122
184
  # @param items [Array<String>]
123
- def initialize(secret:, block_delimiter:, items:)
185
+ def initialize(secret:, block_delimiter:, takes:, items:)
124
186
  @secret = secret
125
187
  @block_delimiter = block_delimiter
188
+ @takes = takes
126
189
  @items = items
127
190
  end
128
191
 
129
192
  # @param randomizer [Randomizer]
130
193
  # @return [Result]
131
194
  def roll(randomizer)
132
- index = randomizer.roll_index(@items.size)
133
- chosen = @items[index]
195
+ items = @items.dup
196
+ chosens = []
197
+ @takes.times do
198
+ index = randomizer.roll_index(items.size)
199
+ chosens << items.delete_at(index)
200
+ end
134
201
 
135
202
  Result.new.tap do |r|
203
+ chosen = chosens.join(DELIMITER_CHAR[@block_delimiter])
204
+
136
205
  r.secret = @secret
137
206
  r.text = "(#{expr()}) > #{chosen}"
138
207
  end
139
208
  end
140
209
 
141
210
  def expr
211
+ takes = @takes == 1 ? nil : @takes
212
+
142
213
  case @block_delimiter
143
214
  when BlockDelimiter::SPACE
144
- "choice #{@items.join(' ')}"
215
+ "choice#{takes} #{@items.join(' ')}"
145
216
  when BlockDelimiter::BRACKET
146
- "choice[#{@items.join(',')}]"
217
+ "choice#{takes}[#{@items.join(',')}]"
147
218
  when BlockDelimiter::PAREN
148
- "choice(#{@items.join(',')})"
219
+ "choice#{takes}(#{@items.join(',')})"
149
220
  end
150
221
  end
151
222
  end
@@ -3,6 +3,9 @@
3
3
  require "bcdice/dice_table/roll_result"
4
4
  require "bcdice/dice_table/chain_table"
5
5
  require "bcdice/dice_table/d66_grid_table"
6
+ require "bcdice/dice_table/d66_half_grid_table"
7
+ require "bcdice/dice_table/d66_one_third_table"
8
+ require "bcdice/dice_table/d66_left_range_table"
6
9
  require "bcdice/dice_table/d66_parity_table"
7
10
  require "bcdice/dice_table/d66_range_table"
8
11
  require "bcdice/dice_table/d66_table"
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/dice_table/d66_grid_table"
4
+
5
+ module BCDice
6
+ module DiceTable
7
+ # D66を振って6x6マスの表を参照する
8
+ class D66HalfGridTable < D66GridTable
9
+ # @param key [String]
10
+ # @param locale [Symbol]
11
+ # @return [D66HalfGridTable]
12
+ def self.from_i18n(key, locale)
13
+ table = I18n.t(key, locale: locale, raise: true)
14
+ new(table[:name], table[:items_1_2_3], table[:items_4_5_6])
15
+ end
16
+
17
+ # @param [String] name 表の名前
18
+ # @param [Array<String>] items_1_2_3
19
+ # @param [Array<String>] items_4_5_6
20
+ def initialize(name, items_1_2_3, items_4_5_6)
21
+ @name = name
22
+ @items = [
23
+ items_1_2_3,
24
+ items_1_2_3,
25
+ items_1_2_3,
26
+ items_4_5_6,
27
+ items_4_5_6,
28
+ items_4_5_6,
29
+ ].freeze
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/dice_table/d66_table"
4
+
5
+ module BCDice
6
+ module DiceTable
7
+ # 左側(十の位)のみ Range を用いる D66 表
8
+ class D66LeftRangeTable < D66Table
9
+ # @param name [String] 表の名前
10
+ # @param sort_type [Symbol] 出目入れ替えの方式 BCDice::D66SortType
11
+ # @param items [Array<(Range, Array<String>)>] 表の項目の配列
12
+ def initialize(name, sort_type, items)
13
+ expanded_items = {}
14
+ items.each do |item|
15
+ range, right_items = item
16
+
17
+ range.each do |left_value|
18
+ right_items.each_with_index do |right_item, right_value|
19
+ key = left_value * 10 + (right_value + 1)
20
+ expanded_items[key] = right_item
21
+ end
22
+ end
23
+ end
24
+
25
+ super(name, sort_type, expanded_items)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/dice_table/d66_grid_table"
4
+
5
+ module BCDice
6
+ module DiceTable
7
+ # D66を振って6x6マスの表を参照する
8
+ class D66OneThirdTable < D66GridTable
9
+ # @param key [String]
10
+ # @param locale [Symbol]
11
+ # @return [D66OneThirdTable]
12
+ def self.from_i18n(key, locale)
13
+ table = I18n.t(key, locale: locale, raise: true)
14
+ new(table[:name], table[:items_1_2], table[:items_3_4], table[:items_5_6])
15
+ end
16
+
17
+ # @param [String] name 表の名前
18
+ # @param [Array<String>] items_1_2
19
+ # @param [Array<String>] items_3_4
20
+ # @param [Array<String>] items_5_6
21
+ def initialize(name, items_1_2, items_3_4, items_5_6)
22
+ @name = name
23
+ @items = [
24
+ items_1_2,
25
+ items_1_2,
26
+ items_3_4,
27
+ items_3_4,
28
+ items_5_6,
29
+ items_5_6,
30
+ ].freeze
31
+ end
32
+ end
33
+ end
34
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "bcdice/game_system/AFF2e"
4
4
  require "bcdice/game_system/AceKillerGene"
5
+ require "bcdice/game_system/Ainecadette"
5
6
  require "bcdice/game_system/Airgetlamh"
6
7
  require "bcdice/game_system/AlchemiaStruggle"
7
8
  require "bcdice/game_system/Alsetto"
@@ -40,6 +41,7 @@ require "bcdice/game_system/Cthulhu7th_Korean"
40
41
  require "bcdice/game_system/CthulhuTech"
41
42
  require "bcdice/game_system/Cthulhu_ChineseTraditional"
42
43
  require "bcdice/game_system/Cthulhu_Korean"
44
+ require "bcdice/game_system/Cthulhu_SimplifiedChinese"
43
45
  require "bcdice/game_system/DarkBlaze"
44
46
  require "bcdice/game_system/DarkDaysDrive"
45
47
  require "bcdice/game_system/DarkSouls"
@@ -94,6 +96,7 @@ require "bcdice/game_system/InfiniteBabeL"
94
96
  require "bcdice/game_system/InfiniteFantasia"
95
97
  require "bcdice/game_system/Insane"
96
98
  require "bcdice/game_system/Insane_Korean"
99
+ require "bcdice/game_system/Irisbane"
97
100
  require "bcdice/game_system/IthaWenUa"
98
101
  require "bcdice/game_system/JamesBond"
99
102
  require "bcdice/game_system/JekyllAndHyde"
@@ -112,6 +115,7 @@ require "bcdice/game_system/LostRecord"
112
115
  require "bcdice/game_system/LostRoyal"
113
116
  require "bcdice/game_system/MagicaLogia"
114
117
  require "bcdice/game_system/MagicaLogia_Korean"
118
+ require "bcdice/game_system/MagicaLogia_SimplifiedChinese"
115
119
  require "bcdice/game_system/MeikyuDays"
116
120
  require "bcdice/game_system/MeikyuKingdom"
117
121
  require "bcdice/game_system/MeikyuKingdomBasic"
@@ -141,12 +145,14 @@ require "bcdice/game_system/ParasiteBlood"
141
145
  require "bcdice/game_system/Pathfinder"
142
146
  require "bcdice/game_system/Peekaboo"
143
147
  require "bcdice/game_system/Pendragon"
148
+ require "bcdice/game_system/PersonaO"
144
149
  require "bcdice/game_system/PhantasmAdventure"
145
150
  require "bcdice/game_system/Postman"
146
151
  require "bcdice/game_system/PulpCthulhu"
147
152
  require "bcdice/game_system/Raisondetre"
148
153
  require "bcdice/game_system/RecordOfLodossWar"
149
154
  require "bcdice/game_system/RecordOfSteam"
155
+ require "bcdice/game_system/Revulture"
150
156
  require "bcdice/game_system/RokumonSekai2"
151
157
  require "bcdice/game_system/RoleMaster"
152
158
  require "bcdice/game_system/RuinBreakers"
@@ -167,8 +173,11 @@ require "bcdice/game_system/ShinkuuGakuen"
167
173
  require "bcdice/game_system/ShinobiGami"
168
174
  require "bcdice/game_system/ShoujoTenrankai"
169
175
  require "bcdice/game_system/Skynauts"
176
+ require "bcdice/game_system/SkynautsBouken"
177
+ require "bcdice/game_system/StarryDolls"
170
178
  require "bcdice/game_system/SteamPunkers"
171
179
  require "bcdice/game_system/StellarKnights"
180
+ require "bcdice/game_system/StellarKnights_Korean"
172
181
  require "bcdice/game_system/SterileLife"
173
182
  require "bcdice/game_system/StrangerOfSwordCity"
174
183
  require "bcdice/game_system/StratoShout"
@@ -184,6 +193,7 @@ require "bcdice/game_system/TokyoNova"
184
193
  require "bcdice/game_system/Torg"
185
194
  require "bcdice/game_system/Torg1_5"
186
195
  require "bcdice/game_system/TorgEternity"
196
+ require "bcdice/game_system/ToshiakiHolyGrailWar"
187
197
  require "bcdice/game_system/TrinitySeven"
188
198
  require "bcdice/game_system/TunnelsAndTrolls"
189
199
  require "bcdice/game_system/TwilightGunsmoke"
@@ -28,7 +28,7 @@ module BCDice
28
28
  INFO_MESSAGE_TEXT
29
29
 
30
30
  register_prefix(
31
- '(AK|AKG)(\-?\d+)(\/\d+)?(@\d+)?',
31
+ '(AK|AKG)',
32
32
  'DC(SL|BL|IM|BR|RF|EL).+'
33
33
  )
34
34
 
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Ainecadette < Base
6
+ # ゲームシステムの識別子
7
+ ID = "Ainecadette"
8
+
9
+ # ゲームシステム名
10
+ NAME = "エネカデット"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "えねかてつと"
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ■ 判定
18
+ - 先輩 (AI) 10面ダイスを2つ振って判定します。『有利』なら【3AI】、『不利』なら【1AI】を使います。
19
+ - 後輩 (CA) 6面ダイスを2つ振って判定します。『有利』なら【3CA】、『不利』なら【1CA】を使います。
20
+ MESSAGETEXT
21
+
22
+ register_prefix('(\d+)?AI', '(\d+)?CA')
23
+
24
+ def eval_game_system_specific_command(command)
25
+ roll_action(command)
26
+ end
27
+
28
+ private
29
+
30
+ # 成功の目標値
31
+ SUCCESS_THRESHOLD = 4
32
+
33
+ # スペシャルとなる出目
34
+ SPECIAL_DICE = 6
35
+
36
+ def roll_action(command)
37
+ m = /^(\d+)?(AI|CA)$/.match(command)
38
+ return nil unless m
39
+
40
+ is_senpai = m[2] == "AI"
41
+
42
+ times = m[1]&.to_i || 2
43
+ sides = is_senpai ? 10 : 6
44
+ return nil if times <= 0
45
+
46
+ dice_list = @randomizer.roll_barabara(times, sides)
47
+ max = dice_list.max
48
+
49
+ result =
50
+ if max <= 1
51
+ Result.fumble("ファンブル(もやもやカウンターを2個獲得)")
52
+ elsif dice_list.include?(6)
53
+ me = is_senpai ? "先輩" : "後輩"
54
+ target = is_senpai ? "後輩" : "先輩"
55
+ Result.critical("スペシャル(絆カウンターを1個獲得し、#{target}は#{me}への感情を1つ獲得)")
56
+ elsif max >= SUCCESS_THRESHOLD
57
+ Result.success("成功")
58
+ else
59
+ Result.failure("失敗")
60
+ end
61
+
62
+ result.text = "(#{command}) > [#{dice_list.join(',')}] > #{result.text}"
63
+
64
+ return result
65
+ end
66
+ end
67
+ end
68
+ end