"use strict"; (function (global) { const Snapshot = global.TarinaiSnapshot; const Codec = global.TarinaiSaveCodec; const Storage = global.TarinaiSaveStorage; const Restore = global.TarinaiRestoreCoordinator; if (!Snapshot || !Codec || !Storage || !Restore) throw new Error("save_system.js dependencies are not available"); const SLOT_COUNT = Storage.SLOT_COUNT; const htmlEscape = global.TarinaiUIHelpers.htmlEscape; function createSnapshot(worldRef = global.world) { return Snapshot.createSnapshot(worldRef); } function restoreSnapshot(snapshot, worldRef = global.world, options = {}) { return Restore.restoreSnapshot(snapshot, worldRef, { source: options.source || "save", syncUi: options.syncUi }); } async function encodeSnapshot(snapshot = createSnapshot(global.world)) { return Codec.encodeSnapshot(snapshot); } async function decodeSnapshot(text) { return Codec.decodeSnapshot(text); } async function saveSlot(slot) { const snapshot = createSnapshot(global.world); return Storage.writeSlot(slot, snapshot); } async function loadSlot(slot) { const snapshot = Storage.requireSlot(slot); return restoreSnapshot(snapshot, global.world, { source: "slot" }); } function deleteSlot(slot) { Storage.deleteSlot(slot); } function readSlot(slot) { return Storage.readSlot(slot); } function formatSlotSummary(snapshot) { if (!snapshot) return "\u7a7a\u304d"; const m = snapshot.m || []; const date = snapshot.c ? new Date(snapshot.c).toLocaleString("ja-JP", { month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit" }) : "\u65e5\u6642\u4e0d\u660e"; const day = m[0] || 1; const population = m[1] || 0; const fieldType = m[2] || "\u5ead"; const timeText = Number.isFinite(m[3]) ? `${Math.floor((m[3] / 10) % 24).toString().padStart(2, "0")}:00` : ""; return `${date} / ${fieldType} / ${day}\u65e5\u76ee ${timeText} / ${population}\u5339`; } function ensureDialog() { let dialog = document.getElementById("saveDialog"); if (dialog) return dialog; dialog = document.createElement("div"); dialog.id = "saveDialog"; dialog.className = "field-dialog hidden"; dialog.setAttribute("role", "dialog"); dialog.setAttribute("aria-modal", "true"); dialog.innerHTML = `

\u30bb\u30fc\u30d6 / \u30ed\u30fc\u30c9

\u30bb\u30fc\u30d6\u6a5f\u80fd\u306f\u5b9f\u9a13\u4e2d\u3067\u3042\u308a\u3001\u4fdd\u8a3c\u5bfe\u8c61\u5916\u3067\u3059\u3002

9\u3064\u306e\u30b9\u30ed\u30c3\u30c8\u306b\u73fe\u5728\u306e\u30b3\u30ed\u30cb\u30fc\u3092\u4fdd\u5b58\u3067\u304d\u307e\u3059\u3002\u30cf\u30c3\u30b7\u30e5\u30c6\u30ad\u30b9\u30c8\u306f\u5225\u7aef\u672b\u3084\u5225\u30d6\u30e9\u30a6\u30b6\u3078\u306e\u79fb\u52d5\u306b\u4f7f\u3048\u307e\u3059\u3002

`; document.body.appendChild(dialog); return dialog; } function renderSlotList() { const dialog = ensureDialog(); const list = dialog.querySelector("#saveSlotList"); if (!list) return; list.innerHTML = ""; for (let i = 1; i <= SLOT_COUNT; i++) { const snapshot = readSlot(i); const row = document.createElement("div"); row.className = "save-slot-row"; row.innerHTML = `
\u30b9\u30ed\u30c3\u30c8 ${i}
${htmlEscape(formatSlotSummary(snapshot))}
`; list.appendChild(row); } } function openDialog() { const dialog = ensureDialog(); renderSlotList(); dialog.classList.remove("hidden"); } function closeDialog() { document.getElementById("saveDialog")?.classList.add("hidden"); } function bindSaveSystem() { const btn = document.getElementById("saveBtn") || global.ui?.saveBtn; if (!btn || btn.dataset.saveBound === "1") return; btn.dataset.saveBound = "1"; btn.addEventListener("click", () => { global.audio?.uiClick?.(); openDialog(); }); const dialog = ensureDialog(); if (dialog.dataset.saveDialogBound === "1") return; dialog.dataset.saveDialogBound = "1"; dialog.addEventListener("click", async (e) => { if (e.target === dialog) { closeDialog(); return; } const saveBtn = e.target.closest("[data-save-slot]"); const loadBtn = e.target.closest("[data-load-slot]"); const deleteBtn = e.target.closest("[data-delete-slot]"); if (saveBtn) { const slot = Number(saveBtn.dataset.saveSlot); try { await saveSlot(slot); renderSlotList(); global.audio?.notify?.(); global.showToast?.(`\u30b9\u30ed\u30c3\u30c8${slot}\u306b\u4fdd\u5b58\u3057\u307e\u3057\u305f\u3002`); } catch (error) { console.warn(error); global.showToast?.("\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u7a7a\u304d\u5bb9\u91cf\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002"); } return; } if (loadBtn) { const slot = Number(loadBtn.dataset.loadSlot); if (!global.confirm?.(`\u30b9\u30ed\u30c3\u30c8${slot}\u3092\u8aad\u307f\u8fbc\u307f\u307e\u3059\u3002\u73fe\u5728\u306e\u72b6\u614b\u306f\u4e0a\u66f8\u304d\u3055\u308c\u307e\u3059\u3002`)) return; try { await loadSlot(slot); closeDialog(); global.audio?.notify?.(); global.showToast?.(`\u30b9\u30ed\u30c3\u30c8${slot}\u3092\u8aad\u307f\u8fbc\u307f\u307e\u3057\u305f\u3002`); } catch (error) { console.warn(error); global.showToast?.("\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002"); } return; } if (deleteBtn) { const slot = Number(deleteBtn.dataset.deleteSlot); if (!global.confirm?.(`\u30b9\u30ed\u30c3\u30c8${slot}\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f`)) return; deleteSlot(slot); renderSlotList(); global.audio?.delete?.(); global.showToast?.(`\u30b9\u30ed\u30c3\u30c8${slot}\u3092\u524a\u9664\u3057\u307e\u3057\u305f\u3002`); return; } if (e.target.closest("#saveCloseBtn")) closeDialog(); if (e.target.closest("#saveExportBtn")) { const area = dialog.querySelector("#saveHashText"); if (area) { area.value = await encodeSnapshot(createSnapshot(global.world)); area.focus(); area.select(); } global.showToast?.("\u73fe\u5728\u306e\u72b6\u614b\u3092\u30cf\u30c3\u30b7\u30e5\u30c6\u30ad\u30b9\u30c8\u306b\u66f8\u304d\u51fa\u3057\u307e\u3057\u305f\u3002"); } if (e.target.closest("#saveImportBtn")) { const area = dialog.querySelector("#saveHashText"); const text = area?.value || ""; if (!text.trim()) { global.showToast?.("\u8aad\u307f\u8fbc\u3080\u30cf\u30c3\u30b7\u30e5\u30c6\u30ad\u30b9\u30c8\u3092\u8cbc\u308a\u4ed8\u3051\u3066\u304f\u3060\u3055\u3044\u3002"); return; } if (!global.confirm?.("\u30cf\u30c3\u30b7\u30e5\u30c6\u30ad\u30b9\u30c8\u3092\u8aad\u307f\u8fbc\u307f\u307e\u3059\u3002\u73fe\u5728\u306e\u72b6\u614b\u306f\u4e0a\u66f8\u304d\u3055\u308c\u307e\u3059\u3002")) return; try { restoreSnapshot(await decodeSnapshot(text), global.world, { source: "import" }); closeDialog(); global.showToast?.("\u30cf\u30c3\u30b7\u30e5\u30c6\u30ad\u30b9\u30c8\u304b\u3089\u8aad\u307f\u8fbc\u307f\u307e\u3057\u305f\u3002"); } catch (error) { console.warn(error); global.showToast?.("\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u30c6\u30ad\u30b9\u30c8\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002"); } } }); } global.TarinaiSaveSystem = { createSnapshot, restoreSnapshot, encodeSnapshot, decodeSnapshot, saveSlot, loadSlot, deleteSlot, readSlot, bindSaveSystem, openDialog, }; })(typeof window !== "undefined" ? window : globalThis);