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/
$room_flags = [:hidden]

class Room
  define_creatable
  define_editor :room_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"})
  define_editor_field({:name=>"sector", 
    :proc_fun=>lambda do |ed, ch, obj, arg|
      found = Sector.lookup(arg)
  
      # if it's not found, then we should print a list of sectors.
      if !found
        ch.view "Valid sectors: " + ENDL
        Sector.list.each do |sect|
          ch.view sect.to_s + ENDL
        end
        return
      end

      obj.sector = found.symbol
    end,

    :display=>proc do |obj|
      ["#{mxptag('send sector')}#R[#Wsector#R]:#{mxptag('/send')}#n            "+obj.sector]
    end
  })


  define_editor_field({:name=>"flags", :filter=>:filt_to_flag, :filter_key=>$room_flags, :type=>:flags})

  define_editor_field({:name=>"description",:arg_type=>:arg_none,
    :proc_fun=>proc do |ed, ch, obj, arg|
      ch.editing.unshift(obj.desc)
      ch.view "Editing description." + ENDL
    end,

    :display=>proc do |obj|
      ["#{mxptag('send description')}#R[#Wdescription#R]:#{mxptag('/send')}","#n"+obj.desc,"----"]
    end
  })
  define_editor_field({:name=>"exit", :filter=>:filt_to_exit,
    # proc exits.  I wrote it out like this because it was difficult to read.
    # What do we do when exits command is accessed?  It's filtered by filt_to_exit.  
    :proc_fun=>lambda do |ed, ch, obj, arg|
      direction = arg[0] # already correct format.  Guarenteed to be a valid direction 0-5.
      command = arg[1] # What to do that direction.

      case command.downcase
        when "edit" then ch.editing.unshift(obj.exit_list[direction]); ch.view "Editing exit." + ENDL
        when "link" then ch.view "This is not yet supported." + ENDL 
        when "dig" 
          supplied = nil
          if arg[2]
            supplied = Tag.find_any_obj arg[2]
            if supplied && supplied[0].is_a?(Room)
              supplied = supplied[0]
            else
              ch.view "That's not a valid room." + ENDL
              return
            end
          end
          temp_in_room = ch.in_room
          ch.in_room = obj
          if supplied
            r = ch.buildwalk(direction, supplied)
          else
            r = ch.buildwalk(direction)
          end
          ch.in_room = temp_in_room
          if r
            ch.view "Room created with a two way link." + ENDL
            #ch.editing.unshift(obj.exit_list[direction]);
          end
        else ch.view "#{command} wasn't valid." +ENDL + "Did you mean: edit, link, or dig?" + ENDL
      end
    end,
    # proc to define how we display this field.   It's only needed because we have a non-generic field.
    # Note that if we didn't include this it would not be displayed at all.
    :display=>proc do |obj|
      str = ["#YExit parameters: [edit, dig, link]#n"]
      4.times do |i|
        ex = obj.exit_list[i]
        if ex
          str << (("%-20s" % "#R[#{mxptag('send "&text;"')}#Wexit #{i.exit_code_to_s} edit#{mxptag('/send')}#R]: #{ex.to_s}#w"))
        else
          str << (("%-20s" % "#R[#{mxptag('send "&text;"')}#Wexit #{i.exit_code_to_s} dig#{mxptag('/send')}#R])#w"))
        end
      end
      str << ("#R==========================================================================#n")
      str
    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 << ("#R==========================================================================#n")
      arr
    end
  })

  # add delete option
  define_editor_field({:name=>"delete", :arg_type=>:arg_none, :filter=>:filt_none,
    :proc_fun=>proc do |ed, ch, obj, arg|
      ch.execute_command("done") # leave the editor just in time.
      obj.do_delete # rely on the object to implement a way to delete it.
    end,
    :display=>proc do |obj|
      [mxptag('send delete')+ "#R[#WDELETE#R]:" + mxptag('/send') + "       Deletes Entire Room"]
    end
  })
end