termitype
Version:
A simple terminal based typing game
103 lines (102 loc) • 3.5 kB
JavaScript
import fs from "fs";
import { clearEntireScreen, exitAltTerminal, hideCursor, setCursorPos, write, } from "../core/io.js";
import { Scene } from "../core/scene.js";
import { Input } from "../core/input.js";
import { Menu } from "../components/index.js";
import { readGameFile, writeToFile } from "../game/utils.game.js";
import path from "path";
import { saveUser, statInit } from "../game/services/user.js";
import { truthifyAppStateSkip } from "./input-menu.scene.js";
const __dirname = import.meta.dirname;
const { isChar, isEnter } = Input;
export const fp = path.join(__dirname, "../..", "storage/prompts");
export class GameLevel extends Scene {
menu;
opt;
menuStr;
selected;
promptCategory;
constructor() {
super();
this.opt = "";
this.menuStr = "";
this.selected = false;
const lvlMenu = ["Beginner", "Intermediate", "Advance", "Master"];
const menu = [...lvlMenu, "Back", "Exit"];
this.promptCategory = lvlMenu.map((menu) => menu.toLowerCase());
const fp = path.join(__dirname, "../..", "storage/saves/user.json");
try {
const userStr = fs.readFileSync(fp);
if (userStr) {
const user = JSON.parse(userStr.toString());
this.menu = new Menu(menu, {
checkedOpt: user.level,
optCheckMarker: "▫️",
});
}
else {
this.menu = new Menu(menu);
}
}
catch (error) {
fs.openSync(fp, "w");
this.menu = new Menu(menu);
}
}
async init() {
clearEntireScreen();
setCursorPos();
// add a check for selected level.
// get it from saved
const { opt, menu } = this.menu.getOpt();
this.opt = opt;
this.menuStr = menu;
hideCursor();
write(menu);
}
async update(key) {
this.selected = isEnter(key) ? true : false;
const { opt, menu } = this.menu.getOpt(key);
this.opt = opt;
this.menuStr = menu;
const lowerCasedOpt = opt.toLowerCase();
const appStateStr = await readGameFile("saves/app-state.json");
const appState = JSON.parse(appStateStr);
if (this.promptCategory.includes(lowerCasedOpt)) {
await writeToFile("game-state", {});
}
if (this.promptCategory.includes(lowerCasedOpt) && this.selected) {
// save game level
const userStr = await readGameFile("saves/user.json");
if (!userStr) {
await saveUser();
}
else {
const user = JSON.parse(userStr);
user.level = lowerCasedOpt;
user.stat = statInit;
user.improved = false;
await saveUser(user);
}
if (!appState.skipUserInput) {
truthifyAppStateSkip();
return { nextScene: "game" };
}
return { nextScene: "gameLevel" };
}
if (isChar(opt, "Back") && this.selected) {
return { nextScene: "settings" };
}
if (isChar(opt, "Exit") && this.selected) {
clearEntireScreen();
exitAltTerminal();
process.exit();
}
return { nextScene: "" };
}
render() {
clearEntireScreen();
setCursorPos();
write(this.menuStr);
}
}