diff --git a/base.png b/base.png index b6c48b8..c2d1cba 100644 Binary files a/base.png and b/base.png differ diff --git a/index.html b/index.html index b933a8e..4e7d7ce 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@

MapTest

- +
diff --git a/js/index.js b/js/index.js index 8edab80..9acb634 100644 --- a/js/index.js +++ b/js/index.js @@ -1,13 +1,22 @@ +const width = 2160; +const height = 1080; + const BIASES = { - 0xc8ff50: 1, - 0x46aafa: 0.5, - 0xff0000: 0.75, - 0x0000ff: 0.4, +0x000000: 1, + 0x64ff50: 0.5, + 0xc8ff50: 0.45, + 0x46aafa: 0.4, + 0x0078ff: 0.35, + 0x0000ff: 0.3, + 0xf5a500: 0.15, + 0xff0000: 0.1, + 0x666666: 0.01, + 0xb2b2b2: 0.02 }; function validXY(x, y) { - if (x < 0 || x >= 3200) return false; - if (y < 0 || y >= 1600) return false; + if (x < 0 || x >= width) return false; + if (y < 0 || y >= height) return false; return true; } @@ -26,56 +35,64 @@ function setRGBA(data, i, input) { function isLand(data) { if (data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] == 255) return false; + if (data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == 255) return false; return true; } function Game(baseMap) { this.img = new Image(); this.baseMap = baseMap; + this.colors = {}; + this.aggression = {}; } Game.prototype.main = function() { var {biomes, ctx, colonized} = this; - var dat = ctx.getImageData(0,0,3200,1600); + var dat = ctx.getImageData(0,0,width,height); var data = dat.data; var out = new Uint8Array(4); - for (let k = 0; k < 3200*1600/10; k++) { - let i = Math.floor(Math.random() * biomes.data.length / 4); + for (let k = 0; k < width*height; k++) { + let i = k; if (!colonized[i]) continue; - var x = i % 3200; - var y = Math.floor(i / 3200); + var x = i % width; + var y = Math.floor(i / width); let rgba = getRGBA(biomes.data,i,out); - + if (isLand(rgba)) - setRGBA(data,i,[255,128,128,255]); + setRGBA(data,i,this.colors[colonized[i]]); let weight = 10; let broken = false; + let i2 = i; + for (let dx = -1; dx <= 1; dx++) { for (let dy = -1; dy <= 1; dy++ ) { weight--; let x2 = x + dx; let y2 = y + dy; - let i = x2 + y2 * 3200; + let i = x2 + y2 * width; if (!validXY(x2,y2)) continue; let rgba = getRGBA(biomes.data,i,out); let rgbaH = rgba[0] * 0x10000 + rgba[1] * 0x100 + rgba[2]; - if (Math.random() > ((rgbaH in BIASES) ? BIASES[rgbaH] : 0.2) / weight) { + let bias = ((rgbaH in BIASES) ? BIASES[rgbaH] : 0.2) / weight; + if (colonized[y2 * width + x2] != 0) bias /= this.aggression[colonized[i]]; + + if (Math.random() > bias) { continue; } - if (colonized[y2 * 3200 + x2] == 1) { + if (colonized[y2 * width + x2] == colonized[i2]) { continue; } - colonized[y2 * 3200 + x2] = 1; + colonized[y2 * width + x2] = colonized[i2]; broken = true; break; } @@ -83,12 +100,12 @@ Game.prototype.main = function() { } } - ctx.putImageData(dat,0,0,0,0,3200,1600); + ctx.putImageData(dat,0,0,0,0,width,height); } Game.prototype.map = function() { var {biomes, ctx} = this; - var dat = ctx.getImageData(0,0,3200,1600); + var dat = ctx.getImageData(0,0,width,height); var data = dat.data; var out = new Uint8Array(4); @@ -101,8 +118,8 @@ Game.prototype.map = function() { setRGBA(data,i,[0,0,0,255]); } } - - ctx.putImageData(dat,0,0,0,0,3200,1600); + + ctx.putImageData(dat,0,0,0,0,width,height); } Game.prototype.place = function() { @@ -111,14 +128,19 @@ Game.prototype.place = function() { let i = 0; - while (true) { - i = Math.floor(Math.random() * biomes.data.length / 4); + for (let count = 1; count < 101; count++) { + while (true) { + i = Math.floor(Math.random() * biomes.data.length / 4); - let rgba = getRGBA(biomes.data,i,out); + let rgba = getRGBA(biomes.data,i,out); - if (isLand(rgba)) break; - } - colonized[i] = 1; + if (isLand(rgba)) break; + } + + colonized[i] = count; + this.aggression[count] = Math.random(); + this.colors[count] = [Math.floor(Math.random() * 255),Math.floor(Math.random() * 255),Math.floor(Math.random() * 255),255]; + } } Game.prototype.loop = function() { @@ -132,12 +154,14 @@ Game.prototype.startGame = function() { this.ctx = ctx; - ctx.drawImage(this.img,0, 0,3200,1600); + ctx.imageSmoothingEnabled = false; + ctx.drawImage(this.img,0, 0,width,height); - var dat = ctx.getImageData(0,0,3200,1600); + + var dat = ctx.getImageData(0,0,width,height); this.biomes = dat; - this.colonized = new Uint8Array(3200*1600); + this.colonized = new Uint8Array(width*height); this.map(); this.place();