Class: BCDice::CommonCommand::Choice
- Inherits:
-
Object
- Object
- BCDice::CommonCommand::Choice
- 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
- #expr ⇒ Object
-
#initialize(secret:, block_delimiter:, takes:, items:) ⇒ Choice
constructor
A new instance of Choice.
- #roll(randomizer) ⇒ Result
Constructor Details
#initialize(secret:, block_delimiter:, takes:, items:) ⇒ Choice
Returns a new instance of Choice.
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?
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
#expr ⇒ Object
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
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 |