# File: olc.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 'utility/log'
require 'olc/olcmenu'
require 'olc/olcmenuoption'
require 'olc/olceditor'
# Core Online Creation Object
class Olc
logger 'DEBUG'
attr_accessor :id, :ch, :obj, :menu, :editstr, :title, :newobj, :menu_stack
# Initializes an OLC Object
# [+oid+] Optional oid of what to edit
# [+args+] Optional args that maybe used
def initialize(id, oid, args=nil)
self.title = "OLC Core Editor" if not title
self.id = id
self.ch = get_object(id)
if oid
self.newobj = false
self.obj = get_object(oid)
if not verify_perm(obj)
ch.sendto("You do not have permision to edit that object")
exit_olc(true)
end
end
self.menu = olc_basemenu(title,self,nil)
self.menu_stack = []
ch.mode = :olc
ch.sendroom("#{ch.name} closes #{ch.pos_pronoun} eyes and begins creating...")
end
# Creates a basic menu with just a Quit button
# [+title+] title of the menu
# [+calling+] Calling object (one who controls this menu)
# [+init+] Init function that sets up this menu
# [+reset+] Optional reset
# [+return+] basic menu object
def olc_basemenu(title,calling,init,reset=nil)
if reset == "reset"
m = menu
else
m = OlcMenu.new(title,calling,init)
end
m.add_text_option("Q","Quit", self, :quit_menu)
m
end
# Main command parsing routine. Overwrite with your object editor
# [+m+] command to parse
def parse(m)
return if not menu
msg = menu.parse(m)
if msg
if msg.size > 0
ch.sendto(msg)
else
show_menu
end
else
show_menu
end
end
# Add a submenu
# [+menu+] A created OlcMenu object
# [+reset+] Optional. If set ignore
def submenu(newmenu, reset=nil)
if not reset == "reset"
self.menu_stack.push menu
self.menu = newmenu
end
show_menu
end
# Quit the current menu. If last menu, exit OLC
# [+m+] ignored
def quit_menu(m=nil)
if menu_stack.size > 0
self.menu = menu_stack.pop
menu.reset
show_menu
else
exit_olc
end
end
# Exits the OLC session
def exit_olc(cancel=false)
ch.mode = :playing
ch.olc = nil
self.menu = nil
if not cancel
if newobj
obj.isclone = false
obj.unused = true
obj.location = 0
put_object(obj)
end
ch.sendto("Saved ##{obj.id}.")
end
ch.sendroom("#{ch.name} has finished creating.")
end
# Verify you can edit this object
# [+obj+] Object to try and edit
# [+return+] true if you are allowed to edit this object
def verify_perm(obj)
return true if ch.world.is_admin? id || obj.owner == id
false
end
# Display the menu to the user
def show_menu
ch.sendto(menu.to_s)
end
def get_object(oid)
Engine.instance.db.get(oid)
end
def put_object(oid)
Engine.instance.db.put(oid)
end
end