namastejs
Version:
A spiritual greeting from your JavaScript code. Because every function deserves a 'Namaste š'
133 lines (105 loc) ⢠3 kB
JavaScript
const { style } = require("../../theme");
const games = [
{
key: "snake",
name: "š Snake",
description: "Classic snake with smooth controls",
},
{
key: "typing-rain",
name: "āØļø Typing Rain",
description: "Improve typing speed while letters fall",
},
{
key: "invaders",
name: "š¾ Space Invaders",
description: "Defend earth from ASCII aliens",
},
];
let selectedIndex = 0;
/* āāāāāāāāā Terminal Helpers āāāāāāāāā */
function clear() {
process.stdout.write("\x1Bc");
}
function hideCursor() {
process.stdout.write("\x1b[?25l");
}
function showCursor() {
process.stdout.write("\x1b[?25h");
}
/* āāāāāāāāā Render Menu āāāāāāāāā */
function renderMenu() {
clear();
console.log(
style.gold(`
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā š® NAMASTE GAMES š® ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
`)
);
games.forEach((game, index) => {
const isSelected = index === selectedIndex;
if (isSelected) {
console.log(
style.bgBrightGreen(style.black(` ā¶ ${game.name.padEnd(18)} `)) +
style.gray(` ${game.description}`)
);
} else {
console.log(
` ${style.white(game.name.padEnd(18))} ${style.gray(
game.description
)}`
);
}
});
console.log(
style.cyan(`
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā ā Navigate Enter Play Ctrl+C Exit
`)
);
}
/* āāāāāāāāā Start Selected Game āāāāāāāāā */
function startGame(gameKey) {
// Stop menu input
process.stdin.removeAllListeners("data");
process.stdin.setRawMode(false);
process.stdin.pause();
showCursor();
clear();
// Load game directly
require(`./${gameKey}`);
}
/* āāāāāāāāā Input Handling āāāāāāāāā */
function handleKeypress(buffer) {
const key = buffer.toString();
if (key === "\u0003") {
showCursor();
clear();
process.exit(0);
}
if (key === "\u001B[A") {
// Up
selectedIndex = (selectedIndex - 1 + games.length) % games.length;
renderMenu();
}
if (key === "\u001B[B") {
// Down
selectedIndex = (selectedIndex + 1) % games.length;
renderMenu();
}
if (key === "\r") {
// Enter
startGame(games[selectedIndex].key);
}
}
/* āāāāāāāāā Boot āāāāāāāāā */
function startMenu() {
hideCursor();
renderMenu();
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on("data", handleKeypress);
}
startMenu();