Class: BCDice::CommonCommand::Repeat
- Inherits:
-
Object
- Object
- BCDice::CommonCommand::Repeat
- Defined in:
- lib/bcdice/common_command/repeat.rb
Overview
リピート
繰り返し回数を指定して、特定のコマンドを複数回実行する例)
x5 choice[A,B,C,D] #=> `choice[A,B,C,D]`を5回実行する
rep2 CC<=75 #=> `CC<=75`を2回実行する
repeat10 2D6+5 #=> `2D6+6`を10回実行する
このコマンドを入れ子させることは許容しない。繰り返し回数の爆発に繋がるためである。以下は実行時にエラーとなる。
x10 repeat100 100D100
Constant Summary collapse
- PREFIX_PATTERN =
/(repeat|rep|x)\d+/.freeze
- REPEAT_LIMIT =
100
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(secret:, times:, trailer:) ⇒ Repeat
constructor
A new instance of Repeat.
- #roll(game_system, randomizer) ⇒ Object
Constructor Details
#initialize(secret:, times:, trailer:) ⇒ Repeat
Returns a new instance of Repeat.
55 56 57 58 59 |
# File 'lib/bcdice/common_command/repeat.rb', line 55 def initialize(secret:, times:, trailer:) @secret = secret @times = times @trailer = trailer end |
Class Method Details
.eval(command, game_system, randomizer) ⇒ Object
24 25 26 27 |
# File 'lib/bcdice/common_command/repeat.rb', line 24 def eval(command, game_system, randomizer) cmd = parse(command) cmd&.roll(game_system, randomizer) end |
Instance Method Details
#roll(game_system, randomizer) ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/bcdice/common_command/repeat.rb', line 61 def roll(game_system, randomizer) err = validate() return err if err results = Array.new(@times) do cmd = game_system.class.new(@trailer) cmd.randomizer = randomizer cmd.eval() end if results.count(nil) == @times return result_with_text("繰り返し対象のコマンドが実行できませんでした (#{@trailer})") end text = results.map.with_index(1) { |r, index| "\##{index}\n#{r.text}" }.join("\n\n") secret = @secret || results.any?(&:secret?) Result.new.tap do |r| r.secret = secret r.text = text end end |