tmud-3.0.0/benchmark/
tmud-3.0.0/cmd/
tmud-3.0.0/cmd/objects/
tmud-3.0.0/cmd/tiny/
tmud-3.0.0/doc/SQLite/
tmud-3.0.0/doc/SQLite3/
tmud-3.0.0/doc/TernaryTrie/
tmud-3.0.0/farts/
tmud-3.0.0/lib/
tmud-3.0.0/lib/engine/
tmud-3.0.0/lib/farts/
tmud-3.0.0/logs/
#
# file::    script.rb
# author::  Jon A. Lambert
# version:: 2.8.0
# date::    02/19/2006
#
# This source code copyright (C) 2005, 2006 by Jon A. Lambert
# All rights reserved.
#
# Released under the terms of the TeensyMUD Public License
# See LICENSE file for additional information.
#
$:.unshift "lib" if !$:.include? "lib"
$:.unshift "vendor" if !$:.include? "vendor"

require 'utility/log'
require 'core/root'
require 'farts/farts_parser'
require 'utility/boolexp'

# The Script class defines te characteristic of an executable program.
#
class Script < Root
  property :language, :src
  attr_accessor :prog
  logger 'DEBUG'

  # Create a new Script
  # [+name+]     The filename of the script
  # [+owner+]    The owner id of this script
  # [+language+] The language of the script
  # [+return+]   A handle to the new Object
  def initialize(name, owner, language)
    super(name, owner)
    self.language = language
    @prog = nil
  end

  # Load a program
  # [+return+]   success or failure
  def load(str=nil)
    case language
    when :boolexp
      self.src = str
      log.info "Load of BoolExp program - #{name}"
      true
    when :fart
      File.open("farts/#{name}.fart") {|f|
        self.src = f.read
      }
      log.info "Load of FART program - #{name}"
      true
    else
      false
    end
  end

  # Compile a program
  # [+return+]   success or failure
  def compile
    case language
    when :boolexp
      true
    when :fart
      @prog = Farts::Parser.new.parse(src)
      log.info "Compile of FART program - #{name}"
      true
    else
      false
    end
  rescue Exception
    log.error $!
    @prog = nil
    false
  end

  # Execute a program
  # [+return+]   success or failure
  def execute(ev)
    case language
    when :boolexp
      actor = get_object(ev.from)
      BoolExpParser.new(actor).parse(src)
    when :fart
      vars = {}
      vars['actor'] = get_object(ev.from)
      vars['this'] = get_object(ev.to)
      if ev.msg.kind_of?(GameObject)
        vars['args'] = get_object(ev.msg)
      else
        vars['args'] = ev.msg
      end
      load if !@prog
      compile if !@prog
      @prog ? @prog.execute(vars) : false
    else
      false
    end
  rescue Exception
    log.error $!
    false
  end

end