# 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