dcearth/territory.lua

148 lines
3.7 KiB
Lua

local t = {}
local bmp = require 'bmp'
local lg = assert( love.graphics )
local colours = {
africa = {1,0,0,0.5},
europe = {0,1,0,0.5},
northamerica = {0,0,1,0.5},
russia = {0,1,1,0.5},
southamerica = {1,0,1,0.5},
southasia = {1,1,0,0.5},
sailable = {1, 1, 1, 0.2},
}
function t.load( filename, name )
local img, imgd = assert( bmp.load( filename ) )
local territory = {
visible = true,
name = name,
colour = colours[name],
border = {},
img = img,
imgd = imgd
}
if name == "sailable" then
t.sailable = territory
t.computeBorder( territory, 20 / 255 )
end
return setmetatable( territory, {__index = t } )
end
--World space coordinate.
local function ToWorld( x, y )
return x * 360 / 512 - 180, y * 200 / 285 - 100
end
local function ToPixel( x, y )
return (x + 180) * 512 / 360, 285 - ( y + 100 ) * 285 / 200
end
function t.isValid( x, y )
end
function t.getPixel( territory, x, y )
--ZERO INDEXED
local imgx, imgy = math.floor( 512 * ( x + 180 ) / 360 ), math.floor( 285 * ( y + 100 ) / 200 )
--print( territory.name, imgx, imgy )
return territory.imgd:getPixel( imgx, imgy )
end
function t.toggleVisibility( territory )
end
--[[
0
20 -- once sailable.bmp is brighter than this, the area is traversable by ships
60 -- once sailable.bmp and territory.bmp are brighter than this, ships can be placed here
130 -- if territory.bmp is brighter than this and sailable is darker than 60, structures are placeable.
SO:
SAILABLE: 0 (not), 21 (traverse not place), 61 ( traverse and place )
TERRITORY: 131 ( place land if sailable <= 60 ), 61 ( place sea ), 0
]]
function t.isSailable( x, y )
local water = assert( t.sailable )
if water:getPixel( x, y ) > 20 / 255 then return true end
return false
end
function t.canPlaceShip( territory, x, y )
local water = assert( t.sailable )
if water:getPixel( x, y ) > 60 / 255
and territory:getPixel( x, y ) > 60 / 255 then return true end
return false
end
function t.canPlaceLand( territory, x, y )
local water = assert( t.sailable )
if water:getPixel( x, y ) < 60 / 255
and territory:getPixel( x, y ) > 130 / 255 then return true end
return false
end
function t.draw( territory )
lg.setColor( territory.colour )
lg.draw( territory.img )
end
function t.drawBorder( territory )
--lg.setColor( territory.colour )
for _, poly in ipairs( territory.border ) do
lg.line( poly )
end
end
function t.computeBorder( territory, threshold )
territory.border = {}
local border = territory.border
local n = 1
for x = 0, 511 do
for y = 0, 284 do
--Bottom left, bottom right, and top right of pixel in image coordinates:
local blx, bly = x, y + 1
local brx, bry = x + 1, y + 1
local trx, try = x + 1, y
--Sample image and detect edge:
local curValue = territory.imgd:getPixel( x, y )
local leftValue = territory.imgd:getPixel( math.min( x + 1, 511 ), y )
local downValue = territory.imgd:getPixel( x, math.min( 284, y + 1 ) )
local isLeftEdge =
((curValue >= threshold) and (leftValue < threshold)) or
((curValue <= threshold) and (leftValue > threshold))
local isDownEdge =
((curValue >= threshold) and (downValue < threshold)) or
((curValue <= threshold) and (downValue > threshold))
if isLeftEdge then
--print( "Left edge:", brx, bry, trx, try )
border[n] = { brx, bry, trx, try }
n = n + 1
end
if isDownEdge then
--print( "Down edge:", blx, bly, brx, bry )
border[n] = { blx, bly, brx, bry }
n = n + 1
end
end
end
end
function t.drawConnections( nodes )
end
function t.save( nodes, filename )
end
return t