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: medit.rb
# Author: Craig Smith
# 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'

# Mobile Editor OLC Object
class Medit < Oedit
   logger 'DEBUG'
   attr_accessor :stats, :default_stats

   def initialize(id, oid, args=nil)
	self.title = "Mobile Editor" if not title
	if not obj and not oid
		self.obj = Mobile.new(args, id, nil) if not oid
		self.newobj = true
	end
	super(id,oid,args)
	self.default_attr = [ "fixed", "aggressive", "night_vision", "see_invisible", "invisible", "infected", "guard", "infect_guard" , "wimpy", "scavenger"]
	self.default_stats = {
		"strength" => [ 16,17,18,19,20 ],
		 "endurance" => [ 16,17,18,19,20 ],
		 "intel" => [ 16,17,18,19,20 ], 
		 "maxhp" => [ 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300 ],
		 "maxmp" => [ 10, 20, 30, 40, 50 ], 
		 "exp" => [1, 15, 25, 35, 50, 75, 100, 125, 150, 200 ],
		 "level" => [1,2,3,4,5,6,7,8,9,10],
		 "cash" => [0,1,5,10,20,30,45,65,80,90,100 ],
		 "gender" => ["male","female","it" ]
		}
	self.default_hash = {
		"damagetype" => ["melee", "biting","clawing"]
	}
	@default_skills = { "bash" => [ 1,2,3,4,5,6,7,8,9,10 ] }
	@default_races = [ "human", "quad_tail" ]
	@cur_key = ""
	@current_stats = {}
   end   

   # Checks if the object is valid
   def is_valid?(obj)
	return true if obj.kind_of? Mobile
	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_std_option(nil,"Race",obj.race,self,:set_race_menu)
	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_attr_val_menu,obj.val)
	menu.add_text_option(nil,"Skills",self,:setup_skill_menu,obj.skills)
	menu.add_text_option(nil,"General Stats", self, :setup_stats_menu, nil)
   end

   def setup_attr_val_menu(m=nil)
        smenu = olc_basemenu("Attribute Values", self, :setup_attr_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

   # Skill menu
   def setup_skill_menu(m=nil)
        smenu = olc_basemenu("Skills", self, :setup_skill_menu, m)
        smenu.default_hash = @default_skills.dup
        smenu.add_hash_numbered_options(obj.skills, self, :pick_skill)
        smenu.add_text_option("D#","Delete Skill #", self, :del_skill)
        smenu.add_std_option(nil,"Add New Skill",nil,self,:add_skill_val)
        submenu(smenu, m)
   end

   # Refresh the current stats
   def refresh_stats
	@current_stats.clear
	default_stats.each_key do |key|
		val = obj.get_stat(key)
		case val
		when String, Symbol
			@current_stats[key] = obj.get_stat(key) if val.size > 0
		when Fixnum
			@current_stats[key] = obj.get_stat(key) if val > 0
		end
	end
   end

   # Stats Menu
   def setup_stats_menu(m=nil)
	smenu = olc_basemenu("General Stats", self, :setup_stats_menu, m)
	smenu.default_hash = default_stats.dup
	refresh_stats
	smenu.add_hash_numbered_options(@current_stats, self, :pick_stat)
	smenu.add_text_option("D#", "Delete Stat #", self, :del_stat)
	smenu.add_std_option(nil, "Add Stat value", nil, self, :add_stat)
	submenu(smenu, m)
   end

   def pick_skill(m)
	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("Skill [#{@cur_key}] - Set Value", self, :pick_skill,m)
                        current = ""
                        if obj.skills.has_key? @cur_key
                                current = obj.skills[@cur_key]
                        end
                        if @default_skills.has_key? @cur_key
                                if @default_skills[@cur_key] == nil
                                        smenu.add_std_option(nil,"Enter a value",0,self,:set_default_skill)
                                else
                                        smenu.add_numbered_option(@default_skills[@cur_key], self, :pick_default_skill)
                                end
                        end
                        smenu.add_std_option(nil,"Set new value",current, self, :set_new_skill)
                        submenu(smenu,m)
                end
        else
                smenu = olc_basemenu("Skills - Set Value", self, :pick_skill,m)
                smenu.add_numbered_option(@default_skills[@cur_key], self, :pick_default_skill)
                smenu.add_std_option(nil,"Set new value",obj.skills[@cur_key], self, :set_new_skill)
                submenu(smenu,m)
        end
   end

   def del_skill(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_skill? hash_keys[idx-1]
				obj.set_skill_level(hash_keys[idx-1], 0)
                        end
                end
        end
	menu.active_hash = obj.skills
        show_menu
   end

   def add_skill_val(m)
        if not obj.has_skill? m
                obj.add_skill(m)
                show_menu
                obj.skills
        end
   end

   def set_new_skill(m)
        m.strip!
        if m=~/^\d+$/
		obj.set_skill_level(@cur_key, m.to_i)
        end
	menu.active_hash = obj.skills
        show_menu
        m
   end

   def pick_default_skill(m)
       skills = @default_skills[@cur_key]
        if m=~/(\d+)/
                idx = $1.to_i
                if idx > 0 and idx <= skills.size
			obj.set_skill_value(@cur_key, skills[idx-1])
                end
        end
	menu.active_hash = obj.skills
        quit_menu
   end

   def set_default_skill(m)
        if m=~/^\d+$/
		obj.set_skill_val(@cur_key, m.to_i)
        end
	menu.active_hash = obj.skills
        show_menu
        m
   end

   def pick_stat(m)
	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("Stat [#{@cur_key}] - Set Value", self, :pick_stat,m)
                        current = ""
                        if obj.stats.has_key? @cur_key.to_sym
                                current = obj.stats[@cur_key.to_sym]
                        end
                        if default_stats.has_key? @cur_key
                                if default_stats[@cur_key] == nil
                                        smenu.add_std_option(nil,"Enter a value",0,self,:set_default_stat)
                                else
                                        smenu.add_numbered_option(default_stats[@cur_key], self, :pick_default_stat)
                                end
                        end
                        smenu.add_std_option(nil,"Set new value",current, self, :set_new_stat)
                        submenu(smenu,m)
                end
        else
                smenu = olc_basemenu("Stats - Set Value", self, :pick_stat,m)
                smenu.add_numbered_option(default_stats[@cur_key], self, :pick_default_stats)
                smenu.add_std_option(nil,"Set new value",obj.stats[@cur_key.to_sym], self, :set_new_stat)
                submenu(smenu,m)
        end
   end

   def del_stat(m)
	hash_keys = menu.get_hash_keys
        if m=~/(\d+)/
                idx = $1.to_i
                if idx > 0 and idx <= hash_keys.size
                        if obj.stats.has_key? hash_keys[idx-1].to_sym
				obj.set_stat(hash_keys[idx-1], 0)
                        end
                end
        end
	refresh_stats
	menu.active_hash = @current_stats
        show_menu
   end

   def add_stat_val(m)
        if not obj.get_stat?(m) > 0
                obj.set_stat(m, 0)
		menu.active_hash = obj.stats
                show_menu
                obj.stats
        end
   end

   def set_new_stat(m)
        m.strip!
        if m=~/^\d+$/
		obj.set_stat(@cur_key, m.to_i)
        end
	refresh_stats
	menu.active_hash = @current_stats
        show_menu
        m
   end

   def pick_default_stat(m)
       stats = default_stats[@cur_key]
        if m=~/(\d+)/
                idx = $1.to_i
                if idx > 0 and idx <= stats.size
			obj.set_stat(@cur_key, stats[idx-1])
                end
        end
	refresh_stats
	menu.active_hash = @current_stats
        quit_menu
   end

   def set_default_stat(m)
        if m=~/^\d+$/
		obj.set_stat(@cur_key, m.to_i)
        end
	refresh_stats
	menu.active_hash =  @current_stats
        show_menu
        m
   end

   def pick_val(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("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_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
	menu.active_hash = obj.val
	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
	menu.active_hash = obj.val
	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
	menu.active_hash = obj.val
	show_menu
	m
   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_val(m)
	if not obj.has_val? m
		obj.add_val(m,"")
		menu.active_hash = obj.val
		show_menu
		obj.val
	end
   end

   def set_race_menu(m=nil)
        smenu = olc_basemenu("Race", self, :set_race_menu, m)
        smenu.add_numbered_option(@default_races, self, :pick_race)
        submenu(smenu, m)
	show_menu
   end

  def pick_race(m)
	idx = m.to_i
	if idx > 0 and idx <= @default_races.size
		obj.race = @default_races[idx-1].to_sym
	end
	obj.race
  end

end