# 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