diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/.map.lua.kak.Xd2mKc | 5 | ||||
-rw-r--r-- | common/chunk.lua | 15 | ||||
-rw-r--r-- | common/class.lua | 23 | ||||
-rw-r--r-- | common/coords.lua | 34 | ||||
-rw-r--r-- | common/map.lua | 6 |
5 files changed, 59 insertions, 24 deletions
diff --git a/common/.map.lua.kak.Xd2mKc b/common/.map.lua.kak.Xd2mKc new file mode 100644 index 0000000..aa2bfb0 --- /dev/null +++ b/common/.map.lua.kak.Xd2mKc @@ -0,0 +1,5 @@ +-- 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 +-- it will probably also do things relating to entities and multiblock things + diff --git a/common/chunk.lua b/common/chunk.lua index 8e2ec40..1d3faa6 100644 --- a/common/chunk.lua +++ b/common/chunk.lua @@ -1,6 +1,7 @@ local json = require"common.dkjson" +local class = require"common.class" -local CHUNK_SIZE = 128 +local CHUNK_SIZE = 64 -- for now tiles shall be booleans @@ -15,10 +16,9 @@ local function index(offq,offr) return CHUNK_SIZE*offq + offr + 1 end -local Chunk = {} -Chunk.__index = Chunk -function Chunk.make(tiles) - return setmetatable({tiles=tiles},Chunk) +local Chunk = class() +function Chunk.make(cls,tiles) + return setmetatable({tiles=tiles},cls) end function Chunk.at(self,hoffs) if not index_ok(hoffs.q,hoffs.r) then return nil end @@ -35,11 +35,12 @@ end function Chunk.from_packet_data(packet) -- assuming packet has already been json.decoded -- since otherwise how would we know it's a chunk packet - return Chunk.make(packet.tiles) + return Chunk:make(packet.tiles) end return { Chunk=Chunk, SIZE=CHUNK_SIZE, - index=index + index=index, + index_ok=index_ok, } diff --git a/common/class.lua b/common/class.lua new file mode 100644 index 0000000..37cf7bd --- /dev/null +++ b/common/class.lua @@ -0,0 +1,23 @@ +local function class() + local T = {} + T.__index = T + return T +end + +local function extend(Base) + local T = {} + T.__index = T + for k,v in pairs(Base) do + if k:sub(1,2) == "__" and k~="__index" then + T[k]=v + end + end + setmetatable(T,{__index=Base}) +end + +return setmetatable({ + class=class, + extend=extend +},{__call=class}) + + diff --git a/common/coords.lua b/common/coords.lua index 2399e43..351aa53 100644 --- a/common/coords.lua +++ b/common/coords.lua @@ -1,3 +1,5 @@ +local class = require"common.class" + -- Hex: q,r,s. invariant that q+r+s=0 -- add, subtract -- constructor takes 3 positions and rounds to closest hex centre. @@ -15,12 +17,11 @@ local Pos, Hex local SR3 = math.sqrt(3) -Hex={} -Hex.__index = Hex -function Hex.make(q,r,s) +local Hex = class() +function Hex.make(cls,q,r,s) s=s or -q-r assert(q+r+s==0,"hex coord doesn't meet invariant") - return setmetatable({q=q,r=r,s=s},Hex) + return setmetatable({q=q,r=r,s=s},cls) end function Hex.round(self) -- return a new Hex rounded to integer coordinates @@ -40,32 +41,31 @@ function Hex.round(self) rs = -rq-rr end - return Hex.make(rq,rr,rs) + return Hex:make(rq,rr,rs) end function Hex.to_pos(self) local x = self.q*SR3 + self.r*(SR3/2) local y = self.r*(3/2) - return Pos.make(x,y) + return Pos:make(x,y) end -function Hex.__add(self,other) return Hex.make(self.q+other.q, self.r+other.r, self.s+other.s) end -function Hex.__sub(self,other) return Hex.make(self.q-other.q, self.r-other.r, self.s-other.s) end +function Hex.__add(self,other) return Hex:make(self.q+other.q, self.r+other.r, self.s+other.s) end +function Hex.__sub(self,other) return Hex:make(self.q-other.q, self.r-other.r, self.s-other.s) end function Hex.__tostring(self) return string.format("H(%.2f,%.2f)",self.q,self.r) end -Pos = {} -Pos.__index=Pos -function Pos.make(x,y) - return setmetatable({x=x,y=y},Pos) +Pos = class() +function Pos.make(cls,x,y) + return setmetatable({x=x,y=y},cls) end -function Pos.__add(self,other) return Pos.make(self.x+other.x,self.y+other.y) end -function Pos.__sub(self,other) return Pos.make(self.x-other.x,self.y-other.y) end +function Pos.__add(self,other) return Pos:make(self.x+other.x,self.y+other.y) end +function Pos.__sub(self,other) return Pos:make(self.x-other.x,self.y-other.y) end function Pos.__mul(a,b) if type(a) == "number" then - return Pos.make(a*b.x,a*b.y) + return Pos:make(a*b.x,a*b.y) elseif type(b) == "number" then - return Pos.make(a.x*b,a.y*b) + return Pos:make(a.x*b,a.y*b) else error("can only multiply Pos by scalar") end @@ -81,7 +81,7 @@ function Pos.dot(self,other) return self.x*other.x + self.y*other.y end function Pos.to_hex(self) local q = self.x*(SR3/3) - self.y*(1/3) local r = (2/3)*self.y - return Hex.make(q,r,-q-r) + return Hex:make(q,r,-q-r) end function Pos.__tostring(self) return string.format("(%.2f,%.2f)",self.x,self.y) end diff --git a/common/map.lua b/common/map.lua new file mode 100644 index 0000000..fe4b9e0 --- /dev/null +++ b/common/map.lua @@ -0,0 +1,6 @@ +-- 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 +-- it will probably also do things relating to entities and multiblock things + + |