AssetLoader = {} AssetLoader.__index = AssetLoader function AssetLoader:new(path) self = setmetatable({}, AssetLoader) self.path = path or "assets" self.loaded = {} return self end function AssetLoader:getAssetPath(assetType, assetTypeName, assetName, assetExt) local path = self.path .. "/" .. assetType .. "/" if assetTypeName then path = path .. assetTypeName .. "/" end path = path .. (assetName or "sprite") .. "." .. (assetExt or "png") return path end function AssetLoader:loadFont(fontName) local path = self:getAssetPath("fonts", nil, fontName, "ttf") if not self.loaded[path] then self.loaded[path] = love.graphics.newFont(path) end return self.loaded[path] end function AssetLoader:loadImage(name) local key = "image." .. name if not self.loaded[key] then self.loaded[key] = love.graphics.newImage(self.path .. "/images/" .. name .. ".png") end return self.loaded[key] end function AssetLoader:loadImageByType(assetType, assetTypeName, imageName) local path = self:getAssetPath(assetType, assetTypeName, imageName, "png") if not self.loaded[path] then self.loaded[path] = love.graphics.newImage(path) end return self.loaded[path] end function AssetLoader:loadImageDataByType(assetType, assetTypeName, imageName) local path = self:getAssetPath(assetType, assetTypeName, imageName, "png") if not self.loaded[path] then self.loaded[path] = love.image.newImageData(path) end return self.loaded[path] end function AssetLoader:loadCharacterImage(name) return self:loadImageByType("characters", name) end function AssetLoader:loadEnemyImage(name) return self:loadImageByType("enemies", name) end function AssetLoader:loadWeaponImage(name) return self:loadImageByType("weapons", name) end function AssetLoader:loadWeaponDropImage(name) return self:loadImageByType("weapons", name, "drop") end function AssetLoader:loadSkillImage(skillName, imageName) return self:loadImageByType("skills", skillName, imageName) end function AssetLoader:tryLoadImageByType(assetType, assetTypeName, imageName) local path = self:getAssetPath(assetType, assetTypeName, imageName, "png") if not self.loaded[path] then local ok, image = pcall(love.graphics.newImage, path) if ok then self.loaded[path] = image else self.loaded[path] = nil end end return self.loaded[path] end function AssetLoader:loadRoomImage(roomName, imageName) return self:loadImageByType("rooms", roomName, imageName) end function AssetLoader:loadRoomImageData(roomName, imageName) return self:loadImageDataByType("rooms", roomName, imageName) end function AssetLoader:loadCharacter(characterName) local fullPath = self.path .. "/characters/" .. characterName .. "/" return { name = characterName, config = require(fullPath .. "config"), image = self:loadCharacterImage(characterName) } end function AssetLoader:loadEnemy(enemyName) local fullPath = self.path .. "/enemies/" .. enemyName .. "/" return { name = enemyName, config = require(fullPath .. "config"), image = self:loadEnemyImage(enemyName) } end function AssetLoader:loadWeapon(weaponName) local fullPath = self.path .. "/weapons/" .. weaponName .. "/" return { name = weaponName, config = require(fullPath .. "config"), image = self:loadWeaponImage(weaponName), drop = self:loadWeaponDropImage(weaponName), } end function AssetLoader:loadSkill(skillName) local fullPath = self.path .. "/skills/" .. skillName .. "/" return { name = skillName, config = require(fullPath .. "config"), icon = self:loadSkillImage(skillName, "icon"), drop = self:tryLoadImageByType("skills", skillName, "drop"), imageLoader = function(imageName) return self:loadSkillImage(skillName, imageName) end, } end function AssetLoader:loadRoom(roomName) local fullPath = self.path .. "/rooms/" .. roomName .. "/" return { name = roomName, config = require(fullPath .. "config"), imageLoader = function(imageName) return self:loadRoomImage(roomName, imageName) end, imageDataLoader = function(imageName) return self:loadRoomImageData(roomName, imageName) end } end