diff options
author | ubq323 <ubq323@ubq323.website> | 2023-02-03 19:37:28 +0000 |
---|---|---|
committer | ubq323 <ubq323@ubq323.website> | 2023-02-03 19:51:07 +0000 |
commit | 1ebd7d9b7b62c8e05d527611a1944ed1a876b890 (patch) | |
tree | cfc5ddf3fc15985c4369aa12d56de5fa8d6fc7e5 /server | |
parent | ec6a391cb9cf0c0feac0fe3615a59cc7cb6db2d5 (diff) |
debug drawing change, zoom clamping, partial refactoring of class mechanisms to allow inheritance, minor refactor of noise generator, changes to temp worldgen, rework of class constructor mechanism
Diffstat (limited to 'server')
-rw-r--r-- | server/noise.lua | 34 | ||||
-rw-r--r-- | server/server.lua | 41 |
2 files changed, 45 insertions, 30 deletions
diff --git a/server/noise.lua b/server/noise.lua index 1480448..8a83b60 100644 --- a/server/noise.lua +++ b/server/noise.lua @@ -1,11 +1,12 @@ local Pos = require"common.coords".Pos +local class = require"common.class" local tau = 2*math.pi math.randomseed(os.time()) local function random_unit_vec() local theta = math.random()*tau - return Pos.make(math.cos(theta),math.sin(theta)) + return Pos:make(math.cos(theta),math.sin(theta)) end local function lerp(a,b,t) return (1-t)*a + t*b end local function smoothstep(x) @@ -15,14 +16,13 @@ local function smoothstep(x) end local function slerp(a,b,t) return lerp(a,b,smoothstep(t)) end -local NoiseGen = {} -NoiseGen.__index = NoiseGen -function NoiseGen.make() +local PerlinNoise = class() +function PerlinNoise.make(cls) local grid = {} setmetatable(grid,{__index=function(t,k) t[k] = {} return t[k] end}) - return setmetatable({grid=grid},NoiseGen) + return setmetatable({grid=grid},cls) end -function NoiseGen.vertex(self,ix,iy) +function PerlinNoise.vertex(self,ix,iy) local v = self.grid[ix][iy] if v then return v end vv = random_unit_vec() @@ -30,7 +30,7 @@ function NoiseGen.vertex(self,ix,iy) return vv end -function NoiseGen.at(self,x,y) +function PerlinNoise.at(self,x,y) local x0 = math.floor(x) local y0 = math.floor(y) local x1 = x0 + 1 @@ -41,7 +41,7 @@ function NoiseGen.at(self,x,y) local v10 = self:vertex(x1,y0) local v11 = self:vertex(x1,y1) - local p = Pos.make + local p = function(...) return Pos:make(...) end local d00 = v00:dot(p(x-x0,y-y0)) local d01 = v01:dot(p(x-x0,y-y1)) local d10 = v10:dot(p(x-x1,y-y0)) @@ -53,17 +53,9 @@ function NoiseGen.at(self,x,y) return z end -local NoiseAgg = {} -NoiseAgg.__index = NoiseAgg -function NoiseAgg.make(things) - return setmetatable({things=things or {}},NoiseAgg) -end -function NoiseAgg.make_perlin_octaves(nocts) - local things = {} - for i=1,nocts do - table.insert(things,{amp=2^i,scale=2^(nocts-i),gen=NoiseGen.make()}) - end - return NoiseAgg.make(things) +local NoiseAgg = class() +function NoiseAgg.make(cls,things) + return setmetatable({things=things or {}},cls) end function NoiseAgg.at(self,x,y) local n = 0 @@ -72,7 +64,7 @@ function NoiseAgg.at(self,x,y) for _,thing in ipairs(self.things) do local gen,scale,amp = thing.gen,thing.scale,thing.amp n = n + amp - t = t + gen:at(x*scale,y*scale)*amp + t = t + gen:at(x/scale,y/scale)*amp end return t/n end @@ -93,4 +85,4 @@ end -- io.write("\n") -- end -return {NoiseGen=NoiseGen,NoiseAgg=NoiseAgg} +return {PerlinNoise=PerlinNoise,NoiseAgg=NoiseAgg} diff --git a/server/server.lua b/server/server.lua index 67860ea..08f75c0 100644 --- a/server/server.lua +++ b/server/server.lua @@ -60,19 +60,42 @@ local function player_move_packet(player,x,y) return json.encode{t="move",id=player.id,x=x,y=y} end + +-- worldgen local the_tiles = {} -local ng = noise.NoiseAgg.make_perlin_octaves(4) -for q = 1,chunk.SIZE-1 do - for r = 1,chunk.SIZE-1 do - local p = coords.Hex.make(q,r):to_pos() - local nv = ng:at(p.x/20,p.y/20) - assert(nv ~= 1,"oopsy") - the_tiles[chunk.index(q,r)] = nv > 0 and 1+math.floor(math.sqrt(nv)*8) or false +local function p(amp,scale) return {scale=scale,amp=amp,gen=noise.PerlinNoise:make()} end +local ng = noise.NoiseAgg:make{ + p(1,20), + -- p(0.7,2), + p(0.5,15), + --p(2,200), +} +local ng2 = noise.NoiseAgg:make{p(1,20),p(0.5,15)} + +for q = 0,chunk.SIZE-1 do + for r = 0,chunk.SIZE-1 do + local p = coords.Hex:make(q,r):to_pos() + local ix = chunk.index(q,r) + local nv = ng:at(p.x,p.y) + if nv <= 0 then + the_tiles[ix] = false + else + local nv2 = ng2:at(p.x,p.y) + nv2 = math.max(-0.9999999,math.min(0.9999999,nv2*2.5)) + nv2 = (nv2+1)/2 + print(nv2) + + local tv = 1+math.floor(nv2*8) + assert(1<=tv and tv<=8,"oopsy woopsy") + the_tiles[ix] = tv + end end end -local the_chunk = Chunk.make(the_tiles) +local the_chunk = Chunk:make(the_tiles) print"generated chunk" + + while true do local ev = host:service(100) if ev then @@ -115,7 +138,7 @@ while true do end end elseif op == "settile" then - local h = coords.Hex.make(j.q,j.r) + local h = coords.Hex:make(j.q,j.r) the_chunk:set_at(h,j.tile) -- print(player.id,"settile",h,j.tile) for i,otherplayer in ipairs(playerlist) do |