diff --git a/ai.lua b/ai.lua index b440121..fec5ba0 100644 --- a/ai.lua +++ b/ai.lua @@ -20,6 +20,7 @@ end function t.load( filename ) local img, imgd = bmp.load( filename ) local nodes = { + filename = filename, visible = true, all = {}, att = {}, @@ -77,8 +78,8 @@ function t.draw( nodes ) lg.points( nodes.ptsDef ) end -function t.save( nodes, filename ) - +function t.save( nodes ) + return bmp.savePoints( nodes.all, "512rgb24" ) end return t \ No newline at end of file diff --git a/bmp.lua b/bmp.lua index 81afbf4..64d35b0 100644 --- a/bmp.lua +++ b/bmp.lua @@ -7,6 +7,41 @@ local lfs = love.filesystem local ffi = require 'ffi' local bit = require 'bit' +local function getHeader( filename ) + local offset = love.data.unpack( " 0) and 0.5 or -0.5 ) + Camera.Zoom( (y > 0) and 0.1 or -0.1 ) end function love.mousepressed( x, y, mouseButton, istouch, presses ) local wx, wy = Camera.GetWorldCoordinate( x, y ) - print( ("MOUSE\tx %f\ty %f\twx %f\twy %f"):format(x, y, wx, wy) ) - if button.selected and button.selected:contains( x, y ) then button.selected:callback() end + + if button.selected and button.selected:contains( x, y ) then + print( ("MOUSE\tx %f\ty %f\twx %f\twy %f"):format(x, y, wx, wy) ) + return button.selected:callback() + end end function love.mousemoved( x, y, dx, dy, istouch ) @@ -97,15 +101,13 @@ function love.mousemoved( x, y, dx, dy, istouch ) end function love.keypressed(key, code, isRepeat) - wasKeyPressed = true - if code == "down" then return button.selectNext() end - if code == "up" then return button.selectPrev() end + if code == "left" then return button.selectPrev() end + if code == "right" then return button.selectNext() end + if code == "down" then return button.selectNextInGroup() end + if code == "up" then return button.selectPrevInGroup() end if code == "return" then return button.selected:callback() end - if key == "l" then - return map.save() - end if key == "c" then map.selectionLocked = not( map.selectionLocked ) end @@ -115,8 +117,6 @@ end do - button.new{ name = "UNDO", y = 250, callback = map.undo } - local function toolCallback( self ) local f = (map.layers[self.layer])[self.name] if f then return f(self) end @@ -136,23 +136,8 @@ do v.visible = false end - local layerButtons = {} - local function back( self ) - for k, button in pairs( tools ) do button.visible = false end - for k, button in pairs( layerButtons ) do button.visible = true end - self.visible = false - map.editLayer = false - end - - local backButton = button.new{ - name = "BACK", - visible = false, - y = 250 + button.h + 4, - callback = back, - } - local layers = { { name = "AF", layer = "africa" }, { name = "EU", layer = "europe" }, @@ -185,13 +170,17 @@ do button.icon = false end end + self.icon = soloIcon + for k, layer in pairs( map.layers ) do print( "invisible layer, map:", k, layer) layer.visible = false end map.layers[ self.layer ].visible = true + end + local backButton local function editLayer( self ) map.editLayer = map.layers[ self.layer ] for k, button in pairs( layerButtons ) do button.visible = false end @@ -212,32 +201,60 @@ do local y = 250 + local soloButtons = {} + local showButtons = {} + local editButtons = {} for i = 1, #layers do - - layerButtons[ 3 * i - 2 ] = button.new( copy( i, { + editButtons[i] = button.new( copy( i, { x = 8, y = y + (button.h + 4) * i, w = 112, - callback = editLayer + callback = editLayer, + group = "edit", })) + layerButtons[ 3 * i - 2 ] = editButtons[i] - layerButtons[ 3 * i - 1 ] = button.new( copy( i, { + showButtons[i] = button.new( copy( i, { x = 128, y = y + (button.h + 4) * i, w = 24, name = "V", callback = toggleVisibleLayer, icon = visibilityIcon, + group = "show", })) + layerButtons[ 3 * i - 1 ] = showButtons[i] - layerButtons[ 3 * i ] = button.new( copy( i, { + soloButtons[i] = button.new( copy( i, { x = 160, y = y + (button.h + 4) * i, w = 24, name = "S", callback = soloVisibleLayer, - icon = soloIcon + icon = soloIcon, + group = "solo", })) + layerButtons[ 3 * i ] = soloButtons[i] end + + + local function back( self ) + for k, button in pairs( tools ) do button.visible = false end + for k, button in pairs( layerButtons ) do button.visible = true end + self.visible = false + map.editLayer = false + end + + backButton = button.new{ + name = "UP", + visible = false, + y = 250 + button.h + 4, + icon = love.graphics.newImage( "icons/up.bmp" ), + callback = back, + } + + button.new{ name = "UNDO", y = 250, callback = map.undo, icon = love.graphics.newImage( "icons/undo.bmp" ) } + button.new{ name = "SAVE", y = 222, callback = savemodal.start, icon = false } + end diff --git a/mainmenu.lua b/mainmenu.lua new file mode 100644 index 0000000..e69de29 diff --git a/map.lua b/map.lua index d024fb3..c2801a7 100644 --- a/map.lua +++ b/map.lua @@ -177,27 +177,18 @@ function map.draw() end ---[[local function write( filename, string ) - os.rename( filename, filename..".bak" ) --just in case :^) - local file = assert( io.open( filename, "w+" ) ) - assert( file:write( string ) ) - file:close() -end]] - local function write( filename, string ) print( "Pretending to write", string:len(), "bytes to", filename ) + --[[ os.rename( filename, filename..".bak" ) --just in case :^) + local file = assert( io.open( filename, "w+" ) ) + assert( file:write( string ) ) + file:close()]] end function map.save() - write( map.path.."/data/earth/cities.dat", map.cities:save()) - write( map.path.."/data/earth/coastlines.dat", map.coastlines:save()) - write( map.path.."/data/earth/coastlines-low.dat", map.coastlinesLow:save()) - write( map.path.."/data/earth/international.dat", map.international:save()) - map.sailable:save() - map.travelnodes:save() - map.ainodes:save() - for k, v in pairs(map.territory) do - map.territory[k]:save() + for k, layer in pairs( layers ) do + print( "SAVING:", k, tostring( layer.filename ) ) + write( map.path..tostring( layer.filename ), assert( layer:save() ) ) end end diff --git a/modal.lua b/modal.lua new file mode 100644 index 0000000..552a8c9 --- /dev/null +++ b/modal.lua @@ -0,0 +1,51 @@ +local love = assert( love ) +local button = require( "button" ) +local t = {} +t.__index = t + +local i = 0 +function t.start( self ) + i = i + 1 + t[i] = t[i] or {} + + --store callbacks + for name in pairs( self ) do + if love[name] then + t[i][name] = love[name] + love[name] = self[name] + end + end + + --store menus + local b = button.next + repeat + t[i][b] = b.visible + b = b.next + until b == button +end + +function t.stop( self ) + --restore callbacks + for name in pairs( self ) do + if love[name] then + love[name] = t[i][name] + end + end + + --restore menus + local b = button + repeat + b = b.next + b.visible = t[i][b] + until b == button + + t[i] = nil + i = i - 1 + +end + +function t.new( modal ) + return setmetatable( modal or {}, t ) +end + +return t \ No newline at end of file diff --git a/savemodal.lua b/savemodal.lua new file mode 100644 index 0000000..5f54ffc --- /dev/null +++ b/savemodal.lua @@ -0,0 +1,52 @@ +local love = assert( love ) +local modal = require( "modal" ) +local button = require( "button" ) +local map = require( "map" ) +local t = {} + +local saveLocation = map.path +local saveButton = button.new{ + group = "saveModal", + name = "save", + callback = function() map.save(); return t:stop() end, + visible = false, + x = 20, + y = 20, + w = 400, + h = 100, +} + +local cancelButton = button.new{ + group = "saveModal", + name = "cancel", + visible = false, + callback = function() return t:stop() end, + x = 20, + y = 150, + w = 400, + h = 100 + } + +function t.start() + modal.start( t ) + button.selected = saveButton + saveButton.name = "save to "..map.path + button.displayGroup( "saveModal", true ) +end + +function t.draw() + love.graphics.clear( 0,0,0,1 ) + love.graphics.setColor( 1, 1, 1, 0.5 ) + button:draw() + +end + +function t.directorydropped( path ) + saveLocation = path + map.path = path + saveButton.name = "save to "..map.path + return love.filesystem.mount( path, "" ) +end + + +return modal.new( t ) \ No newline at end of file diff --git a/territory.lua b/territory.lua index 8ef3382..4209102 100644 --- a/territory.lua +++ b/territory.lua @@ -18,6 +18,7 @@ function t.load( filename, name ) local territory = { visible = true, name = name, + filename = filename, colour = colours[name], border = {}, img = img, @@ -145,7 +146,7 @@ function t.computeBorder( territory, threshold, key ) end function t.save( territory ) - + return bmp.save( territory.imgd, "512rgb24" ) end return t \ No newline at end of file diff --git a/textinput.lua b/textinput.lua new file mode 100644 index 0000000..e206d56 --- /dev/null +++ b/textinput.lua @@ -0,0 +1,64 @@ +local love = assert( love ) +local utf8 = require("utf8") +local modal = require( "modal" ) +local t = modal.new{ } + +function t.setCurrentModal( fields ) + t.currentModal = assert( fields ) + t.currentIdx = 1 + return t:start() +end + +function t.draw() + if not t.currentModal then return end + love.graphics.setColor( 0, 0, 0, 0.3 ) + love.graphics.rectangle("fill", 0, 0, love.graphics.getDimensions()) + + + -- other fields + for i, field in ipairs( t.currentModal ) do + love.graphics.setColor( 1, 1, 1, 0.2 ) + local mode = (i == t.currentIdx) and "fill" or "line" + love.graphics.rectangle( mode, 200, i * 28, 200, 14, 4 ) + love.graphics.setColor( 1, 1, 1, 1 ) + love.graphics.print( field.name, 8, i * 28 ) + love.graphics.print( field.value, 216, i * 28 ) + end +end + +function t.textinput( char ) + if t.currentModal then + local field = t.currentModal.currentFieldIdx + t.currentModal.currentField.value = t.currentModal.currentField.value .. char + end +end + +function t.keypressed(key, code, isRepeat) + if code == "down" then + t.currentIdx = t.currentIdx + 1 + if t.currentIdx > #(t.currentModal) then + t.currentIdx = 1 + end + elseif code == "up" then + t.currentIdx = t.currentIdx - 1 + if t.currentIdx < 1 then + t.currentIdx = #(t.currentModal) + end + end + + if key == "backspace" then + -- get the byte offset to the last UTF-8 character in the string. + local byteoffset = utf8.offset(text, -1) + + if byteoffset then + -- remove the last UTF-8 character. + -- string.sub operates on bytes rather than UTF-8 characters, so we couldn't do string.sub(text, 1, -2). + text = string.sub(text, 1, byteoffset - 1) + end + end + if key == "escape" then + return t:stop() + end +end + +return t \ No newline at end of file diff --git a/travelNodes.lua b/travelNodes.lua index bdb807f..b554d3c 100644 --- a/travelNodes.lua +++ b/travelNodes.lua @@ -54,7 +54,7 @@ function t.load( filename, sailable ) isSailable = sailable local img, imgd = bmp.load( filename ) - local nodes = { visible = true, nodes = {}, points = {}, connections = {}, img = img } + local nodes = { filename = filename, visible = true, nodes = {}, points = {}, connections = {}, img = img } local n = 1 for x = 0, 799 do for y = 0, 399 do @@ -106,8 +106,8 @@ function t.drawConnections( nodes ) end -function t.save( nodes, filename ) - +function t.save( nodes ) + return bmp.savePoints( nodes.nodes, "800r4") end return t \ No newline at end of file