import { Game } from "@game"; import { ItemState } from "@items"; import { boxStyle, getTheme } from "@themes"; import { panels } from "./UI"; import EventEmitter from "events"; import blessed from 'neo-blessed'; type ItemFilterFunction = (itemState: ItemState) => boolean; export class SelectItem { box: any; emitter: EventEmitter; qty: number; items: ItemState[]; selectedIdx: number; static show(filter: ItemFilterFunction, qty: number = 1): Promise> { const si = new SelectItem(filter, qty); return new Promise(res => { si.emitter.on('selected', (itemState: ItemState) => { res(itemState); }); si.emitter.on('cancel', () => { res(null); }) }); } private open() { panels.screen.append(this.box); this.box.focus(); Game.current.clock.pause(); } private close() { Game.current.clock.start(); panels.screen.remove(this.box); } get selectedItem(): ItemState { return null; } private constructor(filter: ItemFilterFunction, qty: number) { this.emitter = new EventEmitter(); this.qty = qty; this.box = blessed.box({ top: 'center', left: 'center', width: 'shrink', height: 'shrink', tags: true, ...boxStyle(), }); this.box.on('keypress', (evt: {}, key: {full: string}) => { if(key.full === 'escape') { this.emitter.emit('cancel'); this.close(); } else if(key.full === 'enter') { this.emitter.emit('selected', this.selectedItem.take(this.qty)); this.close(); } else if(key.full === 'down') { } }); this.items = Game.current.inv.items.filter(filter); this.update(); this.open(); } update() { this.box.setContent('test'); panels.screen.render(); } }