update: bili-toy

This commit is contained in:
Vick Scarlet
2026-08-16 18:26:59 +08:00
parent 30b4791813
commit 6c803d4eef
17 changed files with 1212 additions and 201 deletions
+168
View File
@@ -0,0 +1,168 @@
(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);
}
});
});
})();