@maka/maka-cli 5.9.0 → 5.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/bundle/typescript/package.json +1 -1
  2. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +5 -0
  3. package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js.map +1 -1
  4. package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +23 -1
  5. package/bundle/typescript/src/commands/game/sideQuest/game.js +160 -3
  6. package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
  7. package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +2 -0
  8. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +8 -0
  9. package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
  10. package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +2 -0
  11. package/bundle/typescript/src/commands/game/sideQuest/models/player.js +8 -0
  12. package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
  13. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +10 -0
  14. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +10 -0
  15. package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +1 -1
  16. package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +17 -0
  17. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +32 -0
  18. package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
  19. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +208 -0
  20. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.js +14 -0
  21. package/bundle/typescript/src/commands/game/sideQuest/types/save-file.js.map +1 -0
  22. package/bundle/typescript/src/commands/game/sideQuest/ui.d.ts +6 -0
  23. package/bundle/typescript/src/commands/game/sideQuest/ui.js +48 -4
  24. package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
  25. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.d.ts +50 -0
  26. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js +232 -0
  27. package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js.map +1 -0
  28. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.d.ts +71 -0
  29. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +447 -0
  30. package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -0
  31. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +174 -18
  32. package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
  33. package/package.json +1 -1
@@ -0,0 +1,71 @@
1
+ import { Item } from '../models/item.js';
2
+ import { Inventory } from '../models/inventory.js';
3
+ import { Player } from '../models/player.js';
4
+ import { Scene } from '../models/scene.js';
5
+ import { Room } from '../models/room.js';
6
+ import { ISceneSeedJson } from '../types/seed/scene-seed.js';
7
+ import { ISaveFileV1, ISavedItem, ISavedEquipment, ISavedPlayer, ISavedHub } from '../types/save-file.js';
8
+ /**
9
+ * PERSISTENCE (see types/save-file.ts for the schema and the rulings).
10
+ * Pure synchronous serializers + IO: live objects flatten to seed-shaped
11
+ * JSON plus the runtime the seed can't express, and restore through the
12
+ * models' own public APIs -- no model grows a save/load method. Saves
13
+ * live in `<maka>/side-quest-saves/` beside the sessions dir; NEVER
14
+ * under ~/.maka (CFG rimrafs that whole directory on every read).
15
+ */
16
+ export declare function saveSlug(playerName: string): string;
17
+ /** `<makaDir>/side-quest-saves` -- sibling of side-quest-sessions. */
18
+ export declare function savesDir(makaDir: string): string;
19
+ export declare function savePathFor(dir: string, playerName: string): string;
20
+ /** The permadeath tombstone: written when a runner dies but the cloud
21
+ * copy couldn't be deleted (offline) -- the launcher honors it later
22
+ * instead of resurrecting the dead from the cloud. */
23
+ export declare function tombstonePathFor(dir: string, playerName: string): string;
24
+ /**
25
+ * Atomic-enough for one slot: write a .tmp beside the target, then
26
+ * rename over it. A crash mid-write leaves a stale .tmp, never a
27
+ * corrupt save.
28
+ */
29
+ export declare function writeSaveAtomic(filePath: string, save: ISaveFileV1): void;
30
+ export declare function deleteSave(filePath: string): void;
31
+ export type SaveReadResult = {
32
+ ok: true;
33
+ save: ISaveFileV1;
34
+ } | {
35
+ ok: false;
36
+ error: 'missing' | 'unreadable' | 'version-mismatch';
37
+ version?: number;
38
+ };
39
+ /** NEVER deletes on failure -- an old save outlives the build that
40
+ * can't read it. */
41
+ export declare function readSave(filePath: string): SaveReadResult;
42
+ export declare function listSaves(dir: string): {
43
+ filePath: string;
44
+ result: SaveReadResult;
45
+ }[];
46
+ export declare function serializeItem(item: Item): ISavedItem;
47
+ /** Mirrors ItemFactory.createItemFromJson (synchronously), then lays
48
+ * the runtime block on top -- AFTER construction, because the Item
49
+ * ctor auto-fills a firearm's magazine to 10. */
50
+ export declare function restoreItem(json: ISavedItem): Item;
51
+ type EquipmentShape = Player['equipment'];
52
+ export declare function serializeEquipment(eq: EquipmentShape): ISavedEquipment;
53
+ /** Clears EVERY slot first (an NPC auto-equips at synthesis; the save
54
+ * is authoritative), then lays in the saved blobs. */
55
+ export declare function restoreEquipment(eq: EquipmentShape, saved: ISavedEquipment): void;
56
+ export declare function replaceInventory(inv: Inventory, items: ISavedItem[]): void;
57
+ export declare function serializePlayer(p: Player): ISavedPlayer;
58
+ /**
59
+ * Restores onto a FRESH Player (constructed from the save's attribute
60
+ * block, no archetype outfitting). ORDER MATTERS:
61
+ * 1. qualities (their side effects lose to step 3's assignment)
62
+ * 2. base talent + aug replay (rebuilds essence and effective magic)
63
+ * 3. attributes + skills, authoritative -- exactly as saved
64
+ * 4. karma / notoriety replay / metamagics / initiation
65
+ * 5. damage, fatigue, needs, edge, stance (onto clean tracks)
66
+ * 6. inventory + equipment
67
+ */
68
+ export declare function restorePlayer(p: Player, s: ISavedPlayer): void;
69
+ export declare function captureHubOverlay(scene: Scene, hubSeed: ISceneSeedJson, player: Player, homeRoom: Room): ISavedHub;
70
+ export declare function applyHubOverlay(scene: Scene, saved: ISavedHub, player: Player, homeRoom: Room): void;
71
+ export {};
@@ -0,0 +1,447 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { Item } from '../models/item.js';
4
+ import { NPC } from '../models/npc.js';
5
+ import { Door } from '../models/door.js';
6
+ import { Size, Category, Rating } from '../types/shared/item-enum.js';
7
+ import { getAug } from '../augmentations.js';
8
+ import { Logger } from './logger.js';
9
+ import { SAVE_VERSION, } from '../types/save-file.js';
10
+ /**
11
+ * PERSISTENCE (see types/save-file.ts for the schema and the rulings).
12
+ * Pure synchronous serializers + IO: live objects flatten to seed-shaped
13
+ * JSON plus the runtime the seed can't express, and restore through the
14
+ * models' own public APIs -- no model grows a save/load method. Saves
15
+ * live in `<maka>/side-quest-saves/` beside the sessions dir; NEVER
16
+ * under ~/.maka (CFG rimrafs that whole directory on every read).
17
+ */
18
+ // ============================ Paths & IO ============================
19
+ export function saveSlug(playerName) {
20
+ return playerName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'runner';
21
+ }
22
+ /** `<makaDir>/side-quest-saves` -- sibling of side-quest-sessions. */
23
+ export function savesDir(makaDir) {
24
+ return path.join(makaDir, 'side-quest-saves');
25
+ }
26
+ export function savePathFor(dir, playerName) {
27
+ return path.join(dir, `${saveSlug(playerName)}.json`);
28
+ }
29
+ /** The permadeath tombstone: written when a runner dies but the cloud
30
+ * copy couldn't be deleted (offline) -- the launcher honors it later
31
+ * instead of resurrecting the dead from the cloud. */
32
+ export function tombstonePathFor(dir, playerName) {
33
+ return path.join(dir, `${saveSlug(playerName)}.dead`);
34
+ }
35
+ /**
36
+ * Atomic-enough for one slot: write a .tmp beside the target, then
37
+ * rename over it. A crash mid-write leaves a stale .tmp, never a
38
+ * corrupt save.
39
+ */
40
+ export function writeSaveAtomic(filePath, save) {
41
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
42
+ const tmp = `${filePath}.tmp`;
43
+ fs.writeFileSync(tmp, JSON.stringify(save), 'utf8');
44
+ fs.renameSync(tmp, filePath);
45
+ }
46
+ export function deleteSave(filePath) {
47
+ fs.rmSync(filePath, { force: true });
48
+ fs.rmSync(`${filePath}.tmp`, { force: true });
49
+ }
50
+ /** NEVER deletes on failure -- an old save outlives the build that
51
+ * can't read it. */
52
+ export function readSave(filePath) {
53
+ if (!fs.existsSync(filePath))
54
+ return { ok: false, error: 'missing' };
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(fs.readFileSync(filePath, 'utf8'));
58
+ }
59
+ catch {
60
+ return { ok: false, error: 'unreadable' };
61
+ }
62
+ if (!parsed || typeof parsed !== 'object' || typeof parsed.version !== 'number') {
63
+ return { ok: false, error: 'unreadable' };
64
+ }
65
+ if (parsed.version !== SAVE_VERSION) {
66
+ return { ok: false, error: 'version-mismatch', version: parsed.version };
67
+ }
68
+ return { ok: true, save: parsed };
69
+ }
70
+ export function listSaves(dir) {
71
+ if (!fs.existsSync(dir))
72
+ return [];
73
+ return fs.readdirSync(dir)
74
+ .filter(f => f.endsWith('.json'))
75
+ .map(f => {
76
+ const filePath = path.join(dir, f);
77
+ return { filePath, result: readSave(filePath) };
78
+ });
79
+ }
80
+ // ========================= Items & equipment =========================
81
+ /** Live items hold enum VALUES ('small'); seeds hold enum KEYS
82
+ * ('Small') that the factory maps back via `Size[json.size]`. */
83
+ function enumKey(enumObj, value) {
84
+ const hit = Object.entries(enumObj).find(([, v]) => v === value);
85
+ return hit ? hit[0] : value;
86
+ }
87
+ export function serializeItem(item) {
88
+ const out = {
89
+ name: item.name,
90
+ description: item.description,
91
+ content: item.content,
92
+ size: enumKey(Size, item.size),
93
+ category: enumKey(Category, item.category),
94
+ shape: item.shape,
95
+ color: item.color,
96
+ texture: item.texture,
97
+ rating: enumKey(Rating, item.rating),
98
+ weight: item.weight,
99
+ details: item.details,
100
+ currencyAmount: item.isCurrencyCarrier() && item.currencyAmount > 0 ? item.currencyAmount : undefined,
101
+ satisfiesLifestyle: item.satisfiesLifestyle,
102
+ owner: item.owner,
103
+ transferable: item.transferable,
104
+ plane: item.plane,
105
+ price: item.price,
106
+ atSpot: item.atSpot,
107
+ };
108
+ // The runtime block, sparse: only what diverges from a fresh item.
109
+ if (item.isFirearm() && item.ammo !== Item.MAGAZINE_CAPACITY)
110
+ out.ammo = item.ammo;
111
+ if (item.jammed)
112
+ out.jammed = true;
113
+ if (item.deckDamage > 0)
114
+ out.deckDamage = item.deckDamage;
115
+ if (item.droneDamage > 0)
116
+ out.droneDamage = item.droneDamage;
117
+ return out;
118
+ }
119
+ /** Mirrors ItemFactory.createItemFromJson (synchronously), then lays
120
+ * the runtime block on top -- AFTER construction, because the Item
121
+ * ctor auto-fills a firearm's magazine to 10. */
122
+ export function restoreItem(json) {
123
+ const item = new Item({
124
+ name: json.name,
125
+ description: json.description,
126
+ size: Size[json.size],
127
+ category: Category[json.category],
128
+ shape: json.shape,
129
+ color: json.color,
130
+ texture: json.texture,
131
+ rating: Rating[json.rating],
132
+ weight: json.weight,
133
+ details: json.details,
134
+ content: json.content,
135
+ satisfiesLifestyle: json.satisfiesLifestyle,
136
+ transferable: json.transferable,
137
+ plane: json.plane,
138
+ price: json.price,
139
+ atSpot: json.atSpot,
140
+ });
141
+ if (json.currencyAmount && item.isCurrencyCarrier()) {
142
+ item.addCurrency(json.currencyAmount);
143
+ }
144
+ if (json.owner !== undefined)
145
+ item.owner = json.owner;
146
+ if (json.ammo !== undefined)
147
+ item.ammo = json.ammo;
148
+ if (json.jammed)
149
+ item.jammed = true;
150
+ if (json.deckDamage)
151
+ item.takeDeckDamage(json.deckDamage);
152
+ if (json.droneDamage)
153
+ item.takeDroneDamage(json.droneDamage);
154
+ return item;
155
+ }
156
+ export function serializeEquipment(eq) {
157
+ const out = {};
158
+ for (const [groupKey, group] of Object.entries(eq)) {
159
+ if (!group)
160
+ continue;
161
+ for (const [slotKey, item] of Object.entries(group)) {
162
+ if (item)
163
+ out[`${groupKey}.${slotKey}`] = serializeItem(item);
164
+ }
165
+ }
166
+ return out;
167
+ }
168
+ /** Clears EVERY slot first (an NPC auto-equips at synthesis; the save
169
+ * is authoritative), then lays in the saved blobs. */
170
+ export function restoreEquipment(eq, saved) {
171
+ for (const group of Object.values(eq)) {
172
+ if (!group)
173
+ continue;
174
+ for (const slotKey of Object.keys(group)) {
175
+ group[slotKey] = null;
176
+ }
177
+ }
178
+ for (const [pathKey, savedItem] of Object.entries(saved)) {
179
+ if (!savedItem)
180
+ continue;
181
+ const [groupKey, slotKey] = pathKey.split('.');
182
+ const group = eq[groupKey];
183
+ if (!group || !(slotKey in group)) {
184
+ Logger.getInstance().write(`restoreEquipment: unknown slot "${pathKey}" -- item "${savedItem.name}" dropped to nowhere, skipping.`);
185
+ continue;
186
+ }
187
+ group[slotKey] = restoreItem(savedItem);
188
+ }
189
+ }
190
+ export function replaceInventory(inv, items) {
191
+ for (const existing of [...inv.getAllItems()]) {
192
+ inv.removeItem(existing.name);
193
+ }
194
+ for (const json of items) {
195
+ inv.addItem(restoreItem(json));
196
+ }
197
+ }
198
+ // =============================== Player ===============================
199
+ export function serializePlayer(p) {
200
+ return {
201
+ name: p.name,
202
+ archetypeName: p.archetypeName,
203
+ attributes: {
204
+ body: p.body, agility: p.agility, reaction: p.reaction, combatSkill: p.combatSkill,
205
+ magic: p.magic, strength: p.strength, willpower: p.willpower, logic: p.logic,
206
+ intuition: p.intuition, charisma: p.charisma, edge: p.edge, resonance: p.resonance,
207
+ adept: p.adept,
208
+ },
209
+ baseMagic: p.baseMagic,
210
+ baseResonance: p.baseResonance,
211
+ skills: { ...p.skills },
212
+ karma: p.karma,
213
+ careerKarma: p.careerKarma,
214
+ notorietyReasons: [...p.notorietyReasons],
215
+ essence: p.essence,
216
+ augmentations: [...p.augmentations],
217
+ qualities: [...p.qualities],
218
+ metamagics: [...p.metamagics],
219
+ initiationGrade: p.initiationGrade,
220
+ edgeRemaining: p.edgeRemaining,
221
+ haggledThisJob: p.haggledThisJob,
222
+ damageTaken: p.damageTaken,
223
+ stunTaken: p.stunTaken,
224
+ needs: {
225
+ ateThisCycle: p.ateThisCycle, sleptThisCycle: p.sleptThisCycle,
226
+ hungerStreak: p.hungerStreak, sleepStreak: p.sleepStreak,
227
+ hungerFatigue: p.hungerFatigue, sleepFatigue: p.sleepFatigue,
228
+ },
229
+ autoStance: p.autoStance,
230
+ inventory: p.inventory.getAllItems().map(serializeItem),
231
+ equipment: serializeEquipment(p.equipment),
232
+ };
233
+ }
234
+ /**
235
+ * Restores onto a FRESH Player (constructed from the save's attribute
236
+ * block, no archetype outfitting). ORDER MATTERS:
237
+ * 1. qualities (their side effects lose to step 3's assignment)
238
+ * 2. base talent + aug replay (rebuilds essence and effective magic)
239
+ * 3. attributes + skills, authoritative -- exactly as saved
240
+ * 4. karma / notoriety replay / metamagics / initiation
241
+ * 5. damage, fatigue, needs, edge, stance (onto clean tracks)
242
+ * 6. inventory + equipment
243
+ */
244
+ export function restorePlayer(p, s) {
245
+ const logger = Logger.getInstance();
246
+ for (const q of s.qualities)
247
+ p.addQuality(q);
248
+ p.baseMagic = s.baseMagic;
249
+ p.baseResonance = s.baseResonance;
250
+ for (const key of s.augmentations) {
251
+ const aug = getAug(key);
252
+ if (aug)
253
+ p.installAug(aug);
254
+ else
255
+ logger.write(`restorePlayer: unknown augmentation "${key}" in save -- skipped.`);
256
+ }
257
+ p.body = s.attributes.body;
258
+ p.agility = s.attributes.agility;
259
+ p.reaction = s.attributes.reaction;
260
+ p.combatSkill = s.attributes.combatSkill;
261
+ p.magic = s.attributes.magic;
262
+ p.strength = s.attributes.strength;
263
+ p.willpower = s.attributes.willpower;
264
+ p.logic = s.attributes.logic;
265
+ p.intuition = s.attributes.intuition;
266
+ p.charisma = s.attributes.charisma;
267
+ p.edge = s.attributes.edge;
268
+ p.resonance = s.attributes.resonance;
269
+ p.adept = s.attributes.adept;
270
+ p.skills = { ...s.skills };
271
+ p.karma = s.karma;
272
+ p.careerKarma = s.careerKarma;
273
+ for (const reason of s.notorietyReasons)
274
+ p.addNotoriety(reason);
275
+ p.metamagics = new Set(s.metamagics);
276
+ p.initiationGrade = s.initiationGrade;
277
+ p.takeDamage(s.damageTaken);
278
+ p.takeStun(s.stunTaken);
279
+ p.addLockedFatigue('hunger', s.needs.hungerFatigue);
280
+ p.addLockedFatigue('sleep', s.needs.sleepFatigue);
281
+ p.ateThisCycle = s.needs.ateThisCycle;
282
+ p.sleptThisCycle = s.needs.sleptThisCycle;
283
+ p.hungerStreak = s.needs.hungerStreak;
284
+ p.sleepStreak = s.needs.sleepStreak;
285
+ p.edgeRemaining = s.edgeRemaining;
286
+ p.haggledThisJob = s.haggledThisJob;
287
+ p.autoStance = s.autoStance;
288
+ if (s.archetypeName)
289
+ p.archetypeName = s.archetypeName;
290
+ replaceInventory(p.inventory, s.inventory);
291
+ restoreEquipment(p.equipment, s.equipment);
292
+ }
293
+ // ============================= Hub world =============================
294
+ function serializeRoomOverlay(room, player) {
295
+ const doorLocks = [];
296
+ for (const [direction, exit] of room.exits.entries()) {
297
+ if (exit instanceof Door)
298
+ doorLocks.push({ direction, isLocked: exit.checkIfLocked() });
299
+ }
300
+ const currencyLedger = [];
301
+ for (const [owner, items] of room.currencyLedger.entries()) {
302
+ if (owner === player.name && items.length > 0) {
303
+ currencyLedger.push({ owner, items: items.map(serializeItem) });
304
+ }
305
+ }
306
+ return {
307
+ name: room.name,
308
+ inventory: room.inventory.getAllItems().map(serializeItem),
309
+ plainSightItems: [...room.plainSightItems],
310
+ searchedBy: [...room.searchedBy],
311
+ visitedBy: [...room.visitedBy],
312
+ hostCracked: room.hostCracked,
313
+ doorLocks,
314
+ currencyLedger,
315
+ };
316
+ }
317
+ function serializeNpcOverlay(npc) {
318
+ return {
319
+ name: npc.name,
320
+ room: npc.currentLocation?.name ?? '',
321
+ atSpot: npc.atSpot,
322
+ damageTaken: npc.damageTaken,
323
+ stunTaken: npc.stunTaken,
324
+ surrendered: npc.surrendered,
325
+ objective: npc.objective,
326
+ history: npc.exportHistory(),
327
+ inventory: npc.inventory.getAllItems().map(serializeItem),
328
+ equipment: serializeEquipment(npc.equipment),
329
+ };
330
+ }
331
+ /** Every puzzle reachable from the scene's rooms (room-anchored and
332
+ * door-attached), deduped by name. */
333
+ function collectPuzzles(scene) {
334
+ const out = new Map();
335
+ for (const room of Object.values(scene.getRooms())) {
336
+ for (const target of room.getPuzzleTargets()) {
337
+ if (!out.has(target.puzzle.name))
338
+ out.set(target.puzzle.name, target.puzzle);
339
+ }
340
+ }
341
+ return out;
342
+ }
343
+ export function captureHubOverlay(scene, hubSeed, player, homeRoom) {
344
+ const rooms = Object.values(scene.getRooms())
345
+ .filter(r => r !== homeRoom)
346
+ .map(r => serializeRoomOverlay(r, player));
347
+ // Companions are live shells -- never saved; their persistent state
348
+ // rides boundDevice items already serialized with the inventory.
349
+ const npcs = scene.allActors
350
+ .filter((a) => a !== player && a instanceof NPC && !a.companionKind)
351
+ .map(serializeNpcOverlay);
352
+ const deadActors = (hubSeed.npcs ?? [])
353
+ .map(n => n.player.name)
354
+ .filter(name => !scene.getActor(name));
355
+ const puzzles = [...collectPuzzles(scene).entries()]
356
+ .map(([name, p]) => ({ name, solved: p.isSolved(), bypassBurned: p.bypassBurned }));
357
+ const ownership = scene.exportOwnership();
358
+ return {
359
+ rooms,
360
+ npcs,
361
+ deadActors,
362
+ puzzles,
363
+ worldEvents: scene.worldEvents.slice(-40),
364
+ roomOwnership: ownership.rooms,
365
+ itemOwnership: ownership.items,
366
+ home: {
367
+ inventory: homeRoom.inventory.getAllItems().map(serializeItem),
368
+ secureStash: homeRoom.inventory.getSecureItemsFor(player.name).map(serializeItem),
369
+ },
370
+ };
371
+ }
372
+ export function applyHubOverlay(scene, saved, player, homeRoom) {
373
+ const logger = Logger.getInstance();
374
+ // 1. The dead stay dead -- quiet removal (their dropped gear is
375
+ // already inside the saved room inventories).
376
+ for (const name of saved.deadActors) {
377
+ scene.removeActorQuietly(name);
378
+ }
379
+ // 2. Rooms, matched by display name.
380
+ const liveRooms = new Map(Object.values(scene.getRooms()).map(r => [r.name, r]));
381
+ for (const overlay of saved.rooms) {
382
+ const room = liveRooms.get(overlay.name);
383
+ if (!room) {
384
+ logger.write(`applyHubOverlay: room "${overlay.name}" not in the synthesized hub -- skipped.`);
385
+ continue;
386
+ }
387
+ replaceInventory(room.inventory, overlay.inventory);
388
+ room.plainSightItems = new Set(overlay.plainSightItems);
389
+ room.searchedBy = new Set(overlay.searchedBy);
390
+ room.visitedBy = new Set(overlay.visitedBy);
391
+ room.hostCracked = overlay.hostCracked;
392
+ for (const lock of overlay.doorLocks) {
393
+ const exit = room.exits.get(lock.direction);
394
+ if (exit instanceof Door)
395
+ exit.isLocked = lock.isLocked;
396
+ }
397
+ for (const entry of overlay.currencyLedger) {
398
+ if (entry.owner !== player.name)
399
+ continue;
400
+ for (const it of entry.items) {
401
+ room.depositCurrencyCarrier(player, restoreItem(it));
402
+ }
403
+ }
404
+ }
405
+ // 3. NPCs -- location BEFORE atSpot (the setter clears it).
406
+ for (const overlay of saved.npcs) {
407
+ const npc = scene.getActor(overlay.name);
408
+ if (!npc || !(npc instanceof NPC)) {
409
+ logger.write(`applyHubOverlay: NPC "${overlay.name}" not in the synthesized hub -- skipped.`);
410
+ continue;
411
+ }
412
+ if (overlay.room && npc.currentLocation?.name !== overlay.room) {
413
+ try {
414
+ scene.setCharacterLocation(npc, overlay.room);
415
+ }
416
+ catch {
417
+ logger.write(`applyHubOverlay: room "${overlay.room}" missing for NPC "${overlay.name}" -- left at seed location.`);
418
+ }
419
+ }
420
+ npc.atSpot = overlay.atSpot;
421
+ npc.takeDamage(overlay.damageTaken);
422
+ npc.takeStun(overlay.stunTaken);
423
+ npc.surrendered = overlay.surrendered;
424
+ if (overlay.objective)
425
+ npc.setObjective(overlay.objective);
426
+ npc.restoreHistory(overlay.history);
427
+ replaceInventory(npc.inventory, overlay.inventory);
428
+ restoreEquipment(npc.equipment, overlay.equipment);
429
+ }
430
+ // 4. Puzzles: flags only -- door lock state was restored in step 2,
431
+ // so a solved-then-relocked door stays relocked.
432
+ const livePuzzles = collectPuzzles(scene);
433
+ for (const p of saved.puzzles) {
434
+ const live = livePuzzles.get(p.name);
435
+ if (live)
436
+ live.restoreState({ solved: p.solved, bypassBurned: p.bypassBurned });
437
+ }
438
+ // 5. The grapevine and the deeds.
439
+ scene.restoreWorldEvents(saved.worldEvents);
440
+ scene.restoreOwnership(saved.roomOwnership, saved.itemOwnership);
441
+ // 6. Home: the stash and the secure locker.
442
+ replaceInventory(homeRoom.inventory, saved.home.inventory);
443
+ for (const it of saved.home.secureStash) {
444
+ homeRoom.inventory.addSecureItem(player.name, restoreItem(it));
445
+ }
446
+ }
447
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../../../../../src/commands/game/sideQuest/utilities/persistence.ts"],"names":[],"mappings":"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"}