UNPKG

hobgoblin

Version:

A framework for writing roguelike games in JavaScript, implementing ROT.js

147 lines (129 loc) 4.05 kB
#!/usr/bin/env node --harmony 'use strict'; // https://medium.freecodecamp.com/writing-command-line-applications-in-nodejs-2cf8327eee2#.196im2niz // https://www.npmjs.com/package/commander // https://developer.atlassian.com/blog/2015/11/scripting-with-node/ const program = require('commander'), chalk = require('chalk'), ProgressBar = require('progress'), fs = require('fs'), p = require('path'); var hobgoblinDir = p.dirname(require.main.filename); var srcDir = hobgoblinDir + '/src/'; var exampleDir = hobgoblinDir + '/examples/'; program .version('1.2.0') .command('init') .description('Initialize framework in current directory') .option('-e, --examples', 'Pull in all example files') .action(function(options) { // If the js dir doesn't exist, create it if(!fs.existsSync('js/')) fs.mkdir('js'); // Copy over the main files let contents = fs.readdirSync(srcDir); let jsDir = fs.readdirSync('js'); let jsFiles = []; for (var i = 0; i < contents.length; i++) { if(jsDir.indexOf(contents[i]) > -1) { console.log(chalk.blue(contents[i] + ' already exists. Skipping...')); } else { let filePath = srcDir + contents[i]; let fileSize = fs.statSync(filePath).size; let readStream = fs.createReadStream(filePath); let newFile = fs.createWriteStream('js/' + contents[i]); let bar = new ProgressBar("Writing file " + contents[i] + ": [:bar] :percent", {total: fileSize}); readStream.on('data', (chunk) => { bar.tick(chunk.length); newFile.write(chunk); }); readStream.on('end', () => { newFile.end(); }); readStream.on('error', (err) => { newFile.end(); console.error(err); }); } } // Copy examples, if specified if(options.examples) { let examples = fs.readdirSync(exampleDir); let exampleFiles = examples.map((file) => { return 'example-' + file; }); for (var i = 0; i < exampleFiles.length; i++) { if(jsDir.indexOf(exampleFiles[i]) > -1) { console.log(chalk.blue(exampleFiles[i] + ' already exists. Skipping...')); } else { let filePath = exampleDir + examples[i]; // read from unmodified file name let fileSize = fs.statSync(filePath).size; let readStream = fs.createReadStream(filePath); let newFile = fs.createWriteStream('js/' + exampleFiles[i]); let bar = new ProgressBar("Writing file " + exampleFiles[i] + ": [:bar] :percent", {total: fileSize}); readStream.on('data', (chunk) => { bar.tick(chunk.length); newFile.write(chunk); }); readStream.on('end', () => { newFile.end(); }); readStream.on('error', (err) => { newFile.end(); console.error(err); }); } } jsFiles = contents.concat(exampleFiles); } if(fs.existsSync('index.html')) console.log(chalk.blue("index.html already exists. Skipping...")); else fs.writeFile('index.html', generateIndexHTML(jsFiles), (err) => { if(err) console.error(err); else console.log(chalk.bold.green("done!")); }); }); function generateIndexHTML(jsFiles) { var jsOrder = [ "game.js", "loader.js", "utilities.js", "palette.js", "geometry.js", "repository.js", "glyph.js", "glyph-dynamic.js", "tile.js", "tiles.js", "entity.js", "entity-mixins.js", "item.js", "item-mixins.js", "map.js", "screen.js", "ai.js", "ai-tasks.js", "example-screens.js", "example-tiles.js", "example-items.js", "example-entities.js", "commands.js", "input.js" ]; var html = '<!DOCTYPE html>\n'; html += '<html lang="en">\n'; html += '<head>\n'; html += '\t<meta charset="UTF-8">\n'; html += '\t<title>[Your Game] - A Roguelike</title>\n'; for (var i = 0; i < jsFiles.length; i++) { if(jsOrder.indexOf(jsFiles[i]) < 0) throw new Error("This file must be ordered: " + jsFiles[i]); html += '\t<script src="js/' + jsOrder[i] + '" type="text/javascript"></script>\n'; } html += '</head>\n'; html += '<body></body>\n'; html += '</html>'; return html; } program.parse(process.argv);