From fa4b2c86b5ec4a3ce79ccc7131199b6adf812b9a Mon Sep 17 00:00:00 2001 From: binarycat Date: Wed, 16 Mar 2022 13:54:04 -0400 Subject: [PATCH] somewhat kinda got things working again --- code/chunk.lua | 48 +++++++++++++++++++++++++++++++++++-- code/in_out.lua | 28 ++++++++++++++-------- code/level.lua | 62 ++++++++++++++++++++++++++++++------------------ code/require.lua | 1 + 4 files changed, 104 insertions(+), 35 deletions(-) diff --git a/code/chunk.lua b/code/chunk.lua index d503bb0..2f0b0e3 100644 --- a/code/chunk.lua +++ b/code/chunk.lua @@ -1,7 +1,51 @@ -- pieces of levels -Chunk = {} +Chunk = {all = {}} Chunk.__index = Chunk -function Chunk:new(file, rect) +-- CLASS METHODS + +-- box == nil for global chunks +function Chunk:new(filename, box) + local o = { filename = filename, box = box } + setmetatable(o, self) + self.all[o] = true end + +function Chunk:getExportList() + local r = {} + for chunk in pairs(self.all) do + table.insert(r, chunk) + end + return r +end + +-- INSTANCE METHODS + +function Chunk:containsPoint(pt) + return self.box == nil or self.box:containsPoint(pt) +end + +function Chunk:load() + if self.loaded then + return + end + logPrint("loading chunk "..self.filename) + self.data = dofile(level_current.."/chunks/"..self.filename) + self.loaded = { rooms = {}, collisions = {} } + LevelTiles = self.data.tiles + indexLevelTiles() + optimizeTileObjects(self.loaded.collisions) + + for _, v in ipairs(self.data.rooms or {}) do + local room = Collision:new(v[1],v[2],v[3],v[4]) + table.insert(self.data.rooms, room) + table.insert(LoadedObjects.Rooms, room) + end + logPrint("loaded chunk with "..#self.loaded.collisions.." collisions") +end + +function Chunk:save(chunkdir) + love.filesystem.write(chunkdir.."/chunks/"..self.filename, "return "..serialize_lua_data(self.data)) +end + diff --git a/code/in_out.lua b/code/in_out.lua index 895ccee..a40ecb9 100644 --- a/code/in_out.lua +++ b/code/in_out.lua @@ -17,22 +17,30 @@ function exportLevel(levelname, dirname) exportTable.name = levelname exportTable.tileset = "library" exportTable.properties = LevelData.properties - exportTable.tiles = LevelTiles - logPrint("- objects") - exportTable.objects = { spawns = {}, rooms = {} } - logPrint(" - spawns") - for i, v in ipairs(LoadedObjects.Spawns) do + --exportTable.tiles = LevelTiles + --logPrint("- objects") + --exportTable.objects = { spawns = {}, rooms = {} } + --logPrint(" - spawns") + --for i, v in ipairs(LoadedObjects.Spawns) do --exportTable.objects.spawns = {v.archetype.name,{},v.args} - end + --end - logPrint(" - rooms") + --logPrint(" - rooms") - for i, room in ipairs(LoadedObjects.Rooms) do - table.insert(exportTable.objects.rooms,{room:asRect():getCoords()}) - end + --for i, room in ipairs(LoadedObjects.Rooms) do + --- table.insert(exportTable.objects.rooms,{room:asRect():getCoords()}) + --end + exportTable.chunks = Chunk:getExportList() logPrint("Writing to file...") local ok, err = love.filesystem.write(dirname.."/level.lua", "return "..serialize_lua_value(exportTable)) + if ok then + logPrint("Saving chunks...") + local chunkdir = dirname.."/chunks" + love.filesystem.createDirectory(chunkdir) + for chunk in Chunk.all do + chunk:save(chunkdir) + end logPrint("Exporting complete.") else logPrint("Exporting failed: "..err) diff --git a/code/level.lua b/code/level.lua index 315104e..247be80 100644 --- a/code/level.lua +++ b/code/level.lua @@ -1,12 +1,25 @@ function loadLevelTiles() math.randomseed(3) - LevelData = dofile( love.filesystem.getSaveDirectory().."/export/unnamed_level/level.lua") + level_current = love.filesystem.getSaveDirectory().."/export/test1" + LevelData = dofile(level_current.."/level.lua") + LoadedObjects.Collisions = {} + LoadedObjects.Platforms = {} + LoadedObjects.Ladders = {} + LoadedObjects.Hazards = {} if type(LevelData.tileset) == "string" then LevelData.tileset_name = LevelData.tileset end LevelData.tileset = tileset[LevelData.tileset_name] - --dofile("data/levels/"..level_current) + getLevelTileData() + + for _, v in ipairs(LevelData.chunks) do + Chunk:new(v[1], v[2]) + end + local global_chunk = next(Chunk.all) + global_chunk:load() + LoadedObjects.Collisions = global_chunk.loaded.collisions + --[[ on level format: @@ -17,11 +30,11 @@ function loadLevelTiles() overlay_depth = foreground/background overlay depth type = collision type ]] - getLevelTileData() + LevelTiles = LevelData.tiles updateLevelDimensions() - indexLevelTiles() - createTileObjects() + -- + --createTileObjects() createRoomObjects() getSpawns() end @@ -263,7 +276,7 @@ function drawGridDisplay() end end -function optimizeTileObjects() +function optimizeTileObjects(dest) logPrint("Optimizing Objects...") local unoptimized = 0 local isTileOptimized = {} @@ -343,22 +356,20 @@ function optimizeTileObjects() base_x + tile_properties.width * tile_properties.scale * n, base_y + tile_properties.height * tile_properties.scale * m ) - table.insert(LoadedObjects.Collisions,col) + table.insert(dest,col) end end end end - logPrint("collisions optimized from " .. unoptimized .. " to " .. #LoadedObjects.Collisions) + --logPrint("collisions optimized from " .. unoptimized .. " to " .. #LoadedObjects.Collisions) end -function createTileObjects() - LoadedObjects.Collisions = {} - LoadedObjects.Platforms = {} - LoadedObjects.Ladders = {} - LoadedObjects.Hazards = {} +-- currently broken +function createTileObjects(dest) - optimizeTileObjects() + + optimizeTileObjects(dest.collisions) for i = 1, #LevelTiles do for j = 1, #LevelTiles[i] do @@ -378,6 +389,9 @@ function createTileObjects() ) end + local col + local list = dest.collisions + -- wholes are handled in optimization now --[[if type == "whole" then local col = Collision:new( @@ -389,33 +403,33 @@ function createTileObjects() table.insert(LoadedObjects.Collisions,col) else]]if type == "half_bottom" then - local col = Collision:new( + col = Collision:new( base_x, base_y + tile_properties.height/2 * tile_properties.scale, base_x + tile_properties.width * tile_properties.scale, base_y + tile_properties.height * tile_properties.scale ) - table.insert(LoadedObjects.Collisions,col) + elseif type == "half_top" then - local col = Collision:new( + col = Collision:new( base_x, base_y , base_x + tile_properties.width * tile_properties.scale, base_y + tile_properties.height/2 * tile_properties.scale ) - table.insert(LoadedObjects.Collisions,col) + elseif type == "half_right" then - local col = Collision:new( + col = Collision:new( base_x + tile_properties.height/2 * tile_properties.scale, base_y, base_x + tile_properties.width * tile_properties.scale, base_y + tile_properties.height * tile_properties.scale ) - table.insert(LoadedObjects.Collisions,col) + elseif type == "half_left" then @@ -586,7 +600,8 @@ function createTileObjects() end - elseif type == "ladder_right" then + -- TODO: fix ladders + --[[elseif type == "ladder_right" then local ladder = Collision:new( base_x + (tile_properties.width-4)* tile_properties.scale, @@ -644,7 +659,7 @@ function createTileObjects() ) table.insert(LoadedObjects.Platforms,plat) - elseif type == "bottom_hazard" then + ]]elseif type == "bottom_hazard" then local hazard = Collision:new( @@ -653,9 +668,10 @@ function createTileObjects() base_x + tile_properties.width * tile_properties.scale, base_y + tile_properties.height * tile_properties.scale ) - table.insert(LoadedObjects.Hazards,hazard) + list = dest.hazards end + table.insert(list, col) end end end diff --git a/code/require.lua b/code/require.lua index 9b42641..246d750 100644 --- a/code/require.lua +++ b/code/require.lua @@ -16,6 +16,7 @@ require "code/in_out" -- classes require "code/point" require "code/rect" +require "code/chunk" require "code/objects" require "code/level" require "code/camera"