hzengine-core
Version:
An Visual Novel Engine for Zepp OS
261 lines (260 loc) • 10.5 kB
JavaScript
import { Async } from "../async/index.js";
/**
* 存档属性装饰器
* @param store_key 保存数据到存档数据对象的key
* @returns
*/
export function Save(store_key) {
return function (target, context) {
context.addInitializer(function () {
Async.nextTick(() => {
const core = this._core;
core.on("initArchiveData", () => {
core.storage.setSaveableData(core.storage.archiveData, true, target.get.call(this), ...store_key.split("."));
});
core.on("beforeSaveArchive", () => {
core.storage.setSaveableData(core.storage.archiveData, false, target.get.call(this), ...store_key.split("."));
});
core.on("afterLoadArchive", () => {
let dataInArchive = core.storage.getSaveableData(core.storage.archiveData, false, ...store_key.split("."));
this._core.debug.log(`Load Data from Archive, store_key: ${store_key}, dataInArchive: ${JSON.stringify(dataInArchive)}`);
target.set.call(this, dataInArchive);
});
});
});
if (context.kind !== "accessor") {
throw new Error("ArchiveStateAccessor只能用于accessor属性");
}
return {
get() {
target = target;
return archiveStateGetter(this, store_key, target.get);
},
set(value) {
target = target;
archiveStateSetter(this, store_key, target.set, value);
},
};
};
}
/**
* 存档属性装饰器
* @param store_key 保存数据到存档数据对象的key
* @returns
*/
export function CustomSave(store_key, serializer, deserializer) {
return (target, context) => {
if (context.kind !== "accessor") {
throw new Error("ArchiveStateAccessor只能用于accessor属性");
}
context.addInitializer(function () {
Async.nextTick(() => {
const core = this._core;
core.on("initArchiveData", () => {
core.storage.setSaveableData(core.storage.archiveData, true, serializer.call(this, target.get.call(this)), ...store_key.split("."));
});
core.on("beforeSaveArchive", () => {
core.storage.setSaveableData(core.storage.archiveData, false, serializer.call(this, target.get.call(this)), ...store_key.split("."));
});
core.on("afterLoadArchive", () => {
let dataInArchive = core.storage.getSaveableData(core.storage.archiveData, false, ...store_key.split("."));
this._core.debug.log(`Load Data from Archive, store_key: ${store_key}, dataInArchive: ${JSON.stringify(dataInArchive)}`);
target.set.call(this, deserializer.call(this, dataInArchive));
});
});
});
return {
get() {
target = target;
return archiveStateGetterWithSerializer(this, store_key, target.get, serializer);
},
set(value) {
target = target;
archiveStateSetterWithDeserializer(this, store_key, target.set, value, deserializer);
},
};
};
}
export function SaveGetter(store_key) {
return (target, context) => {
context.addInitializer(function () {
Async.nextTick(() => {
const core = this._core;
core.on("initArchiveData", () => {
core.storage.setSaveableData(core.storage.archiveData, true, target.call(this), ...store_key.split("."));
});
core.on("beforeSaveArchive", () => {
core.storage.setSaveableData(core.storage.archiveData, false, target.call(this), ...store_key.split("."));
});
});
});
if (context.kind !== "getter") {
throw new Error("ArchiveStateGetter只能用于getter属性");
}
return function () {
let val = archiveStateGetter(this, store_key, target);
return val;
};
};
}
export function CustomSaveGetter(store_key, serializer) {
return (target, context) => {
if (context.kind !== "getter") {
throw new Error("ArchiveStateGetter只能用于getter属性");
}
context.addInitializer(function () {
Async.nextTick(() => {
const core = this._core;
core.on("initArchiveData", () => {
core.storage.setSaveableData(core.storage.archiveData, true, serializer.call(this, target.call(this)), ...store_key.split("."));
});
core.on("beforeSaveArchive", () => {
core.storage.setSaveableData(core.storage.archiveData, false, serializer.call(this, target.call(this)), ...store_key.split("."));
});
});
});
return function () {
let val = archiveStateGetterWithSerializer(this, store_key, target, serializer);
return val;
};
};
}
/**
* 存档属性装饰器
* @param store_key 保存数据到存档数据对象的key
* @returns
*/
export function SaveSetter(store_key) {
return (target, context) => {
if (context.kind !== "setter") {
throw new Error("ArchiveStateSetter只能用于setter属性");
}
context.addInitializer(function () {
Async.nextTick(() => {
let core = this._core;
core.on("afterLoadArchive", () => {
let dataInArchive = core.storage.getSaveableData(core.storage.archiveData, false, ...store_key.split("."));
this._core.debug.log(`Load Data from Archive, store_key: ${store_key}, dataInArchive: ${JSON.stringify(dataInArchive)}`);
target.call(this, dataInArchive);
});
});
});
return function (value) {
archiveStateSetter(this, store_key, target, value);
};
};
}
export function CustomSaveSetter(store_key, deserializer) {
return (target, context) => {
if (context.kind !== "setter") {
throw new Error("ArchiveStateSetter只能用于setter属性");
}
context.addInitializer(function () {
Async.nextTick(() => {
let core = this._core;
core.on("afterLoadArchive", () => {
let dataInArchive = core.storage.getSaveableData(core.storage.archiveData, false, ...store_key.split("."));
this._core.debug.log(`Load Data from Archive, store_key: ${store_key}, dataInArchive: ${JSON.stringify(dataInArchive)}`);
target.call(this, deserializer.call(this, dataInArchive));
});
});
});
return function (value) {
archiveStateSetterWithDeserializer(this, store_key, target, value, deserializer);
};
};
}
/**
* 存档属性装饰器
* @param store_key 保存数据到存档数据对象的key
* @returns
*/
function archiveStateGetter(_this, store_key, old_getter) {
const core = _this._core;
// if (!core.storage._archiveStateGetterRegisteredList.has(store_key)) {
// core.storage._archiveStateGetterRegisteredList.add(store_key);
// core.on("initArchiveData", () => {
// core.storage.setSaveableData(
// core.storage.archiveData,
// true,
// old_getter.call(_this),
// ...store_key.split(".")
// );
// });
// core.on("beforeSaveArchive", () => {
// core.storage.setSaveableData(
// core.storage.archiveData,
// false,
// old_getter.call(_this),
// ...store_key.split(".")
// );
// });
// }
let val = old_getter.call(_this);
// console.log(`getval: ${val}`);
return val;
}
/**
* 存档属性装饰器
* @param store_key 保存数据到存档数据对象的key
* @returns
*/
function archiveStateGetterWithSerializer(_this, store_key, old_getter, serializer) {
const core = _this._core;
// if (!core.storage._archiveStateGetterRegisteredList.has(store_key)) {
// core.storage._archiveStateGetterRegisteredList.add(store_key);
// core.on("initArchiveData", () => {
// core.storage.setSaveableData(
// core.storage.archiveData,
// true,
// serializer.call(_this, old_getter.call(_this)),
// ...store_key.split(".")
// );
// });
// core.on("beforeSaveArchive", () => {
// core.storage.setSaveableData(
// core.storage.archiveData,
// false,
// serializer.call(_this, old_getter.call(_this)),
// ...store_key.split(".")
// );
// });
// }
let val = old_getter.call(_this);
// console.log(`getval: ${val}`);
return val;
}
function archiveStateSetter(_this, store_key, old_setter, val) {
// const core = _this._core;
// if (!core.storage._archiveStateSetterRegisteredList.has(store_key)) {
// core.storage._archiveStateSetterRegisteredList.add(store_key);
// core.on("afterLoadArchive", () => {
// let dataInArchive = core.storage.getSaveableData(
// core.storage.archiveData,
// false,
// ...store_key.split(".")
// ) as Value;
// console.log(`Load Data from Archive, store_key: ${store_key}`);
// old_setter.call(_this, dataInArchive);
// });
// }
old_setter.call(_this, val);
// console.log(`setval: ${val}`);
}
function archiveStateSetterWithDeserializer(_this, store_key, old_setter, val, deserializer) {
// const core = _this._core;
// if (!core.storage._archiveStateSetterRegisteredList.has(store_key)) {
// core.storage._archiveStateSetterRegisteredList.add(store_key);
// core.on("afterLoadArchive", () => {
// let dataInArchive = core.storage.getSaveableData(
// core.storage.archiveData,
// false,
// ...store_key.split(".")
// ) as SerializedValue;
// console.log(`Load Data from Archive, store_key: ${store_key}`);
// old_setter.call(_this, deserializer.call(_this, dataInArchive));
// });
// }
old_setter.call(_this, val);
// console.log(`setval: ${val}`);
}