CoralMUD-0.26/
CoralMUD-0.26/core/
CoralMUD-0.26/data/
CoralMUD-0.26/data/help/
CoralMUD-0.26/data/socials/
CoralMUD-0.26/lib/automap/
CoralMUD-0.26/lib/items/
class Item
  attr_accessor :type_attributes
  define_creatable
  define_editor :item_editor
  define_editor_field({:name=>"vtag", :filter=>:filt_to_tag, :type=>:vtag})
  define_editor_field({:name=>"zone", :filter=>:filt_to_area, :type=>:namespace})
  define_editor_field({:name=>"name", :filter=>:filt_none})
  define_editor_field({:name=>"type", :filter=>:filt_to_itype, 
    :proc_fun=>proc do |ed, ch, obj, arg| 
      found = obj.type_attributes.collect {|att| att.type}

      filtered = (arg.collect {|att| found.include?(att.type) ? nil : att}).compact

      if filtered.empty?
        ch.view "Type already exists on this item." + ENDL
      else
        obj.type_attributes += filtered
        ch.view "Attribute added." + ENDL
      end
    end,
    :display=>proc do |obj|
      types = obj.types
      ["#{mxptag("send type prompt")}#R[#Wtype#R]:#{mxptag('/send')} #n#{if types.empty? then "[none]" else types end}"]
    end
  })

  define_editor_field({:name=>"v",:filter=>:filt_none, :arg_type=>:arg_str,
    :proc_fun=> lambda do |ed, ch, obj, arg|
      args = arg.multi_args

      i = Integer(args[0]) rescue nil

      if i == nil
        ch.view "Not a valid item property." + ENDL
        return
      end

      found = obj.type_attributes[i-1]

      if found == nil
        ch.view "Not a valid item property." + ENDL
        return
      end

      if args[1] == "delete"
        # then we delete this type right now.
        obj.type_attributes.delete_at(i-1) # done
        ch.view "Item property deleted." + ENDL
        return
      end
      
      ch.editing.unshift(found) # edit the one found.
      ch.view "Editing item property." + ENDL
    end,

    :display=>proc do |obj|
      arr = []
      count = 0
      obj.type_attributes.each do |att|
        count += 1
        arr << ["#{mxptag("send v#{count}")}#R[#Wv#{count}#R]:#{mxptag('/send')}#n #{mxptag("send 'v#{count} delete'")}#R[#Wv#{count} delete#R]#n#{mxptag('/send')} #{att.to_s}"]
      end
      arr << ("#R==========================================================================#n")
      arr.flatten
    end
  })

  define_editor_field({:name=>"resets",:filter=>:filt_to_reset,
    :proc_fun=>lambda do |ed, ch, obj, arg|
      command = arg[0] # already correct format.  Guarenteed to be a valid direction 0-5.
      argument = arg[1] # What to do that direction.

      case command.downcase
        when "delete"
          # argument should be a valid number in this case.
          argument = Integer(argument) rescue nil
          if argument == nil || !obj.reset_list[argument]
            ch.view "reset delete [number]" + ENDL
            return
          end
          obj.reset_list.delete_at(argument)
          ch.view "Reset deleted." + ENDL
        when "edit"
          # argument should be a valid number in this case.
          argument = Integer(argument) rescue nil

          if argument == nil || !obj.reset_list[argument]
            ch.view "resets edit [number]" + ENDL
            return
          end

          ch.editing.unshift(obj.reset_list[argument])
          ch.view "Editing reset." + ENDL
        when "add"
          if argument == nil
            ch.view "resets add [npc or item vtag]" + ENDL
            return
          end
          found = Tag.find_any_obj(argument)
          if found && (found[0].is_a?(NPC) || found[0].is_a?(Item))
            found = found[0]
          else
            ch.view "That's not a valid room." + ENDL
            return
          end
          obj.create_reset(found.id)
          ch.view "Reset added." + ENDL
        else ch.view "#{command} wasn't valid." +ENDL + "Did you mean: add or edie?" + ENDL
      end
    end,
    :display=>proc do |obj|
      arr = [mxptag("send 'resets add' prompt") + "#R[#Wresets add#R]:" + mxptag('/send') + "   resets add [vtag] "]
      count = 0
      obj.reset_list.each do |r|
        arr << [mxptag("send 'resets edit #{count}'") + "#R( [#Wresets edit #{count}#R]#{mxptag('/send')}#n #{IDN.lookup(r.target)}"]
        count += 1
      end
      arr
    end
  })


  def self.create ch
    item = self.new
    item.namespace = ch.in_room.namespace  # have to set it so gen_generic_tag will work correctly.
    item.assign_tag Tag.gen_generic_tag(item), ch.in_room.namespace
    item.gen_idn
    return item
  end
end