mirror of
https://github.com/VickScarlet/lifeRestart.git
synced 2026-08-19 18:43:53 +08:00
169 lines
5.1 KiB
JavaScript
169 lines
5.1 KiB
JavaScript
(function () {
|
||
'use strict';
|
||
|
||
var PREFIX = 'your_game_save_v1';
|
||
var LOCAL_KEY = PREFIX + '_local';
|
||
|
||
function ToyStorageAdapter(toySdk) {
|
||
if (
|
||
!toySdk ||
|
||
typeof toySdk.getCloudStorage !== 'function' ||
|
||
typeof toySdk.setCloudStorage !== 'function'
|
||
) {
|
||
throw new Error('Toy 云存储 SDK 不可用');
|
||
}
|
||
this.toy = toySdk;
|
||
}
|
||
|
||
ToyStorageAdapter.prototype.get = async function (keys) {
|
||
var result = await this.toy.getCloudStorage(keys);
|
||
if (result && result.data && typeof result.data === 'object') {
|
||
return result.data;
|
||
}
|
||
return result || {};
|
||
};
|
||
|
||
ToyStorageAdapter.prototype.set = async function (record) {
|
||
await this.toy.setCloudStorage(record);
|
||
};
|
||
|
||
function createExampleState() {
|
||
return {
|
||
schemaVersion: 1,
|
||
updatedAt: Date.now(),
|
||
progress: { stage: 1, score: 120 },
|
||
settings: { music: true, language: 'zh-CN' },
|
||
};
|
||
}
|
||
|
||
function summarizeError(error) {
|
||
var message = error && error.message ? error.message : String(error || '未知错误');
|
||
return message.slice(0, 160);
|
||
}
|
||
|
||
document.addEventListener('DOMContentLoaded', function () {
|
||
var editor = document.getElementById('save-json');
|
||
var status = document.getElementById('status');
|
||
var saveButton = document.getElementById('save');
|
||
var loadButton = document.getElementById('load');
|
||
var exampleButton = document.getElementById('make-example');
|
||
var cloudSave = null;
|
||
|
||
function setStatus(message) {
|
||
status.textContent = message;
|
||
}
|
||
|
||
function applyLoadedState(json) {
|
||
// 替换点:把 JSON 交给项目原有的存档应用逻辑。
|
||
JSON.parse(json);
|
||
editor.value = json;
|
||
}
|
||
|
||
function loadLocalFirst() {
|
||
var localJson = localStorage.getItem(LOCAL_KEY);
|
||
if (!localJson) {
|
||
editor.value = JSON.stringify(createExampleState(), null, 2);
|
||
return false;
|
||
}
|
||
try {
|
||
applyLoadedState(localJson);
|
||
return true;
|
||
} catch (error) {
|
||
localStorage.removeItem(LOCAL_KEY);
|
||
editor.value = JSON.stringify(createExampleState(), null, 2);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
function parseEditor() {
|
||
var value = editor.value.trim();
|
||
JSON.parse(value);
|
||
return value;
|
||
}
|
||
|
||
function setBusy(isBusy) {
|
||
saveButton.disabled = isBusy;
|
||
loadButton.disabled = isBusy;
|
||
}
|
||
|
||
var hadLocalSave = loadLocalFirst();
|
||
|
||
try {
|
||
if (!window.ToyCloudSaveCore) {
|
||
throw new Error('cloud-save-core.js 未加载');
|
||
}
|
||
var storage = new ToyStorageAdapter(window.toy || window.Toy);
|
||
cloudSave = window.ToyCloudSaveCore.createCloudSave({
|
||
storage: storage,
|
||
prefix: 'your_game_save_v1',
|
||
onEvent: function (event) {
|
||
// 只记录阶段摘要,禁止在这里打印完整 JSON。
|
||
if (event && event.phase) {
|
||
status.dataset.phase = event.phase;
|
||
}
|
||
},
|
||
});
|
||
setStatus(hadLocalSave ? '已加载本地档;可读取云端进行校验。' : '云存档已就绪。');
|
||
} catch (error) {
|
||
setStatus('当前仅使用本地存档:' + summarizeError(error));
|
||
}
|
||
|
||
exampleButton.addEventListener('click', function () {
|
||
editor.value = JSON.stringify(createExampleState(), null, 2);
|
||
setStatus('已生成小型示例,尚未保存。');
|
||
});
|
||
|
||
saveButton.addEventListener('click', async function () {
|
||
var json;
|
||
try {
|
||
json = parseEditor();
|
||
} catch (error) {
|
||
setStatus('JSON 无效,请修正后再保存:' + summarizeError(error));
|
||
return;
|
||
}
|
||
|
||
localStorage.setItem(LOCAL_KEY, json);
|
||
if (!cloudSave) {
|
||
setStatus('本地保存成功;当前环境无法写入 Toy 云端。');
|
||
return;
|
||
}
|
||
|
||
setBusy(true);
|
||
setStatus('本地保存成功,正在提交云端…');
|
||
try {
|
||
var result = await cloudSave.save(json);
|
||
setStatus('云保存成功:Bank ' + result.bank.toUpperCase() + ',' + result.chunks + ' 片。');
|
||
} catch (error) {
|
||
setStatus('本地已保存,但云保存失败:' + summarizeError(error));
|
||
} finally {
|
||
setBusy(false);
|
||
}
|
||
});
|
||
|
||
loadButton.addEventListener('click', async function () {
|
||
var localFound = loadLocalFirst();
|
||
if (!cloudSave) {
|
||
setStatus(localFound ? '已读取本地档;当前环境无法读取 Toy 云端。' : '本地和云端均无可用存档。');
|
||
return;
|
||
}
|
||
|
||
setBusy(true);
|
||
setStatus(localFound ? '已应用本地档,正在校验云端…' : '正在读取云端…');
|
||
try {
|
||
var cloudJson = await cloudSave.load();
|
||
if (cloudJson === null) {
|
||
setStatus(localFound ? '云端为空,继续使用本地档。' : '云端和本地均为空。');
|
||
} else {
|
||
applyLoadedState(cloudJson);
|
||
localStorage.setItem(LOCAL_KEY, cloudJson);
|
||
setStatus('云档校验通过并已同步到本地。');
|
||
}
|
||
} catch (error) {
|
||
setStatus((localFound ? '继续使用本地档;' : '') + '云读取失败:' + summarizeError(error));
|
||
} finally {
|
||
setBusy(false);
|
||
}
|
||
});
|
||
});
|
||
})();
|