remove test; save more robustly
This commit is contained in:
parent
b8e00cf340
commit
bfed3af852
7
bmp.lua
7
bmp.lua
|
@ -51,7 +51,6 @@ end
|
||||||
local function getHeader( filename )
|
local function getHeader( filename )
|
||||||
local offset = 2 + love.data.unpack( "<I4", assert(love.filesystem.read( "data", filename, 14 )), 11 )
|
local offset = 2 + love.data.unpack( "<I4", assert(love.filesystem.read( "data", filename, 14 )), 11 )
|
||||||
local header, size = assert( love.filesystem.read( filename, offset ) )
|
local header, size = assert( love.filesystem.read( filename, offset ) )
|
||||||
print( "BMP HEADER", filename, size, "\n", string.byte( header, 1, size ) )
|
|
||||||
return header
|
return header
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -74,7 +73,7 @@ local formats = {
|
||||||
header = getHeader( "data/earth/sailable.bmp" ),
|
header = getHeader( "data/earth/sailable.bmp" ),
|
||||||
w = 512,
|
w = 512,
|
||||||
h = 285,
|
h = 285,
|
||||||
--technically this information is in the header already but I don't want to write code to parse it since we only use this one header
|
--technically this information is in the header already but I don't want to write code to parse it we only use one palette ever
|
||||||
palette = {
|
palette = {
|
||||||
[0] = 0,
|
[0] = 0,
|
||||||
[8] = 1,
|
[8] = 1,
|
||||||
|
@ -159,7 +158,6 @@ function formats.ai:encode( data )
|
||||||
local x = math.floor(self.w * (wx + 180) / 360)
|
local x = math.floor(self.w * (wx + 180) / 360)
|
||||||
--idk why exactly I need to round the value here instead of truncating it
|
--idk why exactly I need to round the value here instead of truncating it
|
||||||
local y = math.floor(0.5 + self.h * (wy + 100) / 200)
|
local y = math.floor(0.5 + self.h * (wy + 100) / 200)
|
||||||
print( "export ai marker", i, x, y, wx, wy )
|
|
||||||
--get index into byte array
|
--get index into byte array
|
||||||
local idx = 2 + y * self.w + x
|
local idx = 2 + y * self.w + x
|
||||||
--in-editor we could have two points in the same place, possibly of the same or different types
|
--in-editor we could have two points in the same place, possibly of the same or different types
|
||||||
|
@ -224,7 +222,6 @@ function formats.travel:encode( points )
|
||||||
local offset = math.floor( y * self.w + x - 2 )
|
local offset = math.floor( y * self.w + x - 2 )
|
||||||
--1 := white
|
--1 := white
|
||||||
bitmap[offset] = 1
|
bitmap[offset] = 1
|
||||||
print( "encoded:", point.idx, wx, wy, x, y )
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--fold into 4-bit pixel array
|
--fold into 4-bit pixel array
|
||||||
|
@ -313,7 +310,7 @@ formats.territory = formats.africa
|
||||||
for fmt, tbl in pairs( formats ) do
|
for fmt, tbl in pairs( formats ) do
|
||||||
t[fmt] = function( data ) return tbl:encode( data ) end
|
t[fmt] = function( data ) return tbl:encode( data ) end
|
||||||
--TESTING
|
--TESTING
|
||||||
tbl:test()
|
--tbl:test()
|
||||||
end
|
end
|
||||||
|
|
||||||
return t
|
return t
|
|
@ -0,0 +1,104 @@
|
||||||
|
-- mkdir only
|
||||||
|
-- A portable filesystem API using LuaJIT's FFI
|
||||||
|
-- Retrieved 2024-07-13 from https://gist.githubusercontent.com/Techcable/503f35ceea9554fb81cf3a5c1aa550da/raw/33a29f59207335b743824fbb657e4721a12ce280/fs.lua
|
||||||
|
local ffi = require("ffi")
|
||||||
|
local table = require("table")
|
||||||
|
require("string")
|
||||||
|
-- Cache needed functions and locals
|
||||||
|
local C, errno, string = ffi.C, ffi.errno, ffi.string
|
||||||
|
local concat, insert = table.concat, table.insert
|
||||||
|
|
||||||
|
-- "Standard" C99 functions
|
||||||
|
ffi.cdef[[
|
||||||
|
char *strerror(int errnum);
|
||||||
|
]]
|
||||||
|
|
||||||
|
local exists, mkdir, PATH_SEPARATOR
|
||||||
|
if ffi.os == "Windows" then
|
||||||
|
ffi.cdef[[
|
||||||
|
bool CreateDirectoryA(const char *path, void *lpSecurityAttributes);
|
||||||
|
int _access(const char *path, int mode);
|
||||||
|
]]
|
||||||
|
function exists(path)
|
||||||
|
assert(type(path) == "string", "path isn't a string")
|
||||||
|
local result = C._access(path, 0) -- Check existence
|
||||||
|
return result == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
function mkdir(path, _)
|
||||||
|
assert(type(path) == "string", "path isn't a string")
|
||||||
|
if not C.CreateDirectoryA(path, nil) then
|
||||||
|
local message = string(C.strerror(errno()))
|
||||||
|
error("Unable to create directory " .. path .. ": " .. message)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
PATH_SEPARATOR = "\\"
|
||||||
|
elseif ffi.os == "Linux" or ffi.os == "OSX" then
|
||||||
|
ffi.cdef[[
|
||||||
|
int mkdir(const char *path, int mode);
|
||||||
|
int access(const char *path, int amode);
|
||||||
|
]]
|
||||||
|
function exists(path)
|
||||||
|
assert(type(path) == "string", "path isn't a string")
|
||||||
|
local result = C.access(path, 0) -- Check existence
|
||||||
|
return result == 0
|
||||||
|
end
|
||||||
|
function mkdir(path, mode)
|
||||||
|
assert(type(path) == "string", "path isn't a string")
|
||||||
|
local mode = tonumber(mode or "755", 8)
|
||||||
|
if C.mkdir(path, mode) ~= 0 then
|
||||||
|
local message = string(C.strerror(errno()))
|
||||||
|
error("Unable to create directory " .. path .. ": " .. message)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
PATH_SEPARATOR = "/"
|
||||||
|
else
|
||||||
|
error("Unsupported operating system: " .. ffi.os)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function join(...)
|
||||||
|
local parts = {}
|
||||||
|
for i = 1, select("#", ...) do
|
||||||
|
local part = select(i, ...)
|
||||||
|
insert(parts, part)
|
||||||
|
end
|
||||||
|
return concat(parts, PATH_SEPARATOR)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function splitPath(path)
|
||||||
|
assert(type(path) == "string", "path isn't a string!")
|
||||||
|
local parts = {}
|
||||||
|
local lastIndex = 0
|
||||||
|
for i = 1, path:len() do
|
||||||
|
if path:sub(i, i) == PATH_SEPARATOR then
|
||||||
|
insert(parts, path:sub(lastIndex, i - 1))
|
||||||
|
lastIndex = i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
insert(parts, path:sub(lastIndex))
|
||||||
|
return parts
|
||||||
|
end
|
||||||
|
|
||||||
|
local function mkdirs(path)
|
||||||
|
local parts = splitPath(path)
|
||||||
|
local currentPath = parts[1]
|
||||||
|
for i=2, #parts do
|
||||||
|
if not exists(currentPath) then
|
||||||
|
mkdir(currentPath)
|
||||||
|
end
|
||||||
|
-- Note: This isn't suboptimal, since we really do need the intermediate results
|
||||||
|
currentPath = currentPath .. PATH_SEPARATOR .. parts[i]
|
||||||
|
end
|
||||||
|
if not exists(path) then
|
||||||
|
mkdir(path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
exists = exists,
|
||||||
|
join = join,
|
||||||
|
mkdir = mkdir,
|
||||||
|
mkdirs = mkdirs,
|
||||||
|
splitPath = splitPath,
|
||||||
|
PATH_SEPERATOR = PATH_SEPARATOR
|
||||||
|
}
|
15
map.lua
15
map.lua
|
@ -1,3 +1,6 @@
|
||||||
|
local love = assert( love )
|
||||||
|
local io = io
|
||||||
|
local mkdir = assert( require 'lib.mkdir' )
|
||||||
local lg = love.graphics
|
local lg = love.graphics
|
||||||
local AI = require 'ai'
|
local AI = require 'ai'
|
||||||
local Cities = require 'cities'
|
local Cities = require 'cities'
|
||||||
|
@ -179,16 +182,22 @@ function map.draw()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function write( filename, string )
|
local function write( filename, string )
|
||||||
--
|
|
||||||
print( "Writing", string:len(), "bytes to", filename )
|
print( "Writing", string:len(), "bytes to", filename )
|
||||||
os.rename( filename, filename..".bak" ) --just in case :^)
|
local file = assert( io.open( filename, "wb" ) )
|
||||||
local file = assert( io.open( filename, "wb+" ) )
|
|
||||||
assert( file:write( string ) )
|
assert( file:write( string ) )
|
||||||
assert( file:flush() ) --your toilet is set to stun, not kill
|
assert( file:flush() ) --your toilet is set to stun, not kill
|
||||||
file:close()
|
file:close()
|
||||||
end
|
end
|
||||||
|
|
||||||
function map.save()
|
function map.save()
|
||||||
|
--should be cross platform-ish
|
||||||
|
for _, folder in ipairs{ "/data/", "/data/earth/", "/data/graphics/" } do
|
||||||
|
assert( mkdir.exists( map.path ) )
|
||||||
|
local path = map.path..folder
|
||||||
|
if not mkdir.exists( path ) then mkdir.mkdir( path ) end
|
||||||
|
end
|
||||||
|
|
||||||
|
--OK back to normal
|
||||||
for k, layer in pairs( layers ) do
|
for k, layer in pairs( layers ) do
|
||||||
write( map.path..tostring( layer.filename ), assert( layer:save() ) )
|
write( map.path..tostring( layer.filename ), assert( layer:save() ) )
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,7 +4,7 @@ local button = require( "button" )
|
||||||
local map = require( "map" )
|
local map = require( "map" )
|
||||||
local t = {}
|
local t = {}
|
||||||
|
|
||||||
local saveLocation = map.path
|
local saveLocation = false
|
||||||
local floppy = love.graphics.newImage( "icons/save.png" )
|
local floppy = love.graphics.newImage( "icons/save.png" )
|
||||||
floppy:setFilter( "nearest", "nearest" )
|
floppy:setFilter( "nearest", "nearest" )
|
||||||
local saveButton = button.new{
|
local saveButton = button.new{
|
||||||
|
@ -35,8 +35,9 @@ local cancelButton = button.new{
|
||||||
|
|
||||||
function t.start()
|
function t.start()
|
||||||
modal.start( t )
|
modal.start( t )
|
||||||
|
saveLocation = saveLocation or map.path
|
||||||
button.selected = saveButton
|
button.selected = saveButton
|
||||||
saveButton.name = "save to "..map.path
|
saveButton.name = "save to "..saveLocation
|
||||||
button.displayGroup( "saveModal", true )
|
button.displayGroup( "saveModal", true )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -107,7 +107,6 @@ end
|
||||||
|
|
||||||
local function dfs( idx, adj, unvisited )
|
local function dfs( idx, adj, unvisited )
|
||||||
if not unvisited[idx] then return end
|
if not unvisited[idx] then return end
|
||||||
print( "visiting node", idx )
|
|
||||||
unvisited[ idx ] = nil
|
unvisited[ idx ] = nil
|
||||||
for i in pairs( adj[idx] ) do dfs( i, adj, unvisited ) end
|
for i in pairs( adj[idx] ) do dfs( i, adj, unvisited ) end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue