// ============================================================ // SAVES.JS — JSON-сохранения в отдельной папке (File System API) // ============================================================ // Приоритет: если выбрана папка — пишем JSON-файлы. // Всегда также пишем в localStorage как кэш/резерв. // ============================================================ const SaveFS = { _dir: null, // FileSystemDirectoryHandle isSupported() { return 'showDirectoryPicker' in window; }, hasDir() { return !!this._dir; }, getDirName() { return this._dir ? this._dir.name : null; }, // Открыть диалог выбора папки, затем синхронизировать JSON → localStorage async selectDir() { try { this._dir = await window.showDirectoryPicker({ id: 'eidon-saves', mode: 'readwrite' }); await this._syncFromDir(); return true; } catch (e) { if (e.name !== 'AbortError') console.warn('SaveFS.selectDir:', e); return false; } }, // Записать слот в JSON-файл async writeSlot(slot, data) { if (!this._dir) return false; try { const fh = await this._dir.getFileHandle('save_' + slot + '.json', { create: true }); const w = await fh.createWritable(); await w.write(JSON.stringify(data, null, 2)); await w.close(); return true; } catch (e) { console.warn('SaveFS.writeSlot:', e); return false; } }, // Прочитать слот из JSON-файла async readSlot(slot) { if (!this._dir) return null; try { const fh = await this._dir.getFileHandle('save_' + slot + '.json'); const file = await fh.getFile(); return JSON.parse(await file.text()); } catch (e) { return null; } }, // Удалить JSON-файл слота async deleteSlot(slot) { if (!this._dir) return false; try { await this._dir.removeEntry('save_' + slot + '.json'); return true; } catch (e) { return false; } }, // Прочитать все 3 JSON-файла из папки → обновить localStorage // Если файла нет — слот в localStorage тоже очищается (папка — источник истины) async _syncFromDir() { for (let sl = 0; sl < 3; sl++) { const data = await this.readSlot(sl); if (data) { localStorage.setItem(RPG.SAVE_PREFIX + sl, JSON.stringify(data)); } else { localStorage.removeItem(RPG.SAVE_PREFIX + sl); } } }, // Экспортировать все сохранения из localStorage → JSON-файлы async exportAll() { for (let sl = 0; sl < 3; sl++) { const raw = localStorage.getItem(RPG.SAVE_PREFIX + sl); if (raw) { try { await this.writeSlot(sl, JSON.parse(raw)); } catch (e) { /* skip */ } } } }, };