bjorn 9 年之前
父节点
当前提交
1902001f4f

+ 3 - 6
app/core/view.lua

@@ -3,11 +3,11 @@ View = class()
 local g = love.graphics
 
 function View:init()
-  love.window.setMode(ctx.options.windowWidth, ctx.options.windowHeight, {
+  --[[love.window.setMode(ctx.options.windowWidth, ctx.options.windowHeight, {
 		fullscreen = ctx.options.fullscreen,
 		fullscreentype = ctx.options.borderless and 'desktop' or 'normal',
 		vsync = ctx.options.vsync
-	})
+	})]]
 
   self.x = 0
   self.y = 0
@@ -116,11 +116,8 @@ function View:resize()
 
   self.sourceCanvas = love.graphics.newCanvas(w, h)
   self.targetCanvas = love.graphics.newCanvas(w, h)
-  data.media.refresh('shaders')
-  data.media.refresh('graphics')
   Typo.resize()
-  data.load()
-  collectgarbage()
+  ctx.event:emit('view.resize')
 end
 
 function View:register(x, action)

+ 0 - 82
app/loader.lua

@@ -1,82 +0,0 @@
-data = {}
-data.load = function()
-  love.filesystem.unmount('data.zip')
-  if love.filesystem.exists('data.zip') then love.filesystem.mount('data.zip', '/') end
-
-  -- Media
-  local function lookup(ext, fn)
-    local function halp(s, k)
-      local base = s._path .. '/' .. k
-      if love.filesystem.exists(base .. ext) then
-        s[k] = fn(base .. ext)
-      elseif love.filesystem.isDirectory(base) then
-        local t = {}
-        t._path = base
-        setmetatable(t, {__index = halp})
-        s[k] = t
-      end
-
-      return rawget(s, k)
-    end
-    return halp
-  end
-
-  data.media = {}
-  data.media.refresh = function(k)
-    if k == 'graphics' then data.media.graphics = setmetatable({_path = 'data/media/graphics'}, {__index = lookup('.png', love.graphics.newImage)})
-    elseif k == 'shaders' then data.media.shaders = setmetatable({_path = 'data/media/shaders'}, {__index = lookup('.shader', love.graphics.newShader)})
-    elseif k == 'sounds' then data.media.sounds = setmetatable({_path = 'data/media/sounds'}, {__index = lookup('.ogg', love.audio.newSource)}) end
-  end
-  data.media.refresh('graphics')
-  data.media.refresh('shaders')
-  data.media.refresh('sounds')
-
-  -- Data
-  local function load(dir, type, fn)
-    local id = 1
-    local function halp(dir, dst)
-      for _, file in ipairs(love.filesystem.getDirectoryItems(dir)) do
-        path = dir .. '/' .. file
-        if love.filesystem.isDirectory(path) then
-          dst[file] = {}
-          halp(path, dst[file])
-        elseif file:match('%.lua$') and not file:match('^%.') then
-          local obj = love.filesystem.load(path)()
-          obj = f.exe(fn, obj) or obj
-          obj.id = id
-          data[type][id] = obj
-          dst[obj.code] = obj
-          id = id + 1
-        end
-      end
-    end
-
-    data[type] = {}
-    halp(dir, data[type])
-  end
-
-  load('data/weapon', 'weapon')
-  load('data/skill', 'skill')
-  load('data/buff', 'buff')
-  load('data/spell', 'spell')
-  load('data/class', 'class')
-  load('data/mods', 'mods')
-  load('data/particle', 'particle')
-  load('data/prop', 'prop')
-  load('data/effect', 'effect')
-  load('data/weather', 'weather')
-
-  local function requireAll(dir)
-    for _, file in pairs(love.filesystem.getDirectoryItems(dir)) do
-      local path = dir .. '/' .. file
-      if string.find(path, '%.lua') and not string.find(path, '%..+%.lua') then
-        require(path:gsub('%.lua', ''))
-      end
-    end
-
-    if love.filesystem.exists(dir .. '.lua') then require(dir) end
-  end
-
-  requireAll('data/menu')
-  requireAll('data/hud')
-end

+ 0 - 1
app/patcher.lua

@@ -10,7 +10,6 @@ function Patcher:load()
 	if false and code and f.exe(self['patch' .. os], self, code, gameData) then
 		love.event.quit()
 	else
-		data.load()
 		Context:remove(self)
 		Context:add(Menu)
 	end

+ 1 - 1
app/players.lua

@@ -105,7 +105,7 @@ end
 function Players:setClass(id, class, team)
   local p = self.players[id]
   if not table.has(self.active, id) then self:activate(id) end
-  p.class = data.class[class]
+  p.class = data.class[data.class.list[class]]
   p.team = team
   p:activate()
 end

+ 1 - 0
data/class/list.lua

@@ -0,0 +1 @@
+return {'brute', 'eva', 'lasermcgee', 'wrexx'}

+ 1 - 3
data/hud/hudchat.lua

@@ -1,5 +1,3 @@
-local rich = require 'lib/richtext'
-
 HudChat = class()
 
 local g = love.graphics
@@ -106,5 +104,5 @@ end
 function HudChat:refresh(width)
   local u, v = ctx.hud.u, ctx.hud.v
   local width = u * .35
-  self.richText = rich:new({self.log, width, white = {255, 255, 255}, purple = {190, 160, 220}, orange = {240, 160, 140}, red = {255, 0, 0}, green = {0, 255, 0}})
+  self.richText = lib.richtext:new({self.log, width, white = {255, 255, 255}, purple = {190, 160, 220}, orange = {240, 160, 140}, red = {255, 0, 0}, green = {0, 255, 0}})
 end

+ 19 - 16
data/hud/hudclassselect.lua

@@ -22,11 +22,12 @@ function HudClassSelect:update()
 
   local u, v = ctx.hud.u, ctx.hud.v
   local x, y = ctx.view:frameMouseX(), ctx.view:frameMouseY()
-  for i = 1, #data.class do
+  for i = 1, #data.class.list do
+    local class = data.class[data.class.list[i]]
     if math.inside(x, y, u * .09 * i, v * .326, u * .08, u * .08) then
-      self.offense = math.lerp(self.offense, data.class[i].offense, math.min(12 * tickRate, 1))
-      self.defense = math.lerp(self.defense, data.class[i].defense, math.min(12 * tickRate, 1))
-      self.utility = math.lerp(self.utility, data.class[i].utility, math.min(12 * tickRate, 1))
+      self.offense = math.lerp(self.offense, class.offense, math.min(12 * tickRate, 1))
+      self.defense = math.lerp(self.defense, class.defense, math.min(12 * tickRate, 1))
+      self.utility = math.lerp(self.utility, class.utility, math.min(12 * tickRate, 1))
     end
   end
 
@@ -63,22 +64,24 @@ function HudClassSelect:draw()
   g.print('Team', u * .08, v * .106)
 
   hover = false
-  for i = 1, #data.class do
+  for i = 1, #data.class.list do
+    local class = data.class[data.class.list[i]]
+
     g.setColor(255, 255, 255, 25)
     g.rectangle('line', u * .09 * i, v * .326, u * .08, u * .08)
 
     if math.inside(x, y, u * .09 * i, v * .326, u * .08, u * .08) then
       hover = true
-      self:drawClassDetails(i)
-      g.setColor(255, 255, 255, data.class[i].locked and 50 or 255)
+      self:drawClassDetails(class)
+      g.setColor(255, 255, 255, class.locked and 50 or 255)
     else
-      g.setColor(255, 255, 255, data.class[i].locked and 50 or 150)
+      g.setColor(255, 255, 255, class.locked and 50 or 150)
     end
 
-    local s = u * .08 / data.class[i].portrait:getWidth()
-    g.draw(data.class[i].portrait, u * .09 * i, v * .326, 0, s, s)
+    local s = u * .08 / class.portrait:getWidth()
+    g.draw(class.portrait, u * .09 * i, v * .326, 0, s, s)
     g.setFont('pixel', 8)
-    g.print(data.class[i].name, u * .09 * i + 4, v * .326)
+    g.print(class.name, u * .09 * i + 4, v * .326)
     g.setFont('BebasNeue', v * .065)
   end
 
@@ -107,7 +110,8 @@ function HudClassSelect:keypressed(key)
 
   if self.active then
     for i = 1, #data.class do
-      if not data.class[i].locked and key == tostring(i) then
+      local class = data.class[data.class.list[i]]
+      if not class.locked and key == tostring(i) then
         ctx.net:send(msgClass, {
           class = i,
           team = ctx.id > 1 and 1 or 0
@@ -127,8 +131,8 @@ function HudClassSelect:mousereleased(x, y, button)
   x, y = ctx.view:frameMouseX(), ctx.view:frameMouseY()
 
   if self.active and button == 'l' then
-    for i = 1, #data.class do
-      if not data.class[i].locked and math.inside(x, y, u * .09 * i, v * .326, u * .08, u * .08) then
+    for i = 1, #data.class.list do
+      if not data.class[data.class.list[i]].locked and math.inside(x, y, u * .09 * i, v * .326, u * .08, u * .08) then
         ctx.net:send(msgClass, {
           class = i,
           team = self.team
@@ -155,8 +159,7 @@ function HudClassSelect:mousereleased(x, y, button)
   return self.active
 end
 
-function HudClassSelect:drawClassDetails(index)
-  local class = data.class[index]
+function HudClassSelect:drawClassDetails(class)
   local u, v = ctx.hud.u, ctx.hud.v
   local fh = g.getFont():getHeight()
   local yy = v * .318

+ 4 - 4
data/maps/jungleCarnage/jungleCarnage.lua

@@ -16,13 +16,13 @@ jungleCarnage.wallTexture = 'wallStone'
 jungleCarnage.spawn = {}
 
 jungleCarnage.spawn[purple] = {
-    x = 128,
-    y = 128
+  x = 128,
+  y = 128
 }
 
 jungleCarnage.spawn[orange] = {
-    x = jungleCarnage.width - 128,
-    y = jungleCarnage.height - 128
+  x = jungleCarnage.width - 128,
+  y = jungleCarnage.height - 128
 }
 
 return jungleCarnage

+ 0 - 0
data/media/shaders/colorize.shader → data/media/shaders/colorize.glsl


+ 0 - 0
data/media/shaders/darkenBehind.shader → data/media/shaders/darkenBehind.glsl


+ 0 - 0
data/media/shaders/desaturate.shader → data/media/shaders/desaturate.glsl


+ 0 - 0
data/media/shaders/fxaa.shader → data/media/shaders/fxaa.glsl


+ 0 - 0
data/media/shaders/horizontalBlur.shader → data/media/shaders/horizontalBlur.glsl


+ 0 - 0
data/media/shaders/motionBlur.shader → data/media/shaders/motionBlur.glsl


+ 0 - 0
data/media/shaders/threshold.shader → data/media/shaders/threshold.glsl


+ 0 - 0
data/media/shaders/verticalBlur.shader → data/media/shaders/verticalBlur.glsl


+ 0 - 0
data/media/shaders/vignette.shader → data/media/shaders/vignette.glsl


+ 0 - 1
data/prop/wall.lua

@@ -4,7 +4,6 @@ Wall.code = 'wall'
 
 Wall.collision = {}
 Wall.collision.shape = 'rectangle'
-Wall.collision.static = true
 Wall.collision.tag = 'wall'
 
 local function perim(x, y, l, t, w, h)

+ 77 - 0
lib/cargo.lua

@@ -0,0 +1,77 @@
+local cargo = {}
+
+local function merge(target, source, ...)
+  if not target or not source then return target end
+  for k, v in pairs(source) do target[k] = v end
+  return merge(target, ...)
+end
+
+local la, lf, lg = love.audio, love.filesystem, love.graphics
+
+local function makeFont(path)
+  return function(size)
+    return lg.newFont(path, size)
+  end
+end
+
+local function loadFile(path)
+  return lf.load(path)()
+end
+
+cargo.loaders = {
+  lua = lf and loadFile,
+  png = lg and lg.newImage,
+  jpg = lg and lg.newImage,
+  dds = lg and lg.newImage,
+  glsl = lg and lg.newShader,
+  mp3 = la and la.newSource,
+  ogg = la and la.newSource,
+  wav = la and la.newSource,
+  txt = lf and lf.read,
+  ttf = lg and makeFont
+}
+
+cargo.processors = {}
+
+function cargo.init(config)
+  if type(config) == 'string' then
+    config = {dir = config}
+  end
+
+  local loaders = merge({}, cargo.loaders, config.loaders)
+  local processors = merge({}, cargo.processors, config.processors)
+
+  local init
+
+  local function halp(t, k)
+    local path = (t._path .. '/' .. k):gsub('^/+', '')
+    if lf.isDirectory(path) then
+      rawset(t, k, init(path))
+      return t[k]
+    else
+      for extension, loader in pairs(loaders) do
+        local file = path .. '.' .. extension
+        if loader and lf.exists(file) then
+          local asset = loader(file)
+          rawset(t, k, asset)
+          for pattern, processor in pairs(processors) do
+            if file:match(pattern) then
+              processor(asset, file, t)
+            end
+          end
+          return asset
+        end
+      end
+    end
+
+    return rawget(t, k)
+  end
+
+  init = function(path)
+    return setmetatable({_path = path}, {__index = halp})
+  end
+
+  return init(config.dir)
+end
+
+return cargo

+ 7 - 0
main.lua

@@ -1,3 +1,10 @@
+require 'lib/util'
+require 'lib/slam'
+setmetatable(_G, {
+  __index = require('lib/cargo').init('/')
+})
+
 require 'require'
+
 Context:bind(Patcher)
 

+ 2 - 1
require.lua

@@ -10,8 +10,9 @@ local function load(dir)
 end
 
 require 'enet'
-load 'lib'
 load 'app/core'
 load 'app'
 load 'app/editor'
 load 'app/goregous'
+load 'data/menu'
+load 'data/hud'