SNKRX/engine/init.lua

175 lines
6.3 KiB
Lua

local path = ...
if not path:find("init") then
require(path .. ".datastructures.string")
require(path .. ".datastructures.table")
require(path .. ".external")
require(path .. ".graphics.graphics")
require(path .. ".game.object")
require(path .. ".system")
require(path .. ".datastructures.graph")
require(path .. ".datastructures.grid")
require(path .. ".game.gameobject")
require(path .. ".game.group")
require(path .. ".game.state")
require(path .. ".game.physics")
require(path .. ".game.steering")
require(path .. ".graphics.animation")
require(path .. ".graphics.camera")
require(path .. ".graphics.canvas")
require(path .. ".graphics.color")
require(path .. ".graphics.font")
require(path .. ".graphics.image")
require(path .. ".graphics.shader")
require(path .. ".graphics.text")
require(path .. ".graphics.tileset")
require(path .. ".map.solid")
require(path .. ".map.tilemap")
require(path .. ".math.polygon")
require(path .. ".math.chain")
require(path .. ".math.circle")
require(path .. ".math.line")
require(path .. ".math.math")
require(path .. ".math.random")
require(path .. ".math.rectangle")
require(path .. ".math.spring")
require(path .. ".math.triangle")
require(path .. ".math.vector")
require(path .. ".game.trigger")
require(path .. ".game.input")
require(path .. ".sound")
require(path .. ".game.parent")
require(path .. ".game.springs")
require(path .. ".game.flashes")
require(path .. ".game.hitfx")
end
function engine_run(config)
if not web then
love.filesystem.setIdentity(config.game_name)
steam.init()
system.load_state()
local _, _, flags = love.window.getMode()
local window_width, window_height = love.window.getDesktopDimensions(flags.display)
if config.window_width ~= 'max' then window_width = config.window_width end
if config.window_height ~= 'max' then window_height = config.window_height end
local limits = love.graphics.getSystemLimits()
local anisotropy = limits.anisotropy
msaa = limits.canvasmsaa
if config.msaa ~= 'max' then msaa = config.msaa end
if config.anisotropy ~= 'max' then anisotropy = config.anisotropy end
gw, gh = config.game_width or 480, config.game_height or 270
sx, sy = window_width/(config.game_width or 480), window_height/(config.game_height or 270)
ww, wh = window_width, window_height
if state.sx and state.sy then
sx, sy = state.sx, state.sy
love.window.setMode(state.sx*gw, state.sy*gh, {vsync = config.vsync, msaa = msaa or 0, display = config.display})
else
state.sx, state.sy = sx, sy
love.window.setMode(window_width, window_height, {vsync = config.vsync, msaa = msaa or 0, display = config.display})
end
love.window.setTitle(config.game_name)
else
gw, gh = config.game_width or 480, config.game_height or 270
sx, sy = 2, 2
ww, wh = 960, 540
end
love.window.setIcon(love.image.newImageData('assets/images/icon.png'))
love.graphics.setBackgroundColor(0, 0, 0, 1)
love.graphics.setColor(1, 1, 1, 1)
love.joystick.loadGamepadMappings("engine/gamecontrollerdb.txt")
graphics.set_line_style(config.line_style or "rough")
graphics.set_default_filter(config.default_filter or "nearest", config.default_filter or "nearest", anisotropy or 0)
combine = Shader("default.vert", "combine.frag")
replace = Shader("default.vert", "replace.frag")
full_combine = Shader("default.vert", "full_combine.frag")
input = Input()
input:bind_all()
for k, v in pairs(config.input or {}) do input:bind(k, v) end
random = Random()
trigger = Trigger()
camera = Camera(gw/2, gh/2)
mouse = Vector(0, 0)
last_mouse = Vector(0, 0)
mouse_dt = Vector(0, 0)
init()
if love.timer then love.timer.step() end
if not web then
_, _, flags = love.window.getMode()
fixed_dt = 1/flags.refreshrate
else fixed_dt = 1/60 end
local accumulator = fixed_dt
local dt = 0
frame, time = 0, 0
if not web then refresh_rate = flags.refreshrate
else refresh_rate = 60 end
return function()
if love.event then
love.event.pump()
for name, a, b, c, d, e, f in love.event.poll() do
if name == "quit" then
if not love.quit or not love.quit() then
system.save_state()
steam.shutdown()
return a or 0
end
elseif name == "focus" then
if main.current:is(Arena) then
if not a then open_options(main.current)
else close_options(main.current) end
end
elseif name == "keypressed" then input.keyboard_state[a] = true; input.last_key_pressed = a
elseif name == "keyreleased" then input.keyboard_state[a] = false
elseif name == "mousepressed" then input.mouse_state[input.mouse_buttons[c]] = true; input.last_key_pressed = input.mouse_buttons[c]
elseif name == "mousereleased" then input.mouse_state[input.mouse_buttons[c]] = false
elseif name == "wheelmoved" then if b == 1 then input.mouse_state.wheel_up = true elseif b == -1 then input.mouse_state.wheel_down = true end
elseif name == "gamepadpressed" then input.gamepad_state[input.index_to_gamepad_button[b]] = true; input.last_key_pressed = input.index_to_gamepad_button[b]
elseif name == "gamepadreleased" then input.gamepad_state[input.index_to_gamepad_button[b]] = false
elseif name == "gamepadaxis" then input.gamepad_axis[input.index_to_gamepad_axis[b]] = c
elseif name == "textinput" then input:textinput(a) end
end
end
if love.timer then dt = love.timer.step() end
steam.runCallbacks()
accumulator = accumulator + dt
while accumulator >= fixed_dt do
frame = frame + 1
input:update(fixed_dt)
trigger:update(fixed_dt)
camera:update(fixed_dt)
local mx, my = love.mouse.getPosition()
mouse:set(mx/sx, my/sy)
mouse_dt:set(mouse.x - last_mouse.x, mouse.y - last_mouse.y)
update(fixed_dt)
system.update()
input.last_key_pressed = nil
last_mouse:set(mouse.x, mouse.y)
accumulator = accumulator - fixed_dt
time = time + fixed_dt
end
if love.graphics and love.graphics.isActive() then
love.graphics.origin()
love.graphics.clear(love.graphics.getBackgroundColor())
draw()
love.graphics.present()
end
if love.timer then love.timer.sleep(0.001) end
end
end