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: oedit.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 'utility/log'

class Oedit < Olc
   logger "DEBUG"
   attr_accessor :default_attr, :default_hash, :default_modifiers
   def initialize(id, oid, args=nil)
	self.title = "Object Editor" if not title
	if not obj and not oid
		self.obj = GameObject.new(args, id, nil) if not oid
		self.newobj = true
	end
	super(id,oid,args)
	if not is_valid?(obj)
		ch.sendto("Not a valid editor for that object.")
		exit_olc(true)
		return
	end
	self.default_attr = [ "fixed", "light", "buried", "shovel", "ATM" ]
	self.default_hash = { 
		"worn" => [ "head","face","eyes","forehead","ears","mouth","neck","waist","back","chest","arm","arms","hand","hands","leg","legs","foot","feet","wrist" ],
		"fountain" => nil,
		"damagetype" => [ "bludgeon", "piercing", "slashing" ]
		}
	self.default_modifiers = { 
		"damage" => [ 1, 2, 3, 5, 7, 10, 15, 25, -1, -2, -3, -5, -10 ],
		"accuracy" => [ 1, 2, 3, 5, 7, 10, -1, -2, -3, -5, -7, -10 ],
		"critical" => [ 1,5,10,15,20,25 ],
		"toughness" => [ 1,2,3,4,5,7,10,13,15,17,20 ]
		}
	@cur_key = ""
	setup_main
	show_menu
   end   

   # checks for a valid object type.  Can be overridden
   # [+obj+] object to check
   # [+return+] true if valid
   def is_valid?(obj)
	if obj.is_a? GameObject
		if obj.is_a? Character or obj.is_a? Account or obj.is_a? Body or obj.is_a? BodyPart or obj.is_a? Room
			return false
		else
			return true
		end
	end
	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_text_option(nil,"Aliases",self,:setup_aliases, obj.aliases)
	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,"Attr Values",self,:setup_val_menu,obj.val)
	menu.add_text_option(nil,"Modifiers",self,:setup_modifier_menu, obj.modifier)
	menu.add_std_option(nil,"Weight",obj.weight,self,:set_weight)
	menu.add_std_option(nil,"Cost",obj.cost,self,:set_cost)
   end

   # Setup Alias menu
   # [+m+] Unused
   def setup_aliases(m=nil)
	smenu = olc_basemenu("Aliases",self,:setup_aliases, m)
	smenu.add_numbered_option(obj.aliases,nil,nil);
	smenu.add_text_option("D#","Delete Alias #",self,:del_alias);
	smenu.add_std_option(nil,"Add New Alias",nil,self,:add_alias);
	submenu(smenu,m)
   end

  # Setup attributes menu
  # [+m+] Unused
  def setup_attr_menu(m=nil)
	smenu = olc_basemenu("Attributes",self, :setup_attr_menu, m)
	default_attr.each { |a| smenu.add_default_item(a) }
	smenu.set_array = obj.attributes
	smenu.add_toggled_numbered_options(self, :toggle_attr)
	smenu.add_text_option("D#","Delete Attribute #",self,:del_attr)
	smenu.add_std_option(nil,"Add New Attribute",nil,self,:add_attr)
	submenu(smenu, m)
  end

  # Modifiers menu
  def setup_modifier_menu(m=nil)
	smenu = olc_basemenu("Modifiers", self, :setup_modifier_menu, m)
	smenu.default_hash = default_modifiers
	smenu.add_hash_numbered_options(obj.modifier, self, :pick_mod)
	smenu.add_text_option("D#","Delete Modifier #", self, :del_mod)
	smenu.add_std_option(nil,"Add new modifier value",nil, self, :add_mod)
	submenu(smenu, m)
  end

   def setup_val_menu(m=nil)
	smenu = olc_basemenu("Attribute Values", self, :setup_val_menu, m)
	smenu.default_hash = default_hash.dup
	smenu.add_hash_numbered_options(obj.val, self, :pick_val)
	smenu.add_text_option("D#","Delete Attr Value #", self, :del_val)
	smenu.add_std_option(nil,"Add New Attribute Value",nil,self,:add_val)
	submenu(smenu, m)
   end

   def pick_val(m=nil)
	hash_array = menu.get_hash_keys
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= hash_array.size
			@cur_key = hash_array[idx-1]
			smenu = olc_basemenu("Attribute Values [#{@cur_key}] - Set Value", self, :pick_val,m)
			current = ""
			if obj.val.has_key? @cur_key
				current = obj.val[@cur_key]
			end
			if default_hash.has_key? @cur_key
				if default_hash[@cur_key] == nil
					smenu.add_std_option(nil,"Enter a value",0,self,:set_default_val)
				else
					smenu.add_numbered_option(default_hash[@cur_key], self, :pick_default_val)
				end
			end
			smenu.add_std_option(nil,"Set new value",current, self, :set_new_val)
			submenu(smenu,m)
		end
	else
		smenu = olc_basemenu("Attribute Values - Set Value", self, :pick_val,m)
		smenu.add_numbered_option(default_hash[@cur_key], self, :pick_default_val)
		smenu.add_std_option(nil,"Set new value",obj.val[@cur_key], self, :set_new_val)
		submenu(smenu,m)
	end
   end

   def pick_mod(m=nil)
	hash_keys = menu.get_hash_keys
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= hash_keys.size
			@cur_key = hash_keys[idx-1]
			smenu = olc_basemenu("Modifiers [#{@cur_key}] - Set Value", self, :pick_mod,m)
			current = ""
			if obj.modifier.has_key? @cur_key
				current = obj.modifier[@cur_key]
			end
			if default_modifiers.has_key? @cur_key
				smenu.add_numbered_option(default_modifiers[@cur_key], self, :pick_default_mod)
			end
			smenu.add_std_option(nil,"Set new value",current, self, :set_new_mod)
			submenu(smenu,m)
		end
	else
		smenu = olc_basemenu("Modifiers [#{@cur_key}] - Set Value", self, :pick_mod,m)
		smenu.add_numbered_option(default_modifiers[@cur_key], self, :pick_default_mod)
		smenu.add_std_option(nil,"Set new value",current, self, :set_new_mod)
		submenu(smenu,m)
	end
   end
   
   def pick_default_mod(m)
	mods = default_modifiers[@cur_key]
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= mods.size
			obj.add_modifier(@cur_key, mods[idx-1])
		end
	end
	quit_menu
   end

   def pick_default_val(m)
	vals = default_hash[@cur_key]
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= vals.size
			obj.add_val(@cur_key, vals[idx-1])
		end
	end
	quit_menu
   end

   def set_default_val(m)
	if m=~/^\d+$/
		obj.add_val(@cur_key, m.to_i)
	else
		obj.add_val(@cur_key, m)
	end
	show_menu
	m
   end

   def set_new_mod(m)
	m.strip!
	if m=~/^\d+$/
		obj.add_modifier(@cur_key, m.to_i)
	else
		obj.add_modifier(@cur_key, m)
	end
	show_menu
	m
   end

   def set_new_val(m)
	m.strip!
	if m=~/^\d+$/
		obj.add_val(@cur_key, m.to_i)
	else
		obj.add_val(@cur_key, m)
	end
	show_menu
	m
   end

   def del_mod(m)
	hash_keys = menu.get_hash_keys
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= hash_keys.size
			if obj.has_modifier? hash_keys[idx-1]
				obj.del_modifier(hash_keys[idx-1])
			end
		end
	end
	menu.active_hash = obj.modifier
	show_menu
	obj.modifier
   end

   def del_val(m)
	hash_keys = menu.get_hash_keys
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= hash_keys.size
			if obj.has_val? hash_keys[idx-1]
				obj.del_val(hash_keys[idx-1])
			end
		end
	end
	menu.active_hash = obj.val
	show_menu
	obj.val
   end

   def add_mod(m)
	if not obj.has_modifier? m
		obj.add_modifier(m,"")
		menu.active_hash = obj.modifier
		show_menu
		obj.modifier
	end
   end

   def add_val(m)
	if not obj.has_val? m
		obj.add_val(m,"")
		menu.active_hash = obj.val
		show_menu
		obj.val
	end
   end

   def toggle_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
			obj.toggle_attribute(attrs[idx-1])
		end
	end
	show_menu
   end

   def add_attr(m)
	obj.add_attribute(m.strip)
	show_menu
	obj.attributes
   end

   def del_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
			obj.del_attribute(attrs[idx-1])
			menu.set_array.delete(attrs[idx-1])
		end
	end
	show_menu
   end

   def add_alias(m)
	obj.aliases << m
	show_menu
	nil
   end

   def del_alias(m)
	if m=~/(\d+)/
		idx = $1.to_i
		if idx > 0 and idx <= obj.aliases.size
			obj.aliases.delete obj.aliases[idx-1]
		end
	end
	show_menu
	nil
   end

   # Sets Objectname
   # [+name+] Name to set it as
   def set_name(name)
	obj.name = name
	show_menu
	name
   end

   def set_weight(weight)
	obj.weight = weight.to_i	
	show_menu
	obj.weight
   end

   def set_cost(cost)
	obj.cost = cost.to_i
	show_menu
	obj.cost
   end

   def set_desc(desc)
	obj.desc = desc.chomp
	show_menu
	obj.desc
   end

end