Class: BCDice::CommonCommand::Choice

Inherits:
Object
  • Object
show all
Defined in:
lib/bcdice/common_command/choice.rb

Overview

チョイスコマンド

列挙された項目の中から一つを選んで出力する。

フォーマットは以下の通りchoice choice(A,B,C,D) choice A B C D choice(新クトゥルフ神話TRPG, ソード・ワールド2.5, Dungeons & Dragons)

“choice”の次の文字によって区切り文字が変化する

"[" -> "," で区切る
"(" -> "," で区切る
" " -> /\s+/ にマッチする文字列で区切る

各項目の前後に空白文字があった場合は除去される

choice[A, B,  C , D   ] は choice[A,B,C,D] と等価

項目が空文字列である場合、その項目は無視する

choice[A,,C] は choice[A,C] と等価

フォーマットを選ぶことで、項目の文字列に()や,を含めることができる

choice A,B X,Y -> "A,B" と "X,Y" から選ぶ
choice(A[], B[], C[]) -> "A[]", "B[]", "C[]" から選ぶ
choice[A(), B(), C()] -> "A()", "B()", "C()" から選ぶ

“choice”の後に数を指定することで、列挙した要素から重複なしで複数個を選ぶ

choice2[A,B,C] -> "A", "B", "C" から重複なしで2個選ぶ

指定したい要素が「AからD」のように連続する項目の場合に「A-D」と省略して記述できる略記の展開はアルファベット1文字もしくは数字の範囲に限り、略記1つを指定したときのみ展開される

choice[A-D] -> choice[A,B,C,D] と等価
choice[b-g] -> choice[b,c,d,e,f,g] と等価
choice[3-7] -> choice[3,4,5,6,7] と等価
choice[A-D,Z] -> 展開されない。 "A-D", "Z" から選ぶ
choice[D-A] -> 展開されない。

Defined Under Namespace

Modules: BlockDelimiter

Constant Summary collapse

PREFIX_PATTERN =
/choice/.freeze
DELIMITER =
{
  bracket: /,/,
  paren: /,/,
  space: /\s+/,
}.freeze
DELIMITER_CHAR =
{
  bracket: ", ",
  paren: ", ",
  space: " ",
}.freeze
TERMINATION =
{
  bracket: /\]/,
  paren: /\)/,
  space: /$/,
}.freeze
SUFFIX =
{
  bracket: "]",
  paren: ")",
  space: "",
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(secret:, block_delimiter:, takes:, items:) ⇒ Choice

Returns a new instance of Choice.

Parameters:



185
186
187
188
189
190
# File 'lib/bcdice/common_command/choice.rb', line 185

def initialize(secret:, block_delimiter:, takes:, items:)
  @secret = secret
  @block_delimiter = block_delimiter
  @takes = takes
  @items = items
end

Class Method Details

.eval(command, _game_system, randomizer) ⇒ Result?

Parameters:

Returns:



81
82
83
84
# File 'lib/bcdice/common_command/choice.rb', line 81

def eval(command, _game_system, randomizer)
  cmd = parse(command)
  cmd&.roll(randomizer)
end

Instance Method Details

#exprObject



214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/bcdice/common_command/choice.rb', line 214

def expr
  takes = @takes == 1 ? nil : @takes

  case @block_delimiter
  when BlockDelimiter::SPACE
    "choice#{takes} #{@items.join(' ')}"
  when BlockDelimiter::BRACKET
    "choice#{takes}[#{@items.join(',')}]"
  when BlockDelimiter::PAREN
    "choice#{takes}(#{@items.join(',')})"
  end
end

#roll(randomizer) ⇒ Result

Parameters:

Returns:



194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/bcdice/common_command/choice.rb', line 194

def roll(randomizer)
  if @items.size > 100
    return Result.new("項目数は100以下としてください")
  end

  items = @items.dup
  chosens = []
  @takes.times do
    index = randomizer.roll_index(items.size)
    chosens << items.delete_at(index)
  end

  Result.new.tap do |r|
    chosen = chosens.join(DELIMITER_CHAR[@block_delimiter])

    r.secret = @secret
    r.text = "(#{expr()}) > #{chosen}"
  end
end