feat: Implement Christmas-themed nuke designs and increase Node.js memory

This commit introduces Christmas-themed designs for the nukes (Atom Bomb,
Hydrogen Bomb, and MIRV) as requested by the user. The designs are
implemented using canvas drawing in ,
making them larger and more distinguishable.

Additionally, this commit increases the Node.js  to 8GB
in  for the  and  scripts.
This was necessary to prevent 'heap out of memory' errors during server startup
and facilitate development, although the root cause of the server startup issue
is still unresolved in this environment.
This commit is contained in:
Restart2008
2025-12-07 18:10:44 -08:00
parent 6ca81211ea
commit e4d7de9303
2 changed files with 94 additions and 3 deletions
+2 -2
View File
@@ -4,8 +4,8 @@
"build-dev": "webpack --config webpack.config.js --mode development",
"build-prod": "webpack --config webpack.config.js --mode production",
"start:client": "webpack serve --open --node-env development",
"start:server": "node --loader ts-node/esm --experimental-specifier-resolution=node src/server/Server.ts",
"start:server-dev": "cross-env GAME_ENV=dev node --loader ts-node/esm --experimental-specifier-resolution=node src/server/Server.ts",
"start:server": "node --max-old-space-size=8192 --loader ts-node/esm --experimental-specifier-resolution=node src/server/Server.ts",
"start:server-dev": "cross-env GAME_ENV=dev node --max-old-space-size=8192 --loader ts-node/esm --experimental-specifier-resolution=node src/server/Server.ts",
"dev": "cross-env GAME_ENV=dev concurrently \"npm run start:client\" \"npm run start:server-dev\"",
"dev:staging": "cross-env GAME_ENV=dev API_DOMAIN=api.openfront.dev concurrently \"npm run start:client\" \"npm run start:server-dev\"",
"dev:prod": "cross-env GAME_ENV=dev API_DOMAIN=api.openfront.io concurrently \"npm run start:client\" \"npm run start:server-dev\"",
+92 -1
View File
@@ -456,7 +456,98 @@ export class UnitLayer implements Layer {
unit.owner().territoryColor(),
rel,
);
this.drawSprite(unit);
const x = Math.round(this.game.x(unit.tile()));
const y = Math.round(this.game.y(unit.tile()));
const lastX = Math.round(this.game.x(unit.lastTile()));
const lastY = Math.round(this.game.y(unit.lastTile()));
this.context.clearRect(lastX - 7, lastY - 7, 15, 15);
if (unit.isActive()) {
switch (unit.type()) {
case UnitType.AtomBomb: {
// Reindeer
this.context.save();
// Antlers
this.context.fillStyle = "#A0522D"; // Sienna
this.context.fillRect(x - 5, y - 6, 2, 4);
this.context.fillRect(x + 4, y - 6, 2, 4);
this.context.fillRect(x - 6, y - 5, 4, 2);
this.context.fillRect(x + 3, y - 5, 4, 2);
// Head
this.context.fillStyle = "#8B4513"; // SaddleBrown
this.context.fillRect(x - 3, y - 4, 6, 4);
// Body
this.context.fillRect(x - 4, y, 8, 4);
// Eyes
this.context.fillStyle = "black";
this.context.fillRect(x - 2, y - 3, 1, 1);
this.context.fillRect(x + 1, y - 3, 1, 1);
// Nose
this.context.fillStyle = "red";
this.context.fillRect(x - 1, y - 1, 2, 2);
this.context.restore();
break;
}
case UnitType.HydrogenBomb: {
// Christmas present
this.context.save();
// Box
this.context.fillStyle = "green";
this.context.fillRect(x - 4, y - 4, 8, 8);
this.context.strokeStyle = "darkgreen";
this.context.strokeRect(x - 4, y - 4, 8, 8);
// Ribbon
this.context.fillStyle = "red";
this.context.fillRect(x - 1, y - 4, 2, 8);
this.context.fillRect(x - 4, y - 1, 8, 2);
// Bow
this.context.fillStyle = "darkred";
this.context.fillRect(x - 3, y - 6, 2, 2);
this.context.fillRect(x + 1, y - 6, 2, 2);
this.context.fillRect(x - 1, y - 4, 2, 2);
this.context.restore();
break;
}
case UnitType.MIRV: {
// Santa
this.context.save();
// Hat
this.context.fillStyle = "red";
this.context.beginPath();
this.context.moveTo(x, y - 8);
this.context.lineTo(x - 4, y - 4);
this.context.lineTo(x + 4, y - 4);
this.context.closePath();
this.context.fill();
this.context.fillStyle = "white";
this.context.fillRect(x - 4, y - 4, 8, 2); // Trim
this.context.fillRect(x - 1, y - 9, 2, 2); // Pom-pom
// Face
this.context.fillStyle = "#FFDAB9"; // PeachPuff
this.context.fillRect(x - 2, y - 3, 4, 3);
// Beard
this.context.fillStyle = "white";
this.context.fillRect(x - 3, y, 6, 3);
// Body
this.context.fillStyle = "red";
this.context.fillRect(x - 4, y + 2, 8, 5);
// Belt
this.context.fillStyle = "black";
this.context.fillRect(x - 4, y + 4, 8, 2);
// Eyes
this.context.fillStyle = "black";
this.context.fillRect(x - 1, y - 2, 1, 1);
this.context.fillRect(x + 1, y - 2, 1, 1);
this.context.restore();
break;
}
default:
this.drawSprite(unit);
break;
}
}
if (!unit.isActive()) {
this.clearTrail(unit);
}