hadean-old/src/term-ui/GiftPopup.ts

85 lines
2.2 KiB
TypeScript

import chalk from 'chalk';
import blessed from 'neo-blessed';
import { Game } from '../Game.js';
import { ItemState } from '../registries/Items.js';
import { Player } from "../multiplayer/Player";
import { Pawn } from '../Pawn.js';
import { getTheme, boxStyle } from '@themes';
import { panels } from './UI.js';
export class GiftPopup {
box;
selected = 0;
player: Player;
pawns = new Map<Pawn, number>();
constructor(player: Player) {
this.player = player;
this.box = blessed.box({
top: 0,
left: 'center',
width: 'shrink',
height: 'shrink',
tags: true,
...boxStyle(),
});
this.box.on('keypress', (evt: {}, key: {full: string}) => {
if(key.full === 'enter') {
this.send();
} if(key.full === 'escape' || key.full === 'enter') {
Game.current.clock.resume();
panels.screen.remove(this.box);
} else if (key.full === 'up') {
this.selected --;
} else if (key.full === 'down') {
this.selected ++;
} else if (key.full === 'right') {
this.pawns.set(Game.current.pawns[this.selected], 1);
} else if (key.full === 'left') {
this.pawns.set(Game.current.pawns[this.selected], 0);
}
this.render();
});
this.render();
for(const pawn of Game.current.pawns) this.pawns.set(pawn, 0);
panels.screen.append(this.box);
this.box.focus();
Game.current.clock.pause();
}
send() {
const stuffToSend: (Pawn | ItemState<any>)[] = [];
for(const [pawn, qty] of this.pawns) {
if(qty === 0) continue;
stuffToSend.push(pawn);
pawn.stopWorking();
// Game.current.removePawn
}
this.player.send(stuffToSend).then(_ => {
}).catch(_ => {
});
}
render() {
let i = 0;
this.box.setContent(`${(() => {
let pawns = [];
for (const [pawn, qty] of this.pawns.entries()) {
const style = i === this.selected ? getTheme().bright : getTheme().normal;
if(qty > 0) {
pawns.push(style(`{|}${pawn.toString()} `))
} else {
pawns.push(style(` ${pawn.toString()}{|}`))
}
// pawns[pawns.length - 1] = chalk.underline(pawns[pawns.length - 1])
i ++;
}
return pawns.join('\n')
})()}\n\n{|}${getTheme().hotkey('escape')}${getTheme().normal(': Cancel ')}\n{|}${getTheme().hotkey('enter')}${getTheme().normal(': Okay ')}`);
panels.screen.render();
}
}