summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/map.lua27
1 files changed, 20 insertions, 7 deletions
diff --git a/common/map.lua b/common/map.lua
index 5bcd09e..d32cbf3 100644
--- a/common/map.lua
+++ b/common/map.lua
@@ -1,6 +1,11 @@
-- a Map is a 2d array of chunks
-- it handles loading and unloading of chunks
--- the specifics of which are then implemented separately for client and server
+-- each slot in the Map is either a Chunk object (if that chunk is loaded),
+-- nil (if not loaded), or false (if 'loading'). on the client 'loading' means
+-- the request for the chunk is currently in flight. on the server it might one day
+-- mean that terrain generation for that chunk is currently in progress.
+-- to test whether a chunk is loaded you can do if map:chunk(cp) then ... end
+-- to test whether a chunk needs to be loaded you do if map:chunk(cp) == nil then ... end.
-- it will probably also do things relating to entities and multiblock things
local class = require"common.class"
@@ -11,13 +16,21 @@ local Map = class()
function Map.make(cls)
return setmetatable({chunks={}},cls)
end
-function Map.add_chunk(self,cp,the_chunk)
- print("adding chunk",cp)
- assert(the_chunk.cp == cp,"attempting to add chunk with the wrong cp")
+function Map._set_chunk(self,cp,value)
if not self.chunks[cp.u] then self.chunks[cp.u] = {} end
- self.chunks[cp.u][cp.v] = the_chunk
+ self.chunks[cp.u][cp.v] = value
+end
+function Map.add_chunk(self,the_chunk)
+ local cp = the_chunk.cp
+ print("adding chunk",cp)
+ self:_set_chunk(cp,the_chunk)
+end
+function Map.mark_chunk_loading(self,cp)
+ print("marking chunk as loading",cp)
+ self:_set_chunk(cp,false)
end
function Map.unload_chunk(self,cp)
+ print("unloading chunk",cp)
if not self.chunks[cp.u] then return end
self.chunks[cp.u][cp.v] = nil
-- remove list if empty
@@ -42,7 +55,7 @@ function Map.at(self,hpos)
local cpu,cpv = math.floor(hpos.q/CHUNK_SIZE),math.floor(hpos.r/CHUNK_SIZE)
local hoffq,hoffr = hpos.q-(cpu*CHUNK_SIZE), hpos.r-(cpv*CHUNK_SIZE)
local ch = self:_chunkuv(cpu,cpv)
- if ch == nil then return nil end
+ if not ch then return nil end
return ch:_atqr(hoffq,hoffr)
end
function Map.set_at(self,hpos,tile)
@@ -50,7 +63,7 @@ function Map.set_at(self,hpos,tile)
local ch = self:chunk(cp)
-- setting a tile in an unloaded chunk is silently ignored
-- this might change one day
- if ch == nil then return nil end
+ if not ch then return nil end
ch:set_at(hoffs,tile)
end