#@ -- This wrapper allows the program to run headless on any OS (in theory) -- It can be run using a standard lua interpreter, although LuaJIT is preferable -- Callbacks local callbackTable = { } local mainObject local function runCallback(name, ...) if callbackTable[name] then return callbackTable[name](...) elseif mainObject and mainObject[name] then return mainObject[name](mainObject, ...) end end function SetCallback(name, func) callbackTable[name] = func end function GetCallback(name) return callbackTable[name] end function SetMainObject(obj) mainObject = obj end -- Image Handles local imageHandleClass = { } imageHandleClass.__index = imageHandleClass function NewImageHandle() return setmetatable({ }, imageHandleClass) end function imageHandleClass:Load(fileName, ...) self.valid = true end function imageHandleClass:Unload() self.valid = false end function imageHandleClass:IsValid() return self.valid end function imageHandleClass:SetLoadingPriority(pri) end function imageHandleClass:ImageSize() return 1, 1 end -- Rendering function RenderInit() end function GetScreenSize() return 1920, 1080 end function SetClearColor(r, g, b, a) end function SetDrawLayer(layer, subLayer) end function SetViewport(x, y, width, height) end function SetDrawColor(r, g, b, a) end function DrawImage(imgHandle, left, top, width, height, tcLeft, tcTop, tcRight, tcBottom) end function DrawImageQuad(imageHandle, x1, y1, x2, y2, x3, y3, x4, y4, s1, t1, s2, t2, s3, t3, s4, t4) end function DrawString(left, top, align, height, font, text) end function DrawStringWidth(height, font, text) return 1 end function DrawStringCursorIndex(height, font, text, cursorX, cursorY) return 0 end function StripEscapes(text) return text:gsub("^%d",""):gsub("^x%x%x%x%x%x%x","") end function GetAsyncCount() return 0 end -- Search Handles function NewFileSearch() end -- General Functions function SetWindowTitle(title) end function GetCursorPos() return 0, 0 end function SetCursorPos(x, y) end function ShowCursor(doShow) end function IsKeyDown(keyName) end function Copy(text) end function Paste() end function Deflate(data) -- TODO: Might need this return "" end function Inflate(data) -- TODO: And this return "" end function GetTime() return 0 end function GetScriptPath() return "" end function GetRuntimePath() return "" end function GetUserPath() return "" end function MakeDir(path) end function RemoveDir(path) end function SetWorkDir(path) end function GetWorkDir() return "" end function LaunchSubScript(scriptText, funcList, subList, ...) end function AbortSubScript(ssID) end function IsSubScriptRunning(ssID) end function LoadModule(fileName, ...) if not fileName:match("%.lua") then fileName = fileName .. ".lua" end local func, err = loadfile(fileName) if func then return func(...) else error("LoadModule() error loading '"..fileName.."': "..err) end end function PLoadModule(fileName, ...) if not fileName:match("%.lua") then fileName = fileName .. ".lua" end local func, err = loadfile(fileName) if func then return PCall(func, ...) else error("PLoadModule() error loading '"..fileName.."': "..err) end end function PCall(func, ...) local ret = { pcall(func, ...) } if ret[1] then table.remove(ret, 1) return nil, unpack(ret) else return ret[2] end end function ConPrintf(fmt, ...) -- Optional --print(string.format(fmt, ...)) end function ConPrintTable(tbl, noRecurse) end function ConExecute(cmd) end function ConClear() end function SpawnProcess(cmdName, args) end function OpenURL(url) end function SetProfiling(isEnabled) end function Restart() end function Exit() end local l_require = require function require(name) -- Hack to stop it looking for lcurl, which we don't really need if name == "lcurl.safe" then return end return l_require(name) end dofile("Launch.lua") runCallback("OnInit") runCallback("OnFrame") -- Need at least one frame for everything to initialise if mainObject.promptMsg then -- Something went wrong during startup print(mainObject.promptMsg) io.read("*l") return end -- The build module; once a build is loaded, you can find all the good stuff in here local build = mainObject.main.modes["BUILD"] -- Here's some helpful helper functions to help you get started local function newBuild() mainObject.main:SetMode("BUILD", false, "Help, I'm stuck in Path of Building!") runCallback("OnFrame") end local function loadBuildFromXML(xmlText) mainObject.main:SetMode("BUILD", false, "", xmlText) runCallback("OnFrame") end local function loadBuildFromJSON(getItemsJSON, getPassiveSkillsJSON) mainObject.main:SetMode("BUILD", false, "") runCallback("OnFrame") local charData = build.importTab:ImportItemsAndSkills(getItemsJSON) build.importTab:ImportPassiveTreeAndJewels(getPassiveSkillsJSON, charData) -- You now have a build without a correct main skill selected, or any configuration options set -- Good luck! end -- Now you can mess around! -- Probably optional runCallback("OnExit")