]> git.lizzy.rs Git - dragonblocks3d-lua.git/commitdiff
Initial commit
authorElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 6 Aug 2020 11:41:27 +0000 (13:41 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 6 Aug 2020 11:41:27 +0000 (13:41 +0200)
14 files changed:
.gitignore [new file with mode: 0644]
.gitmodules [new file with mode: 0644]
COPYING [new file with mode: 0644]
README [new file with mode: 0644]
init.lua [new file with mode: 0755]
modules/Menu/src/init.lua [new file with mode: 0644]
src/class.lua [new file with mode: 0644]
src/event_interface.lua [new file with mode: 0644]
src/init.lua [new file with mode: 0644]
src/module_manager.lua [new file with mode: 0644]
src/serializer.lua [new file with mode: 0644]
util/indexof.lua [new file with mode: 0644]
util/objectmgr.lua [new file with mode: 0644]
util/split.lua [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..1e077ff
--- /dev/null
@@ -0,0 +1,2 @@
+/client/
+/server/
diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..363c697
--- /dev/null
@@ -0,0 +1,6 @@
+[submodule "moongl"]
+    path = deps/moongl
+       url = https://github.com/stetre/moongl
+[submodule "moonglfw"]
+    path = deps/moonglfw
+       url = https://github.com/stetre/moonglfw
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..8d1c8b6
--- /dev/null
+++ b/COPYING
@@ -0,0 +1 @@
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..7792d15
--- /dev/null
+++ b/README
@@ -0,0 +1,7 @@
+depends:
+$ sudo apt install lua5.3 libsqlite3
+$ luarocks install lsqlite3
+$ luarocks install luasocket
+$ luarocks install luafilesystem
+
+Build moongl and moonglfw: See build README.md in deps/moongl and deps/moonglfw
diff --git a/init.lua b/init.lua
new file mode 100755 (executable)
index 0000000..2ac0088
--- /dev/null
+++ b/init.lua
@@ -0,0 +1,17 @@
+#! /usr/bin/env lua
+require("lfs")
+require("socket")
+require("lsqlite3")
+require("moongl")
+require("moonglfw")
+require("util/objectmgr")
+require("util/split")
+require("util/indexof")
+
+Dragonblocks = ObjectMgr.create()
+
+require("src/init")
+
+Dragonblocks:init()
+
+Dragonblocks:start_module(arg[1] or "Menu")
diff --git a/modules/Menu/src/init.lua b/modules/Menu/src/init.lua
new file mode 100644 (file)
index 0000000..e7a722d
--- /dev/null
@@ -0,0 +1,4 @@
+print("Success!")
+Menu:add_proto(Dragonblocks.serializer)
+Menu:init()
+
diff --git a/src/class.lua b/src/class.lua
new file mode 100644 (file)
index 0000000..f424d73
--- /dev/null
@@ -0,0 +1,21 @@
+local class = {}
+
+local instance_metatable = {
+       __index = function(t, k)
+               if k == "_call" then return end
+               local f = rawget(t._class, k)
+               if type(f) == "function" then
+                       return f
+               end
+       end
+}
+
+function class:_call(...)
+       local o = {class = self}
+       setmetatable(o, instance_metatable)
+       if o.constructor then
+               o:constructor(table.unpack(...))
+       end
+end 
+
+return class
diff --git a/src/event_interface.lua b/src/event_interface.lua
new file mode 100644 (file)
index 0000000..d1dfed3
--- /dev/null
@@ -0,0 +1,40 @@
+local event_interface = {}
+
+function event_interface:init()
+       self:clear_event_listeners()
+end
+
+function event_interface:fire_event(eventtype, event)
+       event = event or {}
+       event.type = eventtype
+       event.origin = self
+       local listeners = self._event_listeners[eventtype]
+       if listeners then
+               for _, listener in ipairs(listeners) do
+                       listener(event)
+               end
+       end
+end
+
+function event_interface:add_event_listener(eventtype, eventlistener)
+       self._event_listeners[eventtype] = self._event_listeners[eventtype] or {}
+       table.insert(self._event_listeners[eventtype], eventlistener)
+end
+       
+function event_interface:remove_event_listener(eventtype, eventlistener)
+       local listeners = self._event_listeners[eventtype]
+       if listeners then
+               for k, listener in ipairs(listeners) do
+                       if listener == eventlistener then
+                               table.remove(k)
+                               return self:removeEventListener(eventtype, eventlistener)
+                       end
+               end
+       end
+end
+
+function event_interface:clear_event_listeners()
+       self._event_listeners = {}
+end
+
+return event_interface
diff --git a/src/init.lua b/src/init.lua
new file mode 100644 (file)
index 0000000..c0ef6f3
--- /dev/null
@@ -0,0 +1,7 @@
+Dragonblocks.event_interface = require("src/event_interface")
+Dragonblocks.class = require("src/class")
+Dragonblocks.module_manager = require("src/module_manager")
+Dragonblocks.serializer = require("src/serializer")
+
+Dragonblocks:add_proto(Dragonblocks.module_manager)
+Dragonblocks:add_proto(Dragonblocks.serializer)
diff --git a/src/module_manager.lua b/src/module_manager.lua
new file mode 100644 (file)
index 0000000..b9c8895
--- /dev/null
@@ -0,0 +1,54 @@
+local module_ref = {}
+
+function module_ref:preinit()
+       self._dependencies = {}
+       self._started = false
+       local depfile = io.open(self._path .. "/.txt")
+       if depfile then
+               local data = depfile:read()
+               depfile:close()
+               self._dependencies = data:split("\n")
+       end
+end
+
+function module_ref:init()
+       self._started = true
+end
+
+function module_ref:start()
+       _G[self._name] = self
+       require(self._path .. "src/init")
+end
+
+local module_manager = {}
+
+module_manager.module_path = "modules/"
+
+function module_manager:init()
+       self._modules = {}
+       for modulename in lfs.dir(self.module_path) do
+               if modulename:sub(1, 1) ~= "." then
+                       local m = ObjectMgr.create()
+                       m._name = modulename
+                       m._path = self.module_path .. modulename .. "/"
+                       m:add_proto(module_ref)
+                       m:preinit()
+                       self._modules[modulename] = m
+               end
+       end
+end
+
+function module_manager:start_module(name)
+       local m = self._modules[name]
+       if not m then
+               error("Failed to start module '" .. name .. "'.")
+       elseif m._started then
+               return
+       end
+       for _, dep in ipairs(m._dependencies) do
+               self:start_module(dep)
+       end
+       m:start()
+end
+
+return module_manager
diff --git a/src/serializer.lua b/src/serializer.lua
new file mode 100644 (file)
index 0000000..582e927
--- /dev/null
@@ -0,0 +1,49 @@
+local serializer = {}
+
+function serializer:serialize()
+       local data = "{"
+       for k, v in pairs(self) do
+               local kdata, vdata
+               local ktype, vtype = type(k), type(v)
+               local serialize_pair = true
+               if ktype == "number" then
+                       kdata = "[" .. k .. "]"
+               elseif ktype == "string" then
+                       if k:sub(1, 1) == "_" then
+                               serialize_pair = false
+                       else
+                               kdata = "[\"" .. k .. "\"]"
+                       end
+               else
+                       serialize_pair = false
+               end
+               if vtype == "table" then
+                       vdata = serializer.serialize(v)
+               elseif vtype == "string" then
+                       vdata = "\"" .. v .. "\""
+               elseif vtype == "number" then
+                       vdata = v
+               elseif vtype == "boolean" then
+                       vdata = v and "true" or "false"
+               else
+                       serialize_pair = false
+               end
+               if serialize_pair then
+                       data = data .. kdata .. "=" .. vdata .. ","
+               end
+       end
+       return data .. "}"
+end
+
+function serializer:deserialize(raw)
+       raw = "return" .. (raw or "")
+       local f = loadstring(raw)
+       local data = f and f()
+       if type(data) == "table" then
+               for k, v in pairs(data) do
+                       self[k] = v
+               end
+       end
+end
+
+return serializer
diff --git a/util/indexof.lua b/util/indexof.lua
new file mode 100644 (file)
index 0000000..24fbead
--- /dev/null
@@ -0,0 +1,8 @@
+function table.indexof(list, val)
+       for i, v in ipairs(list) do
+               if v == val then
+                       return i
+               end
+       end
+       return -1
+end 
diff --git a/util/objectmgr.lua b/util/objectmgr.lua
new file mode 100644 (file)
index 0000000..3140915
--- /dev/null
@@ -0,0 +1,39 @@
+local ObjectRef = {}
+
+function ObjectRef:init()
+       for _, p in ipairs(self._proto) do
+               if p ~= ObjectRef and p.init then
+                       p.init(self)
+               end
+       end
+end
+
+function ObjectRef:add_proto(p)
+       table.insert(self._proto, p)
+end
+
+ObjectMgr = {}
+
+ObjectMgr.metatable = {
+       __index = function(t, k)
+               for _, p in ipairs(t._proto) do
+                       local v = p[k]
+                       if v then
+                               return v
+                       end
+               end
+       end,
+       __call = function(t, ...)
+               return t:_call()
+       end,
+       __tostring = function(t)
+               return t.serialize and t:serialize() or "<not serializable>"
+       end,
+}
+
+function ObjectMgr.create()
+       local o = {}
+       o._proto = {ObjectRef}
+       setmetatable(o, ObjectMgr.metatable)
+       return o
+end
diff --git a/util/split.lua b/util/split.lua
new file mode 100644 (file)
index 0000000..0b9da3d
--- /dev/null
@@ -0,0 +1,23 @@
+function string.split(str, delim, include_empty, max_splits, sep_is_pattern)
+       delim = delim or ","
+       max_splits = max_splits or -2
+       local items = {}
+       local pos, len = 1, #str
+       local plain = not sep_is_pattern
+       max_splits = max_splits + 1
+       repeat
+               local np, npe = string_find(str, delim, pos, plain)
+               np, npe = (np or (len+1)), (npe or (len+1))
+               if (not np) or (max_splits == 1) then
+                       np = len + 1
+                       npe = np
+               end
+               local s = string_sub(str, pos, np - 1)
+               if include_empty or (s ~= "") then
+                       max_splits = max_splits - 1
+                       items[#items + 1] = s
+               end
+               pos = npe + 1
+       until (max_splits == 0) or (pos > (len + 1))
+       return items
+end