# 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