Skip to content

Instantly share code, notes, and snippets.

@lethern
Last active June 12, 2020 18:41
Show Gist options
  • Save lethern/b4da7aa205d3ead828fac4a7d5eebf0c to your computer and use it in GitHub Desktop.
Save lethern/b4da7aa205d3ead828fac4a7d5eebf0c to your computer and use it in GitHub Desktop.
menu.js
let MENU = {};
let VISUALS = require('visuals');
/**
* @param {Room} room
* @return {MenuItem}
*/
MENU.getRoot = function (room) {
let root = new MenuItem();
root.isroot = true;
if (room.memory.clicked === undefined)
room.memory.clicked = [];
return root;
};
/**
* @param {MenuItem} elem
* @param {number[]} clicked_array
* @param {number} level
*/
MENU.goUpParents = function (elem, clicked_array, level) {
if (level >= clicked_array.length) return elem;
let next = clicked_array[level];
let next_elem = elem.items[next];
return MENU.goUpParents(next_elem, clicked_array, level + 1);
};
/**
* @param {MenuItem} root
* @param {Room} room
* @param {any} pos
*/
MENU.renderRoot = function (root, room, pos) {
root.pos = pos;
if (room.memory.clicked.length) {
let elem = MENU.goUpParents(root, room.memory.clicked, 0);
elem.draw(room);
} else {
root.draw(room);
}
};
/**
* @param {Room} room
* @param {MenuItem} root
*/
MENU.handleInput = function (room, root) {
let p = root.getRenderPos();
let pos = { x: p.x - 1, y: p.y };
room.find(FIND_FLAGS).forEach(flag => {
if (flag.pos.x == pos.x && flag.pos.y >= pos.y && flag.pos.y < pos.y + root.items.length) {
MENU.clicked(room, root, flag.pos.y - pos.y);
}
flag.remove();
});
};
/**
* @param {Room} room
* @param {MenuItem} root
* @param {number} index
*/
MENU.clicked = function (room, root, index) {
if (room.memory.clicked.length >= 1 && index == 0) {
//go back
room.memory.clicked.pop();
return;
}
let elem = root.items[index];
if (elem.func) elem.func();
else if (elem.items.length) {
// render..
room.memory.clicked.push(index);
} else {
return;
}
}
class MenuItem {
constructor(parent, text, func) {
this.parent = parent;
this.items = [];
this.text = text;
this.func = func;
}
addItem(text, func) {
let item = new MenuItem(this, text, func);
this.items.push(item);
return item;
}
/**
* @param {Room} room
*/
draw(room) {
let pos = this.getRenderPos();
let p = new RelativePos(pos);
const textSize = 6.5;
const frameHeight = 10;//textSize + 1;
const frameWidth = 50;
let btn = new RelativePos(pos);
btn.move(-10, 0);
if (!this.isroot) {
this.items.unshift(new MenuItem(this, '^ back'));
}
this.items.forEach( (item,i) => {
room.visual.poly([p.rel(0, 0), p.rel(frameWidth, 0), p.rel(frameWidth, frameHeight), p.rel(0, frameHeight), p.rel(0, 0)], { strokeWidth: 0.05 });
room.visual.text(item.text, p.rel(1.5, 7.5), { align: 'left' });
p.move(0, frameHeight);
room.visual.poly([btn.rel(0, 0), btn.rel(9.6, 0), btn.rel(9.6, 10), btn.rel(0, 10), btn.rel(0, 0)], { strokeWidth: 0.05, stroke: '#CC7777' });
btn.move(0, frameHeight);
});
}
getRenderPos() {
if (this.pos) return this.pos;
else return this.parent.getRenderPos();
}
}
class RelativePos {
constructor(pos) {
this.x = pos.x-0.5;
this.y = pos.y-0.5;
}
rel(x, y) {
return { x: this.x + x/10, y: this.y + y/10 };
}
move(x, y) {
this.x += x/10;
this.y += y/10;
}
}
module.exports = MENU;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment