znmud-0.0.1/benchmark/
znmud-0.0.1/cmd/
znmud-0.0.1/cmd/emotes/
znmud-0.0.1/cmd/objects/
znmud-0.0.1/cmd/tiny/
znmud-0.0.1/doc/
znmud-0.0.1/farts/
znmud-0.0.1/lib/
znmud-0.0.1/lib/combat/
znmud-0.0.1/lib/core/bodytypes/
znmud-0.0.1/lib/engine/
znmud-0.0.1/lib/farts/
znmud-0.0.1/logs/
# File: redit.rb
# Author: Craig Smith
# Version: 0.2
# This source code copyright (C) 2009 Craig Smith
# All rights reserved.
#
# Released under the terms of the GNU Public License
# See COPYING file for additional information.
#


require 'olc/oedit'
require 'utility/log'

class Redit < Oedit
   logger "DEBUG"

   def initialize(id, oid, args=nil)
	self.title = "Room Editor" if not title
	if not obj and not oid
		self.obj = Room.new(args, id) if not oid
		self.newobj = true
	end
	super(id,oid,args)
	self.default_attr = [ "inside", "bright", "dark", "no_mobile", "peaceful", "savepoint" ]
	self.default_modifiers = { "mp" => [0, 1, 2, 3, 4, 5, 6, 7, 10, 15, 20] }
	@exit_action = nil
	@exit_id = nil
	@exit_name = nil
	@exit_toroom = nil
	@door_name = nil
	@door_state = 0
	@door_key = nil
	@exit_link = nil
	@default_exits = [ "north","south","east","west","up","down" ]
	@door_states = [ "NO_DOOR", "OPEN", "CLOSED", "LOCKED" ]
	@default_exit_flags = [ "no_bash", "pickproof" ]
	@exit_flags = []
   end   

   # Checks if the object is valid
   def is_valid?(obj)
	return true if obj.kind_of? Room
	false
   end

   # setup main menu
   def setup_main(m=nil)
	self.menu = olc_basemenu(title, self, :setup_main)
	menu.add_std_option(nil,"Name",obj.name,self,:set_name)
	menu.add_editor_option(nil,"Description",obj.desc,self,:set_desc)
	menu.add_text_option(nil,"Attributes",self,:setup_attr_menu,obj.attributes)
	menu.add_text_option(nil,"Modifiers",self,:setup_modifier_menu, obj.modifier)
	menu.add_text_option(nil,"Exits",self,:exit_menu, obj.exits.size)
   end

   # Exit Menu
   def exit_menu(m=nil)
	case @exit_action
	when "new"
		if @exit_name and @exit_toroom
			e = Exit.new(@exit_name, id, obj.id, @exit_toroom)
			e.door_name = @door_name if @door_name
			e.linked_exit = @exit_linked if @exit_linked
			e.door_state = @door_state if not @door_state == 0
			e.required_key = @required_key if @required_key
			e.attributes = @exit_flags
			obj.exits << e.id
			put_object(e)
			@exit_action = nil
			@exit_name = nil
			@exit_toroom = nil
			@door_name = nil
			@exit_linked = nil
			@door_state = 0
			@requied_key = nil
			@exit_flags = []
		end
	when "edit"
		if @exit_id
			ex = get_object(@exit_id)		
			ex.name = @exit_name
			ex.to_room = @exit_toroom
			ex.door_name = @door_name if @door_name
			ex.linked_exit = @exit_linked if @exit_linked
			ex.door_state = @door_state if not @door_state == nil
			ex.required_key = @required_key if @required_key
			ex.attributes = @exit_flags
			@exit_action = nil
			@exit_name = nil
			@exit_toroom = nil
			@exit_id = nil
			@door_name = nil
			@exit_linked = nil
			@door_state = nil
			@requied_key = nil
			@exit_flags = []
		end
	end
	smenu = olc_basemenu("Exits",self,:exit_menu, m)
	exit_names = []
	obj.exits.each do |exid|
		exit_names << get_object(exid).name
	end
	smenu.add_numbered_option(exit_names,self, :pick_exit)
	smenu.add_text_option("D#","Delete an exit by #", self, :del_exit)
	smenu.add_text_option(nil,"Add new exit", self, :add_exit)
	submenu(smenu,m)
   end

   # Pick an existing exit
   def pick_exit(m=nil)
	exit_names = []
	obj.exits.each { |exid| exit_names << get_object(exid).name }
	idx = m.to_i
	if idx > 0 and idx <= exit_names.size
		obj.exits.each do |exid|
			ex = get_object(exid)
			if exit_names[idx-1] == ex.name
				@exit_action = "edit"
				@exit_id = exid
				load_exit_data(ex)
			end
		end
		edit_exit
	end
   end

   # Deletes an existing exit
   def del_exit(m=nil)
	if m=~/(\d+)/
		idx = $1.to_i
	else
		return
	end
	exit_names = []
	obj.exits.each { |exid| exit_names << get_object(exid).name }
	if idx > 0 and idx <= exit_names.size
		obj.exits.each do |exid|
			ex = get_object(exid)
			if exit_names[idx-1] == ex.name
				obj.exits.delete(ex.id)
			end
		end
	end
   end

   # Add a new exit
   def add_exit(m=nil)
	@exit_action = "new"
	edit_exit
   end

   # setup exit data
   # [+exitobj+] Loads an exit object into class globals to edit
   def load_exit_data(exitobj)
	@exit_name = exitobj.name
	@exit_toroom = exitobj.to_room
	@door_name = exitobj.door_name
	@exit_linked = exitobj.linked_exit
	@door_state = exitobj.door_state
	@required_key = exitobj.required_key
	@exit_flags = exitobj.attributes
   end

   # Edits exit info stored in class globals
   def edit_exit(m=nil)
	smenu = olc_basemenu("Edit Exit",self,:edit_exit, m)
	smenu.add_text_option(nil,"Exit Name", self, :set_exit_name, @exit_name)
	smenu.add_std_option(nil,"Exit to room",@exit_toroom, self, :set_exit_toroom)
	smenu.add_text_option(nil,"Exit Attributes",self,:exit_attr_menu, @exit_flags)
	smenu.add_std_option(nil,"Door Name", @door_name, self, :set_door_name)
	smenu.add_text_option(nil, "Set Door state", self, :set_door_state, @door_states[@door_state])
	smenu.add_std_option(nil,"Requires key <#oid>", @required_key, self, :set_required_key)
	smenu.add_std_option(nil,"Linked exit (internal)",@exit_linked, self, :set_linked_exit)
	submenu(smenu, m)
   end

  # Setup Exit attributes menu
  # [+m+] Unused
  def exit_attr_menu(m=nil)
	smenu = olc_basemenu("Exit Attributes",self, :exit_attr_menu, m)
	@default_exit_flags.each { |a| smenu.add_default_item(a) }
	smenu.set_array = @exit_flags
	smenu.add_toggled_numbered_options(self, :toggle_exit_attr)
	smenu.add_text_option("D#","Delete Exit Attribute #",self,:del_exit_attr)
	smenu.add_std_option(nil,"Add New Exit Attribute",nil,self,:add_exit_attr)
	submenu(smenu, m)
  end

   def toggle_exit_attr(m)
	attrs = menu.default_array.concat(menu.set_array)
	attrs.uniq!
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= attrs.size
			if @exit_flags.include?(attrs[idx-1])
				@exit_flags.delete(attrs[idx-1])
			else
				@exit_flags << attrs[idx-1]
			end
		end
	end
	show_menu
   end

   def add_exit_attr(m)
	@exit_flags << (m.strip) if not @exit_flags.include?(m.strip)
	show_menu
	@exit_flags
   end

   def del_exit_attr(m)
	attrs = menu.default_array.concat(menu.set_array)
	attrs.uniq!
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= attrs.size
			@exit_flags.delete(attrs[idx-1])
			menu.set_array.delete(attrs[idx-1])
		end
	end
	show_menu
   end
   
   def set_exit_name(m=nil)
	smenu = olc_basemenu("Exit Name",self,:set_exit_name, m)
	smenu.add_numbered_option(@default_exits, self, :pick_default_name)
	smenu.add_std_option(nil,"Add new exit name",nil,self,:add_new_exit_name)
	submenu(smenu,m)
   end

   def set_door_state(m=nil)
	smenu = olc_basemenu("Door States", self, :set_door_state, m)
	smenu.add_numbered_option(@door_states, self, :pick_door_state)
	submenu(smenu,m)
   end

   def set_exit_toroom(m)
	toroom = m.to_i
	if toroom > 0
		@exit_toroom = toroom if get_object(toroom).kind_of? Room
	end
	show_menu
	@exit_toroom
   end

   def pick_default_name(m)
	idx = m.to_i
	if idx > 0 and idx <= @default_exits.size
		@exit_name = @default_exits[idx-1]
	end
	quit_menu
	@exit_name
   end

   def add_new_exit_name(m)
	@exit_name = m if m.size > 0
	show_menu
	@exit_name
   end

   def set_door_name(m)
	@door_name = m if m.size > 0
	show_menu
	@door_name
   end

   def pick_door_state(m)
	idx = m.to_i
	if idx > 0 and idx <= @door_states.size
		@door_state = idx-1
	end
	quit_menu
	@door_state
   end

   def set_required_key(m)
	kid = m.to_i
	@required_key = kid if kid > 0
	show_menu
	@required_key
   end

   def set_linked_exit(m)
	toexit = m.to_i
	if toexit > 0
		@exit_linked = toexit if get_object(toexit).kind_of? Exit
	end
	show_menu
	@exit_linked
   end
end