Class: BCDice::CommonCommand::Repeat

Inherits:
Object
  • Object
show all
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

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