feat: save games and edit scene darkness
Persist show state to local saves; author map darkness in scene editor with bake-to-scene and help updates. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -29,14 +29,26 @@ export class SceneDarknessStore {
|
||||
|
||||
/**
|
||||
* Переключение сцены: сохраняем текущие штрихи в кэш и загружаем состояние новой сцены.
|
||||
* Если ключа ещё не было в сессии — берём seed (база из файла партии).
|
||||
*/
|
||||
switchScene(cacheKey: string | null, enabled: boolean): SceneDarknessState {
|
||||
switchScene(
|
||||
cacheKey: string | null,
|
||||
enabled: boolean,
|
||||
seedStrokes: readonly SceneDarknessRevealStroke[] = [],
|
||||
): SceneDarknessState {
|
||||
if (this.currentKey !== null) {
|
||||
this.cache.set(this.currentKey, [...this.state.strokes]);
|
||||
this.cache.set(this.currentKey, this.state.strokes.map(cloneStroke));
|
||||
}
|
||||
this.currentKey = cacheKey;
|
||||
const strokes =
|
||||
cacheKey && enabled ? [...(this.cache.get(cacheKey) ?? [])] : [];
|
||||
let strokes: SceneDarknessRevealStroke[] = [];
|
||||
if (cacheKey && enabled) {
|
||||
if (this.cache.has(cacheKey)) {
|
||||
strokes = (this.cache.get(cacheKey) ?? []).map(cloneStroke);
|
||||
} else {
|
||||
strokes = seedStrokes.map(cloneStroke);
|
||||
this.cache.set(cacheKey, strokes.map(cloneStroke));
|
||||
}
|
||||
}
|
||||
this.state = {
|
||||
revision: this.state.revision + 1,
|
||||
enabled,
|
||||
@@ -77,4 +89,32 @@ export class SceneDarknessStore {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Кэш по карточкам, включая текущую. Пустые карточки не входят. */
|
||||
exportByCard(): Record<string, SceneDarknessRevealStroke[]> {
|
||||
if (this.currentKey !== null) {
|
||||
this.cache.set(this.currentKey, this.state.strokes.map(cloneStroke));
|
||||
}
|
||||
const out: Record<string, SceneDarknessRevealStroke[]> = {};
|
||||
for (const [key, strokes] of this.cache) {
|
||||
if (strokes.length === 0) continue;
|
||||
out[key] = strokes.map(cloneStroke);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/** Кладёт кэш, не переключая карточку. Дальше вызывают switchScene. */
|
||||
importByCard(byCard: Record<string, SceneDarknessRevealStroke[]>): void {
|
||||
this.cache.clear();
|
||||
this.currentKey = null;
|
||||
this.state = emptyState();
|
||||
for (const [key, strokes] of Object.entries(byCard)) {
|
||||
if (!Array.isArray(strokes) || strokes.length === 0) continue;
|
||||
this.cache.set(key, strokes.map(cloneStroke));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function cloneStroke(stroke: SceneDarknessRevealStroke): SceneDarknessRevealStroke {
|
||||
return { ...stroke, points: stroke.points.map((p) => ({ ...p })) };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user