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()" から選ぶ

Defined Under Namespace

Modules: BlockDelimiter

Constant Summary collapse

PREFIX_PATTERN =
/choice/.freeze
DELIMITER =
{
  bracket: /,/,
  paren: /,/,
  space: /\s+/,
}.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:, items:) ⇒ Choice

Returns a new instance of Choice.

Parameters:



123
124
125
126
127
# File 'lib/bcdice/common_command/choice.rb', line 123

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

Class Method Details

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

Parameters:

Returns:



64
65
66
67
# File 'lib/bcdice/common_command/choice.rb', line 64

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

Instance Method Details

#exprObject



141
142
143
144
145
146
147
148
149
150
# File 'lib/bcdice/common_command/choice.rb', line 141

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

#roll(randomizer) ⇒ Result

Parameters:

Returns:



131
132
133
134
135
136
137
138
139
# File 'lib/bcdice/common_command/choice.rb', line 131

def roll(randomizer)
  index = randomizer.roll_index(@items.size)
  chosen = @items[index]

  Result.new.tap do |r|
    r.secret = @secret
    r.text = "(#{expr()}) > #{chosen}"
  end
end