Class: TableScript::TableEntryEnvironment

Inherits:
Object
  • Object
show all
Defined in:
lib/tablescript/table_entry_environment.rb

Instance Method Summary collapse

Constructor Details

#initialize(table_name, roller) ⇒ TableEntryEnvironment

Returns a new instance of TableEntryEnvironment.



22
23
24
25
26
# File 'lib/tablescript/table_entry_environment.rb', line 22

def initialize( table_name, roller )
  @table_name = table_name
  @roller = roller
  @entries = []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_id, *args) ⇒ Object



98
99
100
# File 'lib/tablescript/table_entry_environment.rb', line 98

def method_missing( method_id, *args )
  raise "Undefined command '#{method_id}' in table #{@table_name}"
end

Instance Method Details

#dice_to_rollObject



64
65
66
# File 'lib/tablescript/table_entry_environment.rb', line 64

def dice_to_roll
  "d#{@entries.size}"
end

#dynamic(*args, &blk) ⇒ Object Also known as: d



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/tablescript/table_entry_environment.rb', line 47

def dynamic( *args, &blk )
  if args.empty?
    @entries << TableEntry.new( blk )
  else
    count = args.shift
    if count.is_a?(Integer)
      entry = TableEntry.new( blk )
      1.upto count do
        @entries << entry
      end
    end
    raise "Too many parameters for d in table #{@table_name}" unless args.empty?
  end
end

#fixed(*args, &blk) ⇒ Object Also known as: f



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/tablescript/table_entry_environment.rb', line 28

def fixed( *args, &blk )
  if args.empty?
    @entries << TableEntry.new( blk )
  else
    roll = args.shift
    if roll.is_a?(Integer)
      @entries[ roll - 1 ] = TableEntry.new( blk )
    elsif roll.class == Range
      entry = TableEntry.new( blk )
      roll.each do |i|
        @entries[ i - 1 ] = entry
      end
    end
    raise "Too many parameters for f in table #{@table_name}" unless args.empty?
  end
end

#lookup(index) ⇒ Object



68
69
70
71
# File 'lib/tablescript/table_entry_environment.rb', line 68

def lookup( index )
  raise "No table entry for a roll of #{index}." if ( index <= 0 or index > @entries.size )
  @entries[ index - 1 ].evaluate( index )
end

#rerollObject



73
74
75
76
# File 'lib/tablescript/table_entry_environment.rb', line 73

def reroll
  rolled_value = @roller.roll( dice_to_roll )
  lookup( rolled_value )
end

#reroll_and_ignore(*args) ⇒ Object



78
79
80
81
82
# File 'lib/tablescript/table_entry_environment.rb', line 78

def reroll_and_ignore( *args )
  validate_ignored_values( args )
  rolled_value = @roller.roll_and_ignore( dice_to_roll, args )
  lookup( rolled_value )
end

#reroll_and_ignore_duplicates(times, *args) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/tablescript/table_entry_environment.rb', line 84

def reroll_and_ignore_duplicates( times, *args )
  ignored_entries = entries_from_ignored_values( args )
  evaluated_rolled_entries = []
  until evaluated_rolled_entries.size == times do
    rolled_value = @roller.roll( dice_to_roll )
    rolled_entry = @entries[ rolled_value - 1 ]
    unless ignored_entries.include? rolled_entry
      ignored_entries << rolled_entry
      evaluated_rolled_entries << rolled_entry.evaluate( rolled_value )
    end
  end
  evaluated_rolled_entries
end