diff options
Diffstat (limited to 'src/lua/modules/embed/boot.lua.h')
-rw-r--r-- | src/lua/modules/embed/boot.lua.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/lua/modules/embed/boot.lua.h b/src/lua/modules/embed/boot.lua.h new file mode 100644 index 0000000..32d3e1d --- /dev/null +++ b/src/lua/modules/embed/boot.lua.h @@ -0,0 +1,170 @@ +/* boot.lua */ +static const char* boot_lua = R"( +jin._argv[2] = jin._argv[2] or '.' +jin.filesystem.init() +jin.filesystem.mount(jin._argv[2]) + +local conf = {} +if jin.filesystem.exist("config.lua") then + conf = require "config" +end +conf.width = conf.width or 576 +conf.height = conf.height or 448 +conf.fps = conf.fps or 60 +conf.vsync = conf.vsync or false +conf.title = conf.title or ("jin v" .. jin.version()) +conf.resizable = conf.resizable or false +conf.fullscreen = conf.fullscreen or false + +-- initialize subsystems +jin.graphics.init(conf) +jin.audio.init() + +local function call(func, ...) + if func then + return func(...) + end +end + +jin.core.setHandler = function(handler) + if handler == nil then + return + end + jin.core.onLoad = handler.onLoad + jin.core.onEvent = handler.onEvent + jin.core.onUpdate = handler.onUpdate + jin.core.onDraw = handler.onDraw +end + +function jin.core.run() + call(jin.core.onLoad) + local previous = jin.time.second() + local SEC_PER_UPDATE = 1 / conf.fps + local dt = SEC_PER_UPDATE + local running = true + while(jin.core.running()) do + for _, e in pairs(jin.event.poll()) do + if e.type == "keydown" then + jin.keyboard.set(e.key, true) + elseif e.type == "keyup" then + jin.keyboard.set(e.key, false) + end + call(jin.core.onEvent, e) + running = jin.core.running() + if not running then break end + end + if not running then break end + + call(jin.core.onUpdate, dt) + + jin.graphics.unbind() + jin.graphics.clear() + jin.graphics.color() + jin.graphics.study() + call(jin.core.onDraw) + jin.graphics.present() + + local current = jin.time.second() + dt = current - previous + local wait = SEC_PER_UPDATE - dt + previous = previous + SEC_PER_UPDATE + if wait > 0 then + dt = SEC_PER_UPDATE + jin.time.sleep(wait) + else + previous = current + end + end +end + +local function onError(msg) + local tab = ' ' + print("Error:\n" .. msg) + function jin.core.onEvent(e) + if e.type == 'quit' then + jin.core.stop() + end + end + local ww, wh = jin.graphics.size() + function jin.core.onDraw() + jin.graphics.write("Error: ", 10, 10, 30, 3, 30) + jin.graphics.write(msg, 10, 50) + end +end + +------------------------------------------------------------------------------- +-- No game handler +------------------------------------------------------------------------------- + +jin.nogame = { + cs = 64, + sw = jin.graphics.getWidth(), + sh = jin.graphics.getHeight(), + cw = 0, + ch = 0, + ww = 6, + ww2 = 6*2, + speed = 4, + t = 0, + onLoad = function() + local nogame = jin.nogame + nogame.cw = nogame.sw / nogame.cs + nogame.ch = nogame.sh / nogame.cs + nogame.t = nogame.ww - 1 + end, + onEvent = function(e) + if e.type == 'quit' then + jin.core.stop() + end + end, + onUpdate = function(dt) + local nogame = jin.nogame + nogame.t = nogame.t + dt * nogame.speed + if nogame.t > nogame.ww2 then + nogame.t = nogame.t - nogame.ww2 + end + end, + circle = function(x, y, r) + local nogame = jin.nogame + if r % nogame.ww2 > nogame.ww then + return + end + r = math.sin((r/nogame.ww)*math.pi)*nogame.cs/2 + local fact = (x + y) / nogame.ch * nogame.cw + jin.graphics.color(155 + 100 * math.sin(fact), 155 + 100 * math.cos(fact), 155 + 100 * math.sin(fact * fact), 255) + jin.graphics.circle("fill", x*nogame.cs + nogame.cs/2, y*nogame.cs + nogame.cs/2, r) + end, + onDraw = function() + local nogame = jin.nogame + for y = 0, nogame.ch - 1 do + for x = 0, nogame.cw - 1 do + nogame.circle(x, y, nogame.t+x+y) + end + end + end +} + +------------------------------------------------------------------------------- +-- Boot jin +------------------------------------------------------------------------------- + +local function boot() + if jin.filesystem.exist("main.lua") then + -- require main game script + xpcall(function() require"main" end, onError) + jin.core.run() + else + -- no game + jin.core.setHandler(jin.nogame) + jin.core.run() + end + -- quit subsystems + jin.graphics.destroy() + jin.audio.destroy() + -- exit whole game + jin.core.quit() +end + +xpcall(boot, onError) + +)"; |