namastejs
Version:
A spiritual greeting from your JavaScript code. Because every function deserves a 'Namaste 🙏'
85 lines (66 loc) • 1.76 kB
JavaScript
const state = require("./state");
const { FPS } = require("./config");
const initInput = require("./input");
const spawnEnemies = require("./systems/spawn");
const {
moveEnemies,
moveBullets,
moveEnemyBullets,
} = require("./systems/movement");
const enemyShoot = require("./systems/enemyShoot");
const handleCollisions = require("./systems/collision");
const {
drawBorder,
drawHeader,
createGrid,
renderGrid,
drawPlayer,
drawEnemies,
parkCursor,
drawBullets,
drawExplosions,
drawEnemyBullets,
} = require("./renderer");
// hide cursor
process.stdout.write("\x1B[?25l");
function restoreTerminal() {
process.stdout.write("\x1B[?25h");
process.stdin.setRawMode(false);
process.stdin.pause();
console.clear();
}
process.stdin.on("data", (k) => {
if (k.toString() === "\u0003") restoreTerminal();
});
function gameLoop() {
if (!state.running) return;
enemyShoot(state);
if (state.enemyShootCooldown > 0) {
state.enemyShootCooldown--;
}
moveEnemies(state);
moveBullets(state);
moveEnemyBullets(state);
handleCollisions(state);
drawHeader(state);
const grid = createGrid();
drawPlayer(grid, state.player);
drawEnemies(grid, state.enemies);
drawBullets(grid, state.bullets);
drawEnemyBullets(grid, state.enemyBullets);
drawExplosions(grid, state.explosions);
state.explosions = state.explosions.filter((e) => e.ttl > 0);
renderGrid(grid);
parkCursor();
setTimeout(gameLoop, 1000 / FPS);
}
function start() {
process.stdin.setRawMode(true);
process.stdin.resume();
console.clear();
drawBorder();
spawnEnemies(state); // 👾 spawn once
initInput(state);
gameLoop();
}
start();