chore: restrukturierung der microservices in dev/lobby und dev/sector-dev (monorepo)

This commit is contained in:
2026-06-08 22:08:44 +02:00
parent 87f4d935c4
commit c1eb570b43
90 changed files with 10481 additions and 2 deletions
@@ -0,0 +1,98 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import texturePacker from 'free-tex-packer-core';
// ----------------------------------------------------------------------
// ES-Modul Workaround für __dirname
// Da Vite standardmäßig ES-Module verwendet (type: "module" in package.json),
// müssen wir __dirname manuell nachbauen, um absolute Pfade zu generieren.
// ----------------------------------------------------------------------
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// ----------------------------------------------------------------------
// Pfad-Konfiguration
// ----------------------------------------------------------------------
// Hier definieren wir, woher die rohen Bilder kommen und wohin der
// fertige Textur-Atlas gespeichert werden soll.
const RAW_ASSETS_DIR = path.resolve(__dirname, '../src/raw-assets/ui');
const OUTPUT_DIR = path.resolve(__dirname, '../src/assets');
const ATLAS_NAME = 'ui-atlas'; // Der Basisname für unsere Ausgabe (ui-atlas.png / ui-atlas.json)
// ----------------------------------------------------------------------
// Hauptfunktion zum Generieren des Sprite-Sheets
// ----------------------------------------------------------------------
async function buildSpriteSheet() {
console.log(`[Packer] Lese Bilder aus: ${RAW_ASSETS_DIR}`);
// Wir prüfen zunächst, ob der Quellordner existiert. Falls nicht,
// legen wir ihn an und brechen ab, da noch keine Bilder da sind.
if (!fs.existsSync(RAW_ASSETS_DIR)) {
fs.mkdirSync(RAW_ASSETS_DIR, { recursive: true });
console.log('[Packer] Quellordner existierte nicht und wurde erstellt. Bitte füge Bilder hinzu und starte neu.');
return;
}
// Wir lesen alle Dateien im Quellordner aus.
const files = fs.readdirSync(RAW_ASSETS_DIR);
// Wir filtern nach Bilddateien (z. B. PNG) und bereiten sie für den Packer vor.
const images = [];
for (const file of files) {
if (file.endsWith('.png')) {
const filePath = path.join(RAW_ASSETS_DIR, file);
// Der Packer benötigt den Dateipfad als "path" und den Dateiinhalt als "contents"
images.push({
path: file,
contents: fs.readFileSync(filePath)
});
}
}
if (images.length === 0) {
console.log('[Packer] Keine PNG-Bilder im Quellordner gefunden. Abbruch.');
return;
}
// ----------------------------------------------------------------------
// Packer-Konfiguration
// ----------------------------------------------------------------------
const options = {
textureName: ATLAS_NAME,
width: 4096, // Maximale Breite des Atlases
height: 4096, // Maximale Höhe des Atlases
padding: 2, // Pixel-Abstand zwischen den Bildern (verhindert Rand-Bluten)
allowRotation: false, // Für UI-Elemente oft besser deaktiviert, damit sie in PixiJS nicht gedreht geladen werden
exporter: 'Pixi', // Generiert direkt ein Format, das PixiJS nativ lesen kann
removeFileExtension: true // Entfernt das ".png" in den JSON-Keys (leichter in PixiJS aufzurufen)
};
console.log(`[Packer] Verpacke ${images.length} Bilder...`);
// Wir rufen den Packer asynchron auf
texturePacker(images, options, (files, error) => {
if (error) {
console.error('[Packer] Fehler beim Erstellen des Sprite-Sheets:', error);
return;
}
// Zielordner erstellen, falls er nicht existiert
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
}
// Der Packer gibt ein Array von Dateien zurück (Bild + JSON).
// Wir speichern diese direkt im Zielordner.
for (const item of files) {
const outPath = path.join(OUTPUT_DIR, item.name);
fs.writeFileSync(outPath, item.buffer);
console.log(`[Packer] Erfolgreich gespeichert: ${outPath}`);
}
console.log('[Packer] Sprite-Sheet erfolgreich erstellt!');
});
}
// Skript ausführen
buildSpriteSheet();