module Fbe::Award::BTerm
def abstract?
def abstract? false end
def bill_to(bill)
def bill_to(bill) case @op when :award @operands.each do |o| o.bill_to(bill) rescue StandardError => e raise "Failure in #{o}: #{e.message}" end when :aka @operands[0..-2].each do |o| o.bill_to(bill) rescue StandardError => e raise "Failure in #{o}: #{e.message}" end when :let, :set bill.set(@operands[0], to_val(@operands[1], bill)) when :give text = @operands[1] text = '' if text.nil? bill.line(to_val(@operands[0], bill), text) when :explain, :in # nothing, just ignore else raise "Unknown term '#{@op}'" end end
def calc(bill)
def calc(bill) case @op when :total bill.points when :if to_val(@operands[0], bill) ? to_val(@operands[1], bill) : to_val(@operands[2], bill) when :and @operands.all? { |o| to_val(o, bill) } when :or @operands.any? { |o| to_val(o, bill) } when :not !to_val(@operands[0], bill) when :eq to_val(@operands[0], bill) == to_val(@operands[1], bill) when :lt to_val(@operands[0], bill) < to_val(@operands[1], bill) when :lte to_val(@operands[0], bill) <= to_val(@operands[1], bill) when :gt to_val(@operands[0], bill) > to_val(@operands[1], bill) when :gte to_val(@operands[0], bill) >= to_val(@operands[1], bill) when :div to_val(@operands[0], bill) / to_val(@operands[1], bill) when :times to_val(@operands[0], bill) * to_val(@operands[1], bill) when :plus to_val(@operands[0], bill) + to_val(@operands[1], bill) when :minus to_val(@operands[0], bill) - to_val(@operands[1], bill) when :max [to_val(@operands[0], bill), to_val(@operands[1], bill)].max when :min [to_val(@operands[0], bill), to_val(@operands[1], bill)].min when :between v = to_val(@operands[0], bill) a = to_val(@operands[1], bill) b = to_val(@operands[2], bill) min, max = [a, b].minmax return 0 if (!v.negative? && v < min) || (!v.positive? && v > max) v.clamp(min, max) else raise "Unknown term '#{@op}'" end end
def static?
def static? true end
def to_s
def to_s "(#{@op} #{@operands.join(' ')})" end
def to_val(any, bill)
def to_val(any, bill) if any.is_a?(BTerm) any.calc(bill) elsif any.is_a?(Symbol) v = bill.vars[any] raise "Unknown name '#{any}' among [#{bill.vars.keys.join(', ')}]" if v.nil? v else any end end