124 lines
2.9 KiB
Lua
124 lines
2.9 KiB
Lua
local MainState = {}
|
|
local pprint = require("lib.pprint")
|
|
local nata = require("lib.nata")
|
|
local data = require("data")
|
|
|
|
function MainState:enter(_, host_socket)
|
|
local groups = {
|
|
physical = {filter = {"pos", "vel"}},
|
|
player = {filter = {
|
|
"pos", "acc", "speed", "bolts"
|
|
-- "bolt_count",
|
|
-- "bolt_cooldown", "bolt_speed", "bolt_friction"
|
|
}},
|
|
controllable_player = {filter = {"controllable"}},
|
|
sprite = {filter = {"pos", "sprite"}},
|
|
bolt = {filter={"pos", "vel", "bolt"}},
|
|
collider = {filter={"pos", "collider"}}
|
|
}
|
|
|
|
local systems = {
|
|
require("systems.physics"),
|
|
require("systems.map"),
|
|
require("systems.sprite"),
|
|
require("systems.player"),
|
|
require("systems.bolt"),
|
|
require("systems.screen-scaler")
|
|
}
|
|
|
|
if not love.filesystem.isFused() then
|
|
table.insert(systems, require("systems.debug"))
|
|
end
|
|
|
|
if host_socket then
|
|
table.insert(systems, require("systems.multiplayer"))
|
|
end
|
|
|
|
self.ecs = nata.new{
|
|
groups = groups,
|
|
systems = systems,
|
|
data = {
|
|
host_socket = host_socket
|
|
}
|
|
}
|
|
|
|
self.downscaled_canvas = nil
|
|
self:refreshDownscaledCanvas()
|
|
self.ecs:on("onMapSwitch", function(map)
|
|
self:refreshDownscaledCanvas(map)
|
|
end)
|
|
love.graphics.setNewFont(48)
|
|
end
|
|
|
|
function MainState:refreshDownscaledCanvas(map)
|
|
if not map then
|
|
local Map = self.ecs:getSystem(require("systems.map"))
|
|
map = Map.map
|
|
if not map then
|
|
self.downscaled_canvas = nil
|
|
return
|
|
end
|
|
end
|
|
|
|
self.downscaled_canvas = love.graphics.newCanvas(
|
|
map.width * map.tilewidth,
|
|
map.height * map.tileheight
|
|
)
|
|
self.downscaled_canvas:setFilter("nearest", "nearest")
|
|
end
|
|
|
|
function MainState:update(dt)
|
|
self.ecs:flush()
|
|
self.ecs:emit("update", dt)
|
|
|
|
if love.keyboard.isDown("escape") then
|
|
love.event.quit()
|
|
end
|
|
end
|
|
|
|
function MainState:cleanup()
|
|
local multiplayer = self.ecs:getSystem(require("systems.multiplayer"))
|
|
if multiplayer then
|
|
multiplayer:disconnectPeers()
|
|
end
|
|
end
|
|
|
|
function MainState:quit()
|
|
self:cleanup()
|
|
end
|
|
|
|
function MainState:mousemoved(x, y, dx, dy, istouch)
|
|
local ScreenScaler = self.ecs:getSystem(require("systems.screen-scaler"))
|
|
if not ScreenScaler:isInBounds(x, y) then return end
|
|
|
|
x, y = ScreenScaler:getPosition(x, y)
|
|
dx = (ScreenScaler.scale or 1) * dx
|
|
dy = (ScreenScaler.scale or 1) * dy
|
|
self.ecs:emit("mousemoved", x, y, dx, dy, istouch)
|
|
end
|
|
|
|
function MainState:keypressed(...)
|
|
self.ecs:emit("keypressed", ...)
|
|
end
|
|
|
|
function MainState:draw()
|
|
local ScreenScaler = self.ecs:getSystem(require("systems.screen-scaler"))
|
|
|
|
-- Draw the game
|
|
ScreenScaler:start(self.downscaled_canvas)
|
|
self.ecs:emit("draw")
|
|
ScreenScaler:finish()
|
|
|
|
-- Draw UI on top
|
|
local w, h = self.downscaled_canvas:getDimensions()
|
|
ScreenScaler:start(1000, h/w * 1000)
|
|
love.graphics.setColor(1, 1, 1)
|
|
love.graphics.print("Hello World!")
|
|
ScreenScaler:finish()
|
|
|
|
-- Override scaling factors from UI, with scalers for the game
|
|
ScreenScaler:overrideScaling(self.downscaled_canvas:getDimensions())
|
|
end
|
|
|
|
return MainState
|