@@ -2,20 +2,71 @@ local path = minetest.get_modpath('sorcery'); local get = function(unit) return dofile(path .. '/' .. unit .. '.lua') end + local test = function(file) -- :/ + local hnd = io.open(file,'r') + if hnd == nil then return false else + hnd:close() + return true + end + end + local worldcfg = function(str) + return minetest.get_worldpath() .. '/' .. str + end + local cfg = function(str) return worldcfg('sorcery/' .. str) end + local selfname = minetest.get_current_modname() + local stage = function(s,...) + local f = sorcery.cfg(s .. '.lua') + if test(f) then return loadfile(f)(...) or true end + return false + end + sorcery = { + self = selfname; path = path; load = function(name) get(name) end; - unit = function(ns,sfx) + worldcfg = worldcfg, cfg = cfg; + stage = stage; + log = function(module,text) + if module then + minetest.log('info',string.format('[%s :: %s] %s',selfname,module,text)) + else + minetest.log('info',string.format('[%s] %s',selfname,text)) + end + end; + act = function(module,text) + minetest.log('action',string.format('[%s :: %s] %s',selfname,module,text)) + end; + unit = function(ns,sfx,override) local target if ns then sorcery[ns] = {} target = sorcery[ns] else target = sorcery end + if override == true then override = '' + elseif override then override = override .. '-' end + local loaded = {} return function(lst) - for i=1,#lst do - target[lst[i]] = get(((ns and ns..'/') or '')..lst[i]) + for i,name in pairs(lst) do + if not loaded[name] then + loaded[name] = true + local fpath = ((ns and ns..'/') or '')..name + local extra = cfg(string.format('%s%s-extra.lua', override,name)) + local replace = cfg(string.format('%s%s.lua', override,name)) + local default = get(fpath) + if override and test(replace) then + sorcery.log(name,'loading local replacement for ' .. fpath .. ' from ' .. replace) + target[name] = loadfile(replace)(default) + else + target[name] = default + if override and test(extra) then + sorcery.log(name,'loading local extras for ' .. fpath .. ' from ' .. extra) + local extbl = loadfile(extra)(default) + for k,v in pairs(extbl) do target[name][k] = v end + end + end + end end end end; } @@ -25,9 +76,13 @@ -- and load them automatically, as interdependencies -- exist (especially with /lib) and we need to be very -- careful about the order they're loaded in -sorcery.unit('data') {'ui'} +local data = sorcery.unit('data',nil,'lore') +local root = sorcery.unit() +sorcery.stage('bootstrap',data,root) + +data {'ui'} sorcery.unit('lib') { -- convenience 'str'; -- serialization @@ -39,20 +94,33 @@ -- game 'node'; } -sorcery.unit() { 'compat', 'matreg' } -sorcery.unit('data') { - 'compat'; - 'affinities'; 'gods'; - 'enchants', 'spells'; - 'gems', 'metals'; - 'potions', 'oils', 'greases', - 'draughts', 'elixirs', - 'philters', 'extracts'; - 'register'; -} +sorcery.stage('worldbuilding',data,root) +root {'compat','matreg'} +if not sorcery.stage('loadlore', data, root) then + data { + 'compat'; + 'affinities'; 'gods'; + 'calendar', 'signs'; + 'enchants', 'spells'; + 'gems', 'metals'; + 'potions', 'oils', 'greases', + 'draughts', 'elixirs', + 'philters', 'extracts'; + } +end + +sorcery.load('registration') do + local exclude = {'compat','ui'} + for k,v in pairs(sorcery.data) do + if not sorcery.lib.tbl.has(exclude,k) then + sorcery.registry.mk(k,v) + end + end +end +sorcery.stage('startup',data) for _,u in pairs { 'attunement'; 'context'; 'itemclass'; 'potions'; 'metal', 'gems'; 'leylines'; 'infuser'; 'altar'; 'wands'; 'tools', 'crafttools'; 'enchanter'; @@ -59,9 +127,11 @@ 'harvester'; 'metallurgy-hot', 'metallurgy-cold'; 'entities'; 'recipes'; 'coins'; 'interop'; 'tnodes'; 'forcefield'; 'farcaster'; 'portal'; 'cookbook', 'writing'; 'disassembly'; 'displacer'; - 'gravitator'; + 'gravitator'; 'precipitator'; 'astrolabe'; 'admin'; } do sorcery.load(u) end +sorcery.stage('finalize') +sorcery.registry.defercheck()