module.exports = { generateMap: function (width, height) { var map = []; var utilMap = []; var g = [6, 5, 4, 3, 2]; for (var k = 0; k < g.length; k++) { var i = g[k] + ""; for (var w = 1; w < map.length - 1; w++) { for (var h = 1; h < map[w].length - 1; h++) { if (map[w][h] == "0" && (map[w - 1][h] == i || map[w][h - 1] == i || map[w][h + 1] == i || map[w + 1][h] == i || map[w + 1][h + 1] == i || map[w - 1][h - 1] == i || map[w + 1][h - 1] == i || map[w - 1][h + 1] == i)) { map[w][h] = (i - 1) + ""; //set ground } } } } //return map; for (var w = 0; w < width; w++) { map[w] = []; utilMap[w] = []; for (var h = 0; h < height; h++) { map[w][h] = "0"; utilMap[w][h] = ""; if (Math.random() < 0.0009) map[w][h] = "#"; } } //preprocessing for (i = 0; i < 8; i++) { //expand all islands var orgMap = []; for (var w = 0; w < width; w++) { orgMap[w] = []; for (var h = 0; h < height; h++) { orgMap[w][h] = map[w][h]; } } var exP = 80; for (var w = 1; w < width - 1; w++) { for (var h = 1; h < height - 1; h++) { if (orgMap[w][h] == "#") { if (rand(exP)) map[w - 1][h] = "#" if (rand(exP)) map[w + 1][h] = "#" if (rand(exP)) map[w][h - 1] = "#" if (rand(exP)) map[w][h + 1] = "#" if (rand(exP)) map[w - 1][h - 1] = "#" if (rand(exP)) map[w - 1][h + 1] = "#" if (rand(exP)) map[w + 1][h - 1] = "#" if (rand(exP)) map[w + 1][h + 1] = "#" } } } } for (var i = 0; i < 2; i++) { for (var w = 7; w < width - 7; w++) { for (var h = 7; h < height - 7; h++) { if (map[w][h] == "0") { if (map[w][h - 1] == "#" || map[w][h - 2] == "#" || map[w][h - 3] == "#" || map[w][h - 4] == "#" || map[w][h - 5] == "#" || map[w][h - 6] == "#") { if (map[w][h + 1] == "#" || map[w][h + 2] == "#" || map[w][h + 3] == "#" || map[w][h + 4] == "#" || map[w][h + 5] == "#" || map[w][h + 6] == "#") { map[w][h] = "#"; } } if (map[w - 1][h] == "#" || map[w - 2][h] == "#" || map[w - 3][h] == "#" || map[w - 4][h] == "#" || map[w - 5][h] == "#" || map[w - 6][h] == "#") { if (map[w + 1][h] == "#" || map[w + 2][h] == "#" || map[w + 3][h] == "#" || map[w + 4][h] == "#" || map[w + 5][h] == "#" || map[w + 6][h] == "#") { map[w][h] = "#"; } } if (map[w - 1][h - 1] == "#" || map[w - 2][h - 2] == "#" || map[w - 3][h - 3] == "#" || map[w - 4][h - 4] == "#" || map[w - 5][h - 5] == "#" || map[w - 6][h - 6] == "#") { if (map[w + 1][h + 1] == "#" || map[w + 2][h + 2] == "#" || map[w + 3][h + 3] == "#" || map[w + 4][h + 4] == "#" || map[w + 5][h + 5] == "#" || map[w + 6][h + 6] == "#") { map[w][h] = "#"; } } if (map[w + 1][h - 1] == "#" || map[w + 2][h - 2] == "#" || map[w + 3][h - 3] == "#" || map[w + 4][h - 4] == "#" || map[w + 5][h - 5] == "#" || map[w + 6][h - 6] == "#") { if (map[w - 1][h + 1] == "#" || map[w - 2][h + 2] == "#" || map[w - 3][h + 3] == "#" || map[w - 4][h + 4] == "#" || map[w - 5][h + 5] == "#" || map[w - 6][h + 6] == "#") { map[w][h] = "#"; } } } } } } for (var w = 0; w < width; w++) { for (var h = 0; h < height; h++) { if (h <= 7 || w <= 7 || w > width - 7 || h > height - 7) { map[w][h] = "0"; //border water } } } /* groundtypes g = ground w = water */ // //Set ground type for (var w = 0; w < width; w++) { for (var h = 0; h < height; h++) { if (map[w][h] == "#") { //is ground map[w][h] = "6"; //set ground if (Math.random() < 0.011) { utilMap[w][h] = "forest"; } else if (utilMap[w - 1][h] == "forest" || utilMap[w][h - 1] == "forest" || utilMap[w - 1][h - 1] == "forest") { if (Math.random() < 0.8) { utilMap[w][h] = "forest"; } } else if (Math.random() < 0.011) { utilMap[w][h] = "flower"; } else if (Math.random() < 0.015) { utilMap[w][h] = "tree1"; } else if (Math.random() < 0.011) { utilMap[w][h] = "stone1"; } else if (Math.random() < 0.03) { utilMap[w][h] = "fass"; } } } } for (var w = 0; w < width; w++) { //fill forest for (var h = 0; h < height; h++) { if (map[w][h] == "6") { if ((utilMap[w - 1][h] == "forest" && utilMap[w + 1][h] == "forest") || (utilMap[w][h - 1] == "forest" && utilMap[w][h + 1] == "forest")) { utilMap[w][h] = "forest"; } } } } var treasureCnt = 5; var foundLand = true; while (treasureCnt>0 && foundLand) { foundLand = false; for (var w = 0; w < width; w++) { //add chest for (var h = 0; h < height; h++) { if(map[w][h] == "6") { foundLand = true; } if (map[w][h] == "6" && Math.random() < 0.00001 && treasureCnt>0) { treasureCnt--; utilMap[w][h] = "treasure-closed"; console.log(w, h, "treasure") } } } } var g = [6, 5, 4, 3, 2]; for (var k = 0; k < g.length; k++) { var i = g[k] + ""; for (var w = 0; w < width; w++) { for (var h = 0; h < height; h++) { if (map[w][h] == "0" && !(w <= 0 || h <= 0 || w >= width - 1 || h >= height - 1) && (map[w - 1][h] == i || map[w][h - 1] == i || map[w][h + 1] == i || map[w + 1][h] == i || map[w + 1][h + 1] == i || map[w - 1][h - 1] == i || map[w + 1][h - 1] == i || map[w - 1][h + 1] == i)) { map[w][h] = (i - 1) + ""; //set ground } } } } var cssMap = addCssClass(map); return { "map": map, "cssMap": cssMap, "utilMap": utilMap }; } }; function rndBetween(start, end) { return Math.floor(Math.random() * end) + start; } function rand(p) { if (p > Math.random() * 100) return true; return false; } function addCssClass(map) { var cssMap = []; for (var w = 0; w < map.length; w++) { cssMap[w] = []; for (var h = 0; h < map[w].length; h++) { var spClass = "ground_"; if (map[w][h] == "0" || (w <= 0 || h <= 0 || w >= map.length - 1 || h >= map[w].length - 1)) { if (Math.random() < 0.001) spClass = "water_1"; else if (Math.random() < 0.001) spClass = "water_2"; else spClass = "water"; } else if ((map[w][h - 1] == "0" && map[w][h] == "1" && map[w][h + 1] == "2" && map[w - 1][h + 1] == "1") || (map[w - 1][h - 1] == "0" && map[w][h] == "1" && map[w + 1][h] == "2" && map[w + 1][h - 1] == "1") || (map[w + 1][h] == "2" && map[w][h] == "1" && map[w][h + 1] == "2")) { if (map[w][h + 1] == "2" && map[w + 1][h] == "2") { if (map[w - 1][h + 1] == "1" && map[w + 1][h - 1] == "2") spClass = "topDown_1"; else if (map[w + 1][h - 1] == "1" && map[w - 1][h + 1] == "2") spClass = "leftRight_1"; else if (map[w + 1][h - 1] == "2" && map[w - 1][h + 1] == "2") spClass = "leftRightTT_1"; else spClass = "leftRightT_1"; } else spClass = "leftRightT_1"; } else if ((map[w][h + 1] == "0" && map[w][h] == "1" && map[w][h - 1] == "2" && map[w - 1][h - 1] == "1") || (map[w - 1][h] == "0" && map[w][h] == "1" && map[w + 1][h] == "2" && map[w + 1][h + 1] == "1") || (map[w + 1][h] == "2" && map[w][h] == "1" && map[w][h - 1] == "2")) { if (map[w][h - 1] == "2" && map[w + 1][h] == "2") { if (map[w - 1][h - 1] == "1" && map[w + 1][h + 1] == "2") spClass = "topDown_1"; else if (map[w + 1][h + 1] == "1" && map[w - 1][h - 1] == "2") spClass = "rightLeft_1"; else if (map[w - 1][h - 1] == "2" && map[w + 1][h - 1] == "2") spClass = "rightLeftTT_1"; else spClass = "rightLeftT_1"; } else spClass = "rightLeftT_1"; } else if ((map[w][h - 1] == "0" && map[w][h] == "1" && map[w][h + 1] == "2" && map[w + 1][h + 1] == "1") || (map[w + 1][h] == "0" && map[w][h] == "1" && map[w - 1][h] == "2" && map[w - 1][h - 1] == "1") || (map[w - 1][h] == "2" && map[w][h] == "1" && map[w][h + 1] == "2")) { if (map[w][h + 1] == "2" && map[w - 1][h] == "2") { if (map[w + 1][h + 1] == "1" && map[w - 1][h - 1] == "2") spClass = "downTop_1"; else if (map[w - 1][h - 1] == "1" && map[w + 1][h + 1] == "2") spClass = "leftRight_1"; else if (map[w - 1][h - 1] == "2" && map[w + 1][h + 1] == "2") spClass = "rightLeftBB_1"; else spClass = "rightLeftB_1"; } else spClass = "rightLeftB_1"; } else if ((map[w + 1][h] == "0" && map[w][h] == "1" && map[w - 1][h] == "2" && map[w - 1][h + 1] == "1") || (map[w][h + 1] == "0" && map[w][h] == "1" && map[w][h - 1] == "2" && map[w + 1][h - 1] == "1") || (map[w - 1][h] == "2" && map[w][h] == "1" && map[w][h - 1] == "2")) { if (map[w][h - 1] == "2" && map[w - 1][h] == "2") { if (map[w + 1][h - 1] == "1" && map[w - 1][h + 1] == "2") spClass = "downTop_1"; else if (map[w - 1][h + 1] == "1" && map[w + 1][h - 1] == "2") spClass = "rightLeft_1"; else if (map[w - 1][h + 1] == "2" && map[w - 1][h + 1] == "2") spClass = "leftRightBB_1"; else spClass = "leftRightB_1"; } else spClass = "leftRightB_1"; } else if (map[w][h - 1] == "3" && map[w][h] == "2" && map[w - 1][h] == "3") spClass = "rightLeftBU_2"; else if (map[w][h - 1] == "4" && map[w][h] == "3" && map[w - 1][h] == "4") spClass = "rightLeftBU_3"; else if (map[w][h - 1] == "6" && map[w][h] == "5" && map[w - 1][h] == "6") spClass = "rightLeftBU_5"; else if (map[w][h + 1] == "3" && map[w][h] == "2" && map[w - 1][h] == "3") spClass = "leftRightBU_2"; else if (map[w][h + 1] == "4" && map[w][h] == "3" && map[w - 1][h] == "4") spClass = "leftRightBU_3"; else if (map[w][h + 1] == "6" && map[w][h] == "5" && map[w - 1][h] == "6") spClass = "leftRightBU_5"; else if (map[w][h + 1] == "3" && map[w][h] == "2" && map[w + 1][h] == "3") spClass = "rightLeftTU_2"; else if (map[w][h + 1] == "4" && map[w][h] == "3" && map[w + 1][h] == "4") spClass = "rightLeftTU_3"; else if (map[w][h + 1] == "6" && map[w][h] == "5" && map[w + 1][h] == "6") spClass = "rightLeftTU_5"; else if (map[w][h - 1] == "3" && map[w][h] == "2" && map[w + 1][h] == "3") spClass = "leftRightTU_2"; else if (map[w][h - 1] == "4" && map[w][h] == "3" && map[w + 1][h] == "4") spClass = "leftRightTU_3"; else if (map[w][h - 1] == "6" && map[w][h] == "5" && map[w + 1][h] == "6") spClass = "leftRightTU_5"; else if (map[w][h - 1] == "0" && map[w][h] == "1" && map[w][h + 1] == "2") spClass = "leftRight_1"; else if (map[w][h - 1] == "1" && map[w][h] == "2" && map[w][h + 1] == "3") spClass = "leftRight_2"; else if (map[w][h - 1] == "2" && map[w][h] == "3" && map[w][h + 1] == "4") spClass = "leftRight_3"; else if (map[w][h] == "4") spClass = "ground"; else if (map[w][h - 1] == "4" && map[w][h] == "5" && map[w][h + 1] == "6") spClass = "leftRight_5"; else if (map[w][h] == "6") spClass = "grass"; else if ((map[w][h + 1] == "1" && map[w][h] == "1" && map[w + 1][h] == "1") || (map[w][h - 1] == "1" && map[w][h] == "1" && map[w + 1][h] == "1") || (map[w - 1][h] == "1" && map[w][h] == "1" && map[w][h + 1] == "1") || (map[w - 1][h] == "1" && map[w][h] == "1" && map[w][h - 1] == "1")) spClass = "water"; else if (map[w][h + 1] == "2" && map[w][h] == "2" && map[w + 1][h] == "2") spClass = "leftRightT_2"; else if (map[w][h + 1] == "3" && map[w][h] == "3" && map[w + 1][h] == "3") spClass = "leftRightT_3"; else if (map[w][h + 1] == "5" && map[w][h] == "5" && map[w + 1][h] == "5") spClass = "leftRightT_5"; else if (map[w - 1][h] == "0" && map[w][h] == "1" && map[w + 1][h] == "2") spClass = "topDown_1"; else if (map[w - 1][h] == "1" && map[w][h] == "2" && map[w + 1][h] == "3") spClass = "topDown_2"; else if (map[w - 1][h] == "2" && map[w][h] == "3" && map[w + 1][h] == "4") spClass = "topDown_3"; else if (map[w - 1][h] == "4" && map[w][h] == "5" && map[w + 1][h] == "6") spClass = "topDown_5"; else if (map[w][h + 1] == "0" && map[w][h] == "1" && map[w][h - 1] == "2") spClass = "rightLeft_1"; else if (map[w][h + 1] == "1" && map[w][h] == "2" && map[w][h - 1] == "3") spClass = "rightLeft_2"; else if (map[w][h + 1] == "2" && map[w][h] == "3" && map[w][h - 1] == "4") spClass = "rightLeft_3"; else if (map[w][h + 1] == "4" && map[w][h] == "5" && map[w][h - 1] == "6") spClass = "rightLeft_5"; else if (map[w][h - 1] == "2" && map[w][h] == "2" && map[w + 1][h] == "2") spClass = "rightLeftT_2"; else if (map[w][h - 1] == "3" && map[w][h] == "3" && map[w + 1][h] == "3") spClass = "rightLeftT_3"; else if (map[w][h - 1] == "5" && map[w][h] == "5" && map[w + 1][h] == "5") spClass = "rightLeftT_5"; else if (map[w + 1][h] == "0" && map[w][h] == "1" && map[w - 1][h] == "2") spClass = "downTop_1"; else if (map[w + 1][h] == "1" && map[w][h] == "2" && map[w - 1][h] == "3") spClass = "downTop_2"; else if (map[w + 1][h] == "2" && map[w][h] == "3" && map[w - 1][h] == "4") spClass = "downTop_3"; else if (map[w + 1][h] == "4" && map[w][h] == "5" && map[w - 1][h] == "6") spClass = "downTop_5"; else if (map[w][h + 1] == "2" && map[w][h] == "2" && map[w - 1][h] == "2") spClass = "leftRightB_2"; else if (map[w][h + 1] == "3" && map[w][h] == "3" && map[w - 1][h] == "3") spClass = "leftRightB_3"; else if (map[w][h + 1] == "5" && map[w][h] == "5" && map[w - 1][h] == "5") spClass = "leftRightB_5"; else if (map[w][h - 1] == "2" && map[w][h] == "2" && map[w - 1][h] == "2") spClass = "rightLeftB_2"; else if (map[w][h - 1] == "3" && map[w][h] == "3" && map[w - 1][h] == "3") spClass = "rightLeftB_3"; else if (map[w][h - 1] == "5" && map[w][h] == "5" && map[w - 1][h] == "5") spClass = "rightLeftB_5"; cssMap[w][h] = spClass; } } return cssMap; }