-- Main entry point function love.load() -- Load modules (defines globals) require "asset_loader" require "config" require "utils" require "state_machine" require "input_manager" require "room_manager" require "gfx.sprite" require "gfx.hud" require "entities.particle_system" require "entities.floating_text" require "entities.projectile" require "entities.combatant" require "entities.drop" require "entities.weapon" require "skills.imports" require "behaviors.imports" require "rooms.imports" require "states.title" require "states.char_select" require "states.game" require "sound" require "game_context" -- Input manager local inputManager = InputManager:new() -- Init sound effects Sound.init(SOUNDS) -- Init particle effect presets ParticleEffects:initPresets() -- Asset loader local assetLoader = AssetLoader:new() -- State machine SM = StateMachine:new() SM.input = inputManager SM.assetLoader = assetLoader SM:add(Config.STATES.TITLE, TitleState:new(SM)) SM:add(Config.STATES.CHAR_SELECT, CharSelectState:new(SM)) SM:add(Config.STATES.GAME, GameState:new(SM)) SM:change(Config.STATES.TITLE) -- Graphics setup love.window.setMode(1280, 720, { resizable = true }) love.window.setTitle("Roguelike Platformer") love.graphics.setDefaultFilter("nearest", "nearest") love.graphics.setColor(1, 1, 1, 1) love.graphics.setFont(assetLoader:loadFont("RasterForgeRegular-JpBgm")) -- Render target for scaling RenderTarget = love.graphics.newCanvas(Config.SCREEN_W, Config.SCREEN_H) RenderTarget:setFilter("nearest", "nearest") end function love.update(dt) SM:update(dt) end function love.draw() local winW, winH = love.graphics.getDimensions() -- Calculate scale maintaining aspect ratio local scaleX = winW / Config.SCREEN_W local scaleY = winH / Config.SCREEN_H local scale = math.min(scaleX, scaleY) -- Calculate offset for centering local drawW = Config.SCREEN_W * scale local drawH = Config.SCREEN_H * scale local offsetX = (winW - drawW) / 2 local offsetY = (winH - drawH) / 2 -- Draw to render target at internal resolution love.graphics.setCanvas({ RenderTarget, clear = true, stencil = true }) love.graphics.origin() SM:draw() love.graphics.setCanvas() -- Draw scaled to window love.graphics.draw(RenderTarget, offsetX, offsetY, 0, scale, scale) end -- Keyboard callbacks function love.keypressed(key) SM.input:setInput(InputManager.KEYBOARD_SOURCE, key, true) end function love.keyreleased(key) SM.input:setInput(InputManager.KEYBOARD_SOURCE, key, false) end -- Gamepad callbacks function love.gamepadpressed(gamepad, button) SM.input:setInput(gamepad, button, true) end function love.gamepadreleased(gamepad, button) SM.input:setInput(gamepad, button, false) end