Files
lifeRestart/thirdparty/bili-toy/lib/example.js
T
2026-08-16 18:26:59 +08:00

169 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(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);
}
});
});
})();