// ============================================================
// DATA-LOADER.JS — Загрузка игровых данных из JSON-файлов
// ============================================================
// Требует локальный сервер (Live Server в VS Code, или
// python -m http.server / npx serve).
// При запуске через file:// будет показана подсказка.
// ============================================================
const DataLoader = {
_loaded: false,
async load() {
if (this._loaded) return;
const FILES = [
'enemies', 'quests', 'recipes', 'shop', 'loot',
'lore', 'sets', 'enchants', 'classes', 'world',
];
let results;
try {
results = await Promise.all(
FILES.map(f =>
fetch('data/' + f + '.json')
.then(r => {
if (!r.ok) throw new Error('HTTP ' + r.status + ' for ' + f + '.json');
return r.json();
})
)
);
} catch (e) {
console.error('DataLoader.load() failed:', e);
this._showError(e);
throw e;
}
const [enemies, quests, recipes, shop, loot,
lore, sets, enchants, classes, world] = results;
// ── Заполнение RPG ──────────────────────────────────
RPG.ENEMY_DB = enemies;
RPG.QUEST_DB = quests;
RPG.CRAFT_RECIPES = recipes;
RPG.SHOP_ITEMS = shop;
RPG.LOOT_DB = loot;
RPG.LORE_NOTES = lore;
RPG.EQUIPMENT_SETS = sets;
RPG.ENCHANTS = enchants;
RPG.CLASSES = classes.classes;
RPG.SPELLS = classes.spells;
RPG.SKILLS = classes.skills;
RPG.PERK_TREE = classes.perkTree;
// ── Заполнение Game ─────────────────────────────────
Game.LOCATIONS = world.locations;
Game.NPC_DIALOGS = world.dialogs;
Game._WORLD = world; // spawns, npcs, decos, weather
this._loaded = true;
console.log('[DataLoader] Все данные загружены ✓');
},
_showError(e) {
// Удалим старые баннеры если есть
const old = document.getElementById('dl-error');
if (old) old.remove();
const isFileProtocol = location.protocol === 'file:';
const msg = isFileProtocol
? '⚠️ Игра требует локальный сервер для загрузки JSON-данных.
' +
'Откройте через Live Server (VS Code) или запустите:
' +
'python -m http.server и перейдите на http://localhost:8000'
: '⚠️ Ошибка загрузки данных: ' + e.message + '
Откройте консоль (F12) для подробностей.';
const banner = document.createElement('div');
banner.id = 'dl-error';
banner.style.cssText = [
'position:fixed', 'top:0', 'left:0', 'right:0',
'background:#8b0000', 'color:#fff', 'padding:14px 20px',
'font-size:13px', 'text-align:center', 'z-index:99999',
'line-height:1.7', 'font-family:monospace',
].join(';');
banner.innerHTML = msg;
document.body.prepend(banner);
},
};