const UP_KEY = "KeyW"; const DOWN_KEY = "KeyS"; const LEFT_KEY = "KeyA"; const RIGHT_KEY = "KeyD"; const ACT_KEY = "KeyE"; const MENU_KEY = "KeyQ"; class bpu_window { constructor (frameBufferRef, coordinates, dimentions, options) { this.parentBuffer = frameBufferRef; this.coordinates = coordinates instanceof vector ? (coordinates.d.length == 2 ? coordinates : new vector([0,0])) : new vector([0,0]); this.dimentions = dimentions instanceof vector ? (dimentions.d.length == 2 ? dimentions : new vector([0,0])) : new vector([0,0]); // add options for title bar, close button, and minimize button // add container object for window, container for optional title bar, and container for contents. } } class bpu_menu { constructor (frameBufferRef, dimentions, closeable, options, callbackArray) { this.parentBuffer = frameBufferRef; this.closeable = "boolean" == typeof closeable ? closeable : true; this.options = Array.isArray(options) ? options : ["Empty Menu"]; this.callbackArray = Array.isArray(callbackArray) ? callbackArray : options.map(o=>{ return function () { print(o); } }); this.callbackArray = this.callbackArray.map(cb=>{ if ("function" == typeof cb) { return cb; } else { return ()=> { print("Not Implimented") }; } }); this.dimentions = dimentions instanceof vector ? dimentions : new vector([500,500]); this.renderLayer = new container( new vector([0,0]), this.dimentions); this.active = false; this.selectedOption = 0; this.renderLayer.addShape(new shape("rect", new vector([0,0]), this.dimentions, null, "#ffffff", "#000000", 2)); this.selectorShape = new shape("rect", new vector([5,2]), new vector([this.dimentions.d[0] - 10, 16]), null, "#aaaaaa", "#000000", 2); this.renderLayer.addShape(this.selectorShape); // add case for menu with more options than screen allows this.optionShapes = []; for (var i = 0; i < this.options.length; i++) { var thisOption = this.options[i]; this.optionShapes[i] = new shape("text", new vector([10,20+20*i]), new vector([this.dimentions.d[0] - 20,20]), null, "#000000", null, null, {text:thisOption}); this.renderLayer.addShape(this.optionShapes[i]); } } activate () { this.previousMenu = window.activeMenu; window.activeMenu = this; this.active = true; this.selectedOption = 0; this.selectorShape.coordinates.d[1] = 8 + 20 * this.selectedOption; this.parentBuffer.addContainer(this.renderLayer); } deactivate () { window.activeMenu = this.previousMenu; var layerID = this.parentBuffer.containerArray.indexOf(this.renderLayer); this.parentBuffer.containerArray.splice(layerID,1); } selectItem () { this.deactivate(); this.callbackArray[this.selectedOption](); } move (n) { this.selectedOption = (this.selectedOption + n + this.options.length) % this.options.length; this.selectorShape.coordinates.d[1] = 8 + 20 * this.selectedOption; } controls (e) { var input = e.code; if ((input == MENU_KEY) && this.closeable ) { this.deactivate(); } if (input == ACT_KEY) { this.selectItem(); } if (input == UP_KEY) { this.move(-1); } if (input == DOWN_KEY) { this.move(1); } } } class bpu_dialogBox { constructor (parentBufferRef) { this.parentBufferRef = parentBufferRef; this.messageLayer = new container(new vector([0, parentBufferRef.height - 100]), new vector([parentBufferRef.width, 100])); this.messageLayer.addShape( new shape("rect", new vector([0,0]), this.messageLayer.size, null, "#ffffff", "#000000", 1)); this.line = [ new shape("text", new vector([30,30]), new vector([this.messageLayer.size.d[0]-20,30]),null, "#000000"), new shape("text", new vector([30,60]), new vector([this.messageLayer.size.d[0]-20,30]),null, "#000000") ]; this.textQueue = []; this.messageLayer.addShape( this.line[0] ); this.messageLayer.addShape( this.line[1] ); } progressMessage () { if (this.textQueue.length <= 1) { if (undefined != this.choice) { this.choice.activate(); this.choice = undefined; return; } else { this.deactivate(); } } this.textQueue.shift(); this.line[0].text = "string" == typeof this.textQueue[0] ? this.textQueue[0] : ""; this.line[1].text = "string" == typeof this.textQueue[1] ? this.textQueue[1] : ""; } activate (message="No message", interactive, choice) { message = "string" == typeof message ? message : "No valid text"; interactive = "boolean" == typeof interactive ? interactive : false; this.choice = choice instanceof menu ? choice : undefined; this.textQueue.push(...message.match(/.{1,50}( |$)/g)); if (!this.parentBufferRef.containerArray.includes(this.messageLayer)) { this.parentBufferRef.addContainer(this.messageLayer); } this.line[0].text = "string" == typeof this.textQueue[0] ? this.textQueue[0] : ""; this.line[1].text = "string" == typeof this.textQueue[1] ? this.textQueue[1] : ""; if (interactive) { if (undefined != window.activeDialog) { this.previousDialog = window.activeDialog; } window.activeDialog = this; } else { var me = this; setTimeout(function () { me.progressMessage(); }, 5000); // Not cleaned up properly yet } } deactivate () { var layerID = this.parentBufferRef.containerArray.indexOf(this.messageLayer); this.parentBufferRef.containerArray.splice(layerID,1); if (undefined != this.previousDialog) { window.activeDialog = this.previousDialog; this.previousDialog = undefined; } else { window.activeDialog = undefined; } } controls (e) { this.progressMessage(); } }