UNPKG

zden

Version:

A tool to create random maps for battlecode 2016

159 lines (138 loc) 5.31 kB
var argv = require('minimist')(process.argv.slice(2)); var Map = require('./map'); var random = require('random-name'); var constants = require('./constants'); function createRandomMap(dir, zombieLevel, numArchons, numDens) { var i, num, weight, length; var width = Math.floor(Math.random() * 50 + 30); // 30 to 80 var height = Math.floor(Math.random() * 50 + 30); // 30 to 80 if (Math.random() < .5) { width = height; } var symmetry = Math.floor(Math.random() * 4); var mirrored = Math.random() > .5; var map = new Map(width, height, symmetry, mirrored); var groupArchons = Math.random() > .5; var archLocs = map.placeArchons(numArchons, groupArchons); var denLocs = map.placeDens(numDens, archLocs); map.decorateDens(denLocs); var solid = Math.random() < .5; var patchy = Math.random() < .3; var checkerboard = Math.random < .3; if (Math.random() < .7) { var typesOfBlocks = Math.ceil(Math.random() * Math.sqrt(height * width)); for (i = 0; i < typesOfBlocks; i++) { weight = Math.random() * 200; if (Math.random() < .1) { weight *= 100; } if (Math.random() < .01) { weight = 600000; } num = Math.ceil(Math.random() * 2); map.layBlocks(num, weight, solid, patchy, checkerboard); } } if (Math.random() < .7) { var typesOfWalls = Math.ceil(Math.random() * Math.sqrt(height * width)); for (i = 0; i < typesOfWalls; i++) { weight = Math.random() * 200; if (Math.random() < .1) { weight *= 100; } if (Math.random() < .01) { weight = 600000; } num = Math.ceil(Math.random() * 2); length = Math.ceil(Math.random() * Math.sqrt(height * width) - 5); map.layWalls(num, weight, length, solid); } } map.cleanArchonSpawn(archLocs.A); for (i = 0; i < archLocs.A; i++) { if (Math.random() < .25) { map.addPartsToArea(archLocs.A[i].x, archLocs.A[i].y, 10, false); } } // place some parts var numPartsCache = Math.round(Math.random() * 10); for (i = 0; i < numPartsCache; i++) { map.addPartsToArea(null, null, Math.round(Math.random() * 20), Math.random() < .3) } // place some neutrals // very low probability of archons if (Math.random() < .05) { map.placeNeutral(null, null, constants.units.ARCHON); } if (Math.random() < .01) { map.placeNeutral(null, null, constants.units.ARCHON); } var numNeutral = Math.random() * 10; for (i = 0; i < numNeutral; i++) { var type = constants.units.GUARD; if (Math.random() < .5) { type = constants.units.SOLDIER; } else if (Math.random() < .3) { type = constants.units.SCOUT; } else if (Math.random() < .3) { type = constants.units.TURRET; } map.placeNeutral(null, null, type); } var rubbleLevel = map.getRubbleLevel(); var name = [ "Z" + zombieLevel, "R" + rubbleLevel, "A" + numArchons, "D" + (2 * numDens), "W" + width, "H" + height, random.first() ].join("_"); map.save(name, dir, zombieLevel); } function validateOptions() { var valid = true; if (argv.z && (argv.z !== parseInt(argv.z) || argv.z < 0 || argv.z > 3) ) { console.log('z (zombie level) must be one of [0, 1, 2, 3] (0 light spawn, 3 max) eg: -z 0'); valid = false; } if (argv.a && (argv.a !== parseInt(argv.a) || argv.a < 1 || argv.a > 4) ) { console.log('a (num archons per team) must be one of [1, 2, 3, 4] eg: -a 1'); valid = false; } if (argv.d && (argv.d !== parseInt(argv.d) || argv.d % 2 !== 0 || argv.d < 2 || argv.a > 8) ) { console.log('d (num total dens) must be one of [2, 4, 6, 8] eg: -d 2'); if (argv.d === 0) { console.log("Unsure if there can be zero dens on a map, but if you know there can be, let me know!"); } valid = false; } return valid; } (function() { if (!argv.n || argv.h || argv.help || !validateOptions()) { console.log("Usage: zden -n <num maps>"); console.log("Optional params:"); console.log(" - z <zombie strength [0, 1, 2, 3]>"); console.log(" - a <num team archons [1, 2, 3, 4]>"); console.log(" - d <num total dens [2, 4, 6, 8]>"); console.log(" - o <output dir, defaults to '.'>"); return; } console.log("Thanks for using zden!"); var zombieLevel, numArchons, numDens; var i = 0; var total = parseInt(argv.n); while (i < total) { zombieLevel = argv.z === undefined ? Math.floor(Math.random() * 4) : argv.z; numArchons = argv.a === undefined ? Math.ceil(Math.random() * 4): argv.a; numDens = argv.d === undefined ? Math.ceil(Math.random() * 4): argv.d / 2; try { createRandomMap(argv.o || '.', zombieLevel, numArchons, numDens); i += 1; } catch (e) { } } console.log("Created " + parseInt(argv.n) + " test map(s)!"); }).call(this);