aboutsummaryrefslogtreecommitdiff
path: root/src/lua/embed/boot.lua.h
blob: e0c43ee316dec0639933d9e449b338baadc40fe6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* 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 600 
conf.height = conf.height or 500 
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()

-- open debug mode, must after jin.graphics.init
if jin._argv[3] == '-d' then 
    jin.debug.init()
end

local function safecall(func, ...)
    if func then 
        func(...)
    end
end 

function jin.core.run()
    safecall(jin.core.onLoad)
    local previous = jin.time.second()
    local SEC_PER_UPDATE = 1 / conf.fps
    local dt = SEC_PER_UPDATE
    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
            safecall(jin.core.onEvent, e)
        end
        if not jin.core.running() then 
            break 
        end 

        safecall(jin.core.onUpdate, dt)

        jin.graphics.unbind() 
        jin.graphics.clear() 
        jin.graphics.color()
        jin.graphics.study()
        safecall(jin.core.onDraw)
        if jin.debug.status() then 
            jin.debug.render()
        end
        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

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 
        function jin.core.onEvent(e) 
            if e.type == 'quit' then 
                jin.core.stop()
            end
        end
        function jin.core.onDraw() 
            jin.graphics.clear(111, 134, 125, 255) 
            local ww, wh = jin.graphics.size() 
            local fw, fh = jin.graphics.box("no game", 20, 1, 20)
            jin.graphics.write("no game", ww /2 - fw / 2, wh * 2/3, 16, 1, 18)
        end
        jin.core.run()
    end
    -- quit subsystems
    jin.graphics.destroy()
    jin.audio.destroy()
    -- exit whole game 
    jin.core.quit()
end 

boot()

)";