--Load and save the fixed width plaintext data used by DEFCON. local t = {} local io = io local math = math local table = table local tonumber = tonumber local lfs = love.filesystem local lg = love.graphics local locationQuery = require 'locationQuery' local cities local points = {} local caps = {} t.selected = nil t.selectionLocked = false function t.lockSelection() t.selectionLocked = true end function t.unlockSelection() t.selectionLocked = false end function t.draw() if cities.visible then lg.points( points ) end end function t.drawSelected( r ) if not cities.visible then return end local c = t.selected if not c then return end lg.circle( "fill", c.x, c.y, r ) end function t.drawCapitals() if cities.visible then lg.points( caps ) end end function t.selectNearestCity(x, y) if not t.selectionLocked then t.selected = cities:getClosestPoint(x, y) end end function t.load( filename ) cities = { visible = true, active = false } local n = 1 local idxPts = 1 local idxCaps = 1 for line in assert( lfs.lines( filename ), "Error: could not open cities.dat" ) do local _, _, x, y, pop, capital = line:sub( 83 ):find( "(%g+)%s+(%g+)%s+(%g+)%s+(%g+)" ) if capital then --check against empty or malformed line x, y, pop, capital = tonumber( x ), tonumber( y ), tonumber( pop ), ( tonumber( capital ) > 0) local city = { name = line:sub( 1, 39 ):gsub("%s+$",""), country = line:sub( 42, 82 ):gsub("%s+$",""), x = x, y = y, pop = pop, capital = capital } cities[n] = city n = n + 1 points[idxPts], points[idxPts + 1] = x, y idxPts = idxPts + 2 if capital then caps[idxCaps], caps[idxCaps + 1] = x, y idxCaps = idxCaps + 2 end else print( "CITIES: malformed line:", line ) end end --Multiple inheritance. cities = locationQuery.New( cities ) setmetatable( getmetatable( cities ).__index, {__index = t } ) print( "LOADED", filename, n ) return cities end function t.save( cities, filename ) local str = {} for n, city in ipairs( cities ) do str[n] = ("%-40s%-40s%f %f %d %d"):format( city.name, city.country, city.x, city.y, city.pop, city.capital and 1 or 0 ) end assert( lfs.write( filename, table.concat( str, "\n" ) ) ) print( "Saved", filename ) end return t