import {
Extension, extension, defineSave, method, settings,
type SettingsBuilder, type SaveAPI,
} from "@avg-studio/sdk";
type GallerySaveMap = {
unlockedShared: readonly GalleryEntry[];
unlockedSlot: readonly GalleryEntry[];
};
@extension({ id: "gallery-screen", label: "鉴赏画面" })
export class GalleryScreen extends Extension {
// 两种存档作用域:shared 跨存档全局解锁,slot 跟随当前存档
static saveSchema = defineSave({
unlockedShared: { type: "list", persistence: "shared", default: [] as GalleryEntry[] },
unlockedSlot: { type: "list", persistence: "slot", default: [] as GalleryEntry[] },
});
// 设置:新解锁条目写入哪个桶
static settings = settings((s: SettingsBuilder) => ({
unlockScope: s
.enum("解锁记录范围", ["shared", "slot"] as const)
.labels({ shared: "全局共享", slot: "跟随存档" })
.default("shared"),
}));
// 剧本方法:加入鉴赏
static addToGallery = method({
title: "加入鉴赏",
schema: { scene: { type: "scene", label: "场景", required: true } },
run(ctx, params) {
const save = this.save as unknown as SaveAPI<GallerySaveMap>;
const scope = ctx.settings.get<"shared" | "slot">("unlockScope") ?? "shared";
const entry: GalleryEntry = buildEntry(params);
if (scope === "slot") {
save.set("unlockedSlot", [...save.get("unlockedSlot"), entry]);
} else {
save.set("unlockedShared", [...save.get("unlockedShared"), entry]);
}
},
});
// 剧本方法:移除/清空 ……(同款写法,略)
// 界面
render() {
return { component: GalleryScreenComponent, props: {} };
}
}