common.lua

changeset 0
cc66ad6b0d75
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common.lua	Sat Mar 27 17:43:08 2010 +0000
@@ -0,0 +1,75 @@
+-- New version, using 100% inheritance through metatables
+function CreateObject(base, name)
+	local b = {};
+	for k, v in pairs(base) do
+		if type(v) == "table" then
+			b[k] = CreateObject(v, false);
+		end
+	end
+	if name ~= false then
+		b._parent = base; setmetatable(b, { __index = _inheritproc });
+		b._properties = b._properties or {};
+		b._properties.name = name or (base._properties and base._properties.name) or "";
+	else
+		setmetatable(b, getmetatable(base) or { __index = base });
+	end
+	return b;
+end
+
+function GetJIDParts(jid)
+	local j1node, j1server, j1res = jid:match("^(.+)@([%a%.]+)/?(.*)$");
+	return { node = j1node, server = j1server, resource = j1res, jid = jid }
+end
+
+function basicSerialize (o)
+  if type(o) == "number" or type(o) == "boolean" then
+    return tostring(o)
+  else -- assume it is a string
+    return string.format("%q", tostring(o))
+  end
+end
+
+function table.print (name, value, saved)
+  saved = saved or {}       -- initial value
+  io.write(name, " = ")
+  if type(value) == "number" or type(value) == "string" or type(value) == "boolean" or type(value)=="function" then
+    io.write(basicSerialize(value), "\n")
+  elseif type(value) == "table" then
+    if saved[value] then    -- value already saved?
+      io.write(saved[value], "\n")  -- use its previous name
+    else
+      saved[value] = name   -- save name for next time
+      io.write("{}\n")     -- create a new table
+      for k,v in pairs(value) do      -- save its fields
+        local fieldname = string.format("%s[%s]", name,
+                                        basicSerialize(k))
+        table.print(fieldname, v, saved)
+      end
+    end
+  else
+    error("cannot save a " .. type(value))
+  end
+end
+
+
+function _inheritproc(t, k)
+	local parent = rawget(t, "_parent");
+	if type(parent) == "table" then
+		return (rawget(parent, k) or _inheritproc(parent, k));
+	else
+		return parent and (rawget(classes[parent], k) or _inheritproc(classes[parent], k));
+	end
+end
+
+classes = classes or setmetatable({ default = {} }, { __newindex = function (t, k, v) if not rawget(v, "_parent") then rawset(v, "_parent", rawget(t, "default")); end return rawset(t, k, setmetatable(v, { __index = _inheritproc })); end, __index = function (t, k) dofile(string.format("objects/%s.lua", k)); return rawget(t, k); end }); -- This is our inheritance code;
+tpl_rooms = {}
+
+dofile("containertables.inc.lua");
+dofile("commands.lua");
+dofile("def_object.lua");
+dofile("def_occupant.lua");
+dofile("def_room.lua");
+
+dofile("rooms.lua");
+dofile("classes.lua");
+dofile("editing.lua");
\ No newline at end of file

mercurial