UNPKG

platform-pixels-level-generator

Version:

A command line tool used to generate levels

143 lines (118 loc) 4.27 kB
"use strict"; var Grid = require('./Grid'); var constants = require('./constants'); var r = require('./random'); // Define components; var Start = require('./components/Start'); var Finish = require('./components/Finish'); var components = { easy: [ //require('./components/BasicTurn'), require('./components/Pit'), require('./components/Pit'), require('./components/Pit'), require('./components/Chimney'), require('./components/WidePit'), require('./components/Floaters') ], medium: [ require('./components/Pit'), require('./components/Chimney'), require('./components/WidePit'), require('./components/WidePit'), require('./components/Floaters'), require('./components/Cave') ], hard: [ require('./components/Chimney'), require('./components/Chimney'), require('./components/WidePit'), require('./components/WidePit'), require('./components/Floaters'), require('./components/Cave'), require('./components/Cave') ] }; class Level { constructor (difficulty) { this.difficulty = difficulty; this.components = []; this.addComponent(Start); var avgNumComponents = Math.max(1, difficulty / 4); var numComponents = r.i(avgNumComponents * 0.75, avgNumComponents * 1.25); var toChoose; for (var i = 0; i < numComponents; i++) { if (difficulty < 10) { toChoose = components.easy; } else if (difficulty < 20) { toChoose = components.medium; } else { toChoose = components.hard; } this.addComponent(r.choice(toChoose), difficulty); } this.addComponent(Finish); this.grid = null; } addComponent (cls) { var c = new cls(this.difficulty); c.draw(); this.components.push(c); } draw () { // Default to the "start" component's grid var lastComponent = this.components[0]; this.grid = lastComponent.grid; for (let i = 1; i < this.components.length; i++) { let component = this.components[i]; let hallWidth = r.i(1, 4); // Find the exit and entrance let exit = this.grid.findExit(); let entrance = component.grid.findEntrance(); let totalWidth = component.grid.width + this.grid.width + hallWidth; let offsetX = totalWidth - component.grid.width; let offsetY = exit.floor - entrance.floor; // Calculate new height // TODO: Optimize this let totalHeight = component.grid.height + this.grid.height + Math.abs(offsetY); let newGrid = new Grid(totalWidth, totalHeight); if (offsetY < 0) { // New one is below old one newGrid.add(this.grid, 0, -offsetY); newGrid.add(component.grid, offsetX, 0); newGrid.clear( this.grid.width, entrance.floor + 1, offsetX - 1, entrance.floor + 1 + Math.max(exit.height, entrance.height) - 1 ); } else { // New one is above old one newGrid.add(this.grid, 0, 0); newGrid.add(component.grid, offsetX, offsetY); newGrid.clear( this.grid.width, exit.floor + 1, offsetX - 1, exit.floor + 1 + Math.max(exit.height, entrance.height) - 1 ); } // Replace current grid with the new one and continue this.grid = newGrid; this.grid.crop(1, 0, 1, 1); } this.grid.crop(10, 10, 10, 10); // Make sure the final grid is at least x by y var finalGrid = new Grid( Math.max(40, this.grid.width), Math.max(20, this.grid.height) ); finalGrid.add(this.grid); this.grid = finalGrid; } print () { this.grid.print(); } saveImage (path) { this.grid.saveImage(path); } } module.exports = Level;