|
1 -- New version, using 100% inheritance through metatables |
|
2 function CreateObject(base, name) |
|
3 local b = {}; |
|
4 for k, v in pairs(base) do |
|
5 if type(v) == "table" then |
|
6 b[k] = CreateObject(v, false); |
|
7 end |
|
8 end |
|
9 if name ~= false then |
|
10 b._parent = base; setmetatable(b, { __index = _inheritproc }); |
|
11 b._properties = b._properties or {}; |
|
12 b._properties.name = name or (base._properties and base._properties.name) or ""; |
|
13 else |
|
14 setmetatable(b, getmetatable(base) or { __index = base }); |
|
15 end |
|
16 return b; |
|
17 end |
|
18 |
|
19 function GetJIDParts(jid) |
|
20 local j1node, j1server, j1res = jid:match("^(.+)@([%a%.]+)/?(.*)$"); |
|
21 return { node = j1node, server = j1server, resource = j1res, jid = jid } |
|
22 end |
|
23 |
|
24 function basicSerialize (o) |
|
25 if type(o) == "number" or type(o) == "boolean" then |
|
26 return tostring(o) |
|
27 else -- assume it is a string |
|
28 return string.format("%q", tostring(o)) |
|
29 end |
|
30 end |
|
31 |
|
32 function table.print (name, value, saved) |
|
33 saved = saved or {} -- initial value |
|
34 io.write(name, " = ") |
|
35 if type(value) == "number" or type(value) == "string" or type(value) == "boolean" or type(value)=="function" then |
|
36 io.write(basicSerialize(value), "\n") |
|
37 elseif type(value) == "table" then |
|
38 if saved[value] then -- value already saved? |
|
39 io.write(saved[value], "\n") -- use its previous name |
|
40 else |
|
41 saved[value] = name -- save name for next time |
|
42 io.write("{}\n") -- create a new table |
|
43 for k,v in pairs(value) do -- save its fields |
|
44 local fieldname = string.format("%s[%s]", name, |
|
45 basicSerialize(k)) |
|
46 table.print(fieldname, v, saved) |
|
47 end |
|
48 end |
|
49 else |
|
50 error("cannot save a " .. type(value)) |
|
51 end |
|
52 end |
|
53 |
|
54 |
|
55 function _inheritproc(t, k) |
|
56 local parent = rawget(t, "_parent"); |
|
57 if type(parent) == "table" then |
|
58 return (rawget(parent, k) or _inheritproc(parent, k)); |
|
59 else |
|
60 return parent and (rawget(classes[parent], k) or _inheritproc(classes[parent], k)); |
|
61 end |
|
62 end |
|
63 |
|
64 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; |
|
65 tpl_rooms = {} |
|
66 |
|
67 dofile("containertables.inc.lua"); |
|
68 dofile("commands.lua"); |
|
69 dofile("def_object.lua"); |
|
70 dofile("def_occupant.lua"); |
|
71 dofile("def_room.lua"); |
|
72 |
|
73 dofile("rooms.lua"); |
|
74 dofile("classes.lua"); |
|
75 dofile("editing.lua"); |