API/client/src/services/GameDataManager.js
2026-03-29 08:41:19 +03:00

191 lines
4.4 KiB
JavaScript

import React from "react";
class GameDataManager {
constructor() {
this.items = new Map();
this.recipes = new Map();
this.skills = new Map();
this.dungeons = new Map();
this.enemies = new Map();
this.translations = {};
this.manifest = {};
this.currentLang = "en_US";
this.isLoaded = false;
}
initialize(data) {
if (Array.isArray(data.items)) {
data.items.forEach((item) => this.items.set(item.id, item));
}
if (Array.isArray(data.recipes)) {
data.recipes.forEach((recipe) => this.recipes.set(recipe.id, recipe));
}
if (Array.isArray(data.dungeons)) {
data.dungeons.forEach((d) => this.dungeons.set(d.id, d));
}
if (Array.isArray(data.enemies)) {
data.enemies.forEach((e) => this.enemies.set(e.id, e));
}
if (Array.isArray(data.skills)) {
data.skills.forEach((s) => this.skills.set(s.id, s));
}
if (data.languages) {
this.translations = data.languages;
}
if (data.manifest) {
this.manifest = data.manifest;
}
this.isLoaded = true;
}
t(key) {
if (!key) return "";
const langData = this.translations[this.currentLang];
if (!langData) return key;
if (langData[key]) return langData[key];
if (key.includes(".")) {
const value = key
.split(".")
.reduce((obj, i) => (obj ? obj[i] : null), langData);
if (value) return value;
}
return key;
}
getStatName(statPath) {
const fullKey = `stats.category.original.${statPath}`;
return this.t(fullKey);
}
_getCategoriesFromManifest(section) {
if (!this.manifest[section] || !this.manifest[section].categories)
return [];
return Object.entries(this.manifest[section].categories).map(
([id, config]) => ({
id,
displayName: this.t(config.displayName),
rawConfig: config,
}),
);
}
getRecipeCategories() {
return this._getCategoriesFromManifest("recipes");
}
getShopCategories() {
return this._getCategoriesFromManifest("shop");
}
getSkillCategories() {
return this._getCategoriesFromManifest("skills");
}
getRecipesByCategory(category) {
return Array.from(this.recipes.values())
.filter((recipe) => recipe.type === category)
.map((recipe) => this.getRecipe(recipe.id))
.filter(Boolean);
}
_cleanId(id) {
if (!id || typeof id !== "string") return id;
let clean = id.includes(":") ? id.split(":")[1] : id;
if (clean.includes("/")) {
const parts = clean.split("/");
clean = parts[parts.length - 1];
}
return clean;
}
getEnemy(id) {
const cleanId = this._cleanId(id);
const enemy = this.enemies.get(cleanId);
if (!enemy) {
return {
id: cleanId,
displayName: `Unknown Entity (${cleanId})`,
level: 1,
stats: { hp: 100 },
};
}
return {
...enemy,
displayName: this.t(enemy.displayName),
};
}
getItem(id) {
const item = this.items.get(id);
if (!item) {
return {
id: id,
displayName: id.replace(/_/g, " "),
texture: null,
description: "Data not found",
meta: { rarity: "common" },
};
}
return {
...item,
displayName: this.t(item.displayName),
description: this.t(item.description),
};
}
getRecipe(recipeId) {
const recipe = this.recipes.get(recipeId);
if (!recipe) return null;
const outputData = Object.entries(recipe.output || {})[0];
const targetItemId = outputData ? outputData[0] : recipe.id;
const resultItem = this.getItem(targetItemId);
return {
...recipe,
displayName: resultItem.displayName,
texture: resultItem.texture,
description: resultItem.description,
ingredients: (recipe.inputs || []).map((inputObj) => {
const [itemId, quantity] = Object.entries(inputObj)[0];
const itemInfo = this.getItem(itemId);
return {
itemId,
quantity,
...itemInfo,
};
}),
};
}
getDungeon(id) {
const dungeon = this.dungeons.get(id);
if (!dungeon) return null;
return {
...dungeon,
displayName: this.t(dungeon.displayName),
description: this.t(dungeon.description),
};
}
setLanguage(langCode) {
if (this.translations[langCode]) {
this.currentLang = langCode;
}
}
}
const instance = new GameDataManager();
export default instance;