dcearth/map.lua

215 lines
5.3 KiB
Lua
Raw Permalink Normal View History

2024-07-13 16:26:34 +00:00
local love = assert( love )
local io = io
local mkdir = assert( require 'lib.mkdir' )
2023-04-28 17:35:52 +00:00
local lg = love.graphics
local AI = require 'ai'
2023-04-28 17:35:52 +00:00
local Cities = require 'cities'
local Lines = require 'lines'
local Nodes = require 'travelNodes'
local Camera = require 'camera'
2023-07-28 23:23:08 +00:00
local Territory = require 'territory'
2023-04-28 17:35:52 +00:00
2024-04-28 01:38:23 +00:00
--flat list of editable layers for convenience
local layers = {
2023-04-28 17:35:52 +00:00
coastlines = false,
coastlinesLow = false,
international = false,
2024-04-28 01:38:23 +00:00
africa = false,
europe = false,
northamerica = false,
russia = false,
southamerica = false,
southasia = false,
travelnodes = false,
sailable = false,
ainodes = false,
cities = false,
}
local map = {
layers = layers,
path = false,
loaded = false,
selected = false,
selectionLocked = false,
editLayer = false,
2023-04-28 17:35:52 +00:00
territory = {
2023-07-28 23:23:08 +00:00
africa = false,
europe = false,
northamerica = false,
russia = false,
southamerica = false,
southasia = false
2023-04-28 17:35:52 +00:00
},
2024-04-28 01:38:23 +00:00
background = false,
coastlines = false,
coastlinesLow = false,
international = false,
2023-04-28 17:35:52 +00:00
travelnodes = false,
sailable = false,
ainodes = false,
2023-04-28 17:35:52 +00:00
cities = false
}
function map.load( path )
2024-05-02 00:32:07 +00:00
map.background = lg.newImage( "/data/graphics/blur.bmp" )
map.cities = Cities.load( "/data/earth/cities.dat" )
map.coastlines = Lines.load( "/data/earth/coastlines.dat" )
map.coastlinesLow = Lines.load( "/data/earth/coastlines-low.dat" )
map.international = Lines.load( "/data/earth/international.dat" )
map.sailable = Territory.load( "/data/earth/sailable.bmp", "sailable" )
map.travelnodes = Nodes.load( "/data/earth/travel_nodes.bmp", map.sailable.isSailable ) --travel node adjacency matrix depends on sailable bitmap
map.ainodes = AI.load( "/data/earth/ai_markers.bmp" )
2023-07-28 23:23:08 +00:00
for k, v in pairs(map.territory) do
2024-05-02 00:32:07 +00:00
map.territory[k] = Territory.load( "/data/earth/"..k..".bmp", k )
2023-07-28 23:23:08 +00:00
end
map.loaded = true
map.path = path
2024-04-28 01:38:23 +00:00
--update references
for k, v in pairs( layers ) do
layers[k] = map[k] or map.territory[k]
end
2023-04-28 17:35:52 +00:00
end
function map.draw()
lg.clear( 0, 0, 0, 1 )
if not map.loaded then return end
2023-04-28 17:35:52 +00:00
2023-07-28 23:23:08 +00:00
do --territory
lg.setLineJoin( "none" )
2023-07-28 23:23:08 +00:00
lg.replaceTransform( Camera.tfTerritory )
lg.setBlendMode( "add" )
2024-04-28 01:38:23 +00:00
lg.setColor( 1, 1, 1, 0.2 )
lg.draw( map.background )
lg.setColor( 1, 1, 1, 0.5 )
2023-07-28 23:23:08 +00:00
for k, v in pairs(map.territory) do
if v.visible then
v:draw()
2024-04-21 14:10:53 +00:00
lg.setLineWidth( 1 / Camera.zoom )
v:drawBorder( "land" )
2024-04-21 14:10:53 +00:00
lg.setLineWidth( 3 / Camera.zoom )
v:drawBorder( "sea" )
end
2023-07-28 23:23:08 +00:00
end
if map.sailable.visible then
map.sailable:draw()
lg.setLineJoin( "none" )
lg.setLineWidth( 1 / Camera.zoom )
lg.setColor( 1, 1, 1, 0.5)
map.sailable:drawBorder( "sailable" )
lg.setLineWidth( 3 / Camera.zoom )
map.sailable:drawBorder( "placeable" )
end
2023-07-28 23:23:08 +00:00
lg.setBlendMode( "alpha" )
2023-09-04 00:49:02 +00:00
lg.setColor( 1, 1, 1, 1 )
end
2023-07-28 23:23:08 +00:00
2023-04-28 17:35:52 +00:00
do --all this stuff is drawn in world coordinates, ( -180, 180 ) x ( -100, 100 )
lg.replaceTransform( Camera.tf )
2024-04-28 01:38:23 +00:00
if map.selected then
2024-04-28 01:38:23 +00:00
if map.selected[1] then --lines
local p = map.selected
lg.setColor( 0.4, 0.5, 0.8, 0.5 )
lg.setLineWidth( 0.2 / Camera.zoom )
lg.rectangle( "fill", p.x, p.y, p.X - p.x, p.Y - p.y )
2024-05-02 00:32:07 +00:00
lg.setColor( 1.0, 0, 0, 0.5 )
2024-04-28 01:38:23 +00:00
lg.line( p )
2024-05-02 00:32:07 +00:00
p:drawDirection()
2024-04-28 01:38:23 +00:00
else --points
lg.setColor( 1.0, 0.5, 0.5, 0.9 )
lg.setLineJoin( "miter" )
lg.setLineWidth( 1.0 / Camera.zoom )
lg.circle( "line", map.selected.x, map.selected.y, 0.2 + 1.0 / Camera.zoom )
end
end
2023-04-28 17:35:52 +00:00
if map.cities.visible then --points
2023-07-28 23:23:08 +00:00
2023-04-28 17:35:52 +00:00
lg.setColor( 1, 0, 0, 0.5 )
lg.setPointSize( 5.0 )
map.cities.draw()
2023-07-28 23:23:08 +00:00
lg.setColor( 1, 1, 0.0, 0.5 )
map.cities.drawCapitals()
2024-04-28 01:38:23 +00:00
end
2023-07-28 23:23:08 +00:00
if map.ainodes.visible then
lg.setPointSize( 5.0 )
map.ainodes:draw()
2023-04-28 17:35:52 +00:00
end
do --line stuff
lg.setColor(1, 1, 1, 0.2 )
2023-07-28 23:23:08 +00:00
lg.setLineJoin( "miter" )
lg.setLineWidth( 0.2 / Camera.zoom )
2023-04-28 17:35:52 +00:00
map.international:draw()
2023-07-28 23:23:08 +00:00
lg.setColor(1, 1, 1, 0.5 )
2023-04-28 17:35:52 +00:00
map.coastlines:draw()
map.coastlinesLow:draw()
2023-07-28 23:23:08 +00:00
--International Date Line
lg.line( -180, -100, -180, 100 )
lg.line( 180, -100, 180, 100 )
lg.line( -180, 90, 180, 90 )
lg.line( -180, -90, 180, -90 )
lg.line( -180, 100, 180, 100 )
lg.line( -180, -100, 180, -100 )
2023-04-28 17:35:52 +00:00
end
do --travel nodes
lg.replaceTransform( Camera.tfNodes )
if map.travelnodes.visible then
map.travelnodes:draw()
end
end
2024-04-28 01:38:23 +00:00
2023-04-28 17:35:52 +00:00
end
end
2024-04-28 01:38:23 +00:00
local function write( filename, string )
print( "Writing", string:len(), "bytes to", filename )
2024-07-13 16:26:34 +00:00
local file = assert( io.open( filename, "wb" ) )
2024-04-29 01:21:32 +00:00
assert( file:write( string ) )
assert( file:flush() ) --your toilet is set to stun, not kill
file:close()
end
2023-04-28 17:35:52 +00:00
function map.save()
2024-07-13 16:26:34 +00:00
--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
2024-04-29 01:21:32 +00:00
for k, layer in pairs( layers ) do
write( map.path..tostring( layer.filename ), assert( layer:save() ) )
2024-04-21 14:10:53 +00:00
end
2023-04-28 17:35:52 +00:00
end
2023-07-28 05:42:16 +00:00
function map.hover(x, y)
2023-07-28 23:23:08 +00:00
2023-04-28 17:35:52 +00:00
end
2024-04-28 01:38:23 +00:00
function map.undo()
print( "=== UNDO ===" )
end
2023-04-28 17:35:52 +00:00
return map