@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.
- package/bundle/typescript/package.json +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js +5 -0
- package/bundle/typescript/src/commands/game/sideQuest/commands/rest.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.d.ts +23 -1
- package/bundle/typescript/src/commands/game/sideQuest/game.js +160 -3
- package/bundle/typescript/src/commands/game/sideQuest/game.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.d.ts +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js +8 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/npc.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/player.d.ts +2 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js +8 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/player.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.d.ts +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js +10 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/puzzle.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.d.ts +17 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.js +32 -0
- package/bundle/typescript/src/commands/game/sideQuest/models/scene.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/types/save-file.d.ts +208 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/save-file.js +14 -0
- package/bundle/typescript/src/commands/game/sideQuest/types/save-file.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.d.ts +6 -0
- package/bundle/typescript/src/commands/game/sideQuest/ui.js +48 -4
- package/bundle/typescript/src/commands/game/sideQuest/ui.js.map +1 -1
- package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.d.ts +50 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js +232 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/cloud-saves.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.d.ts +71 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js +447 -0
- package/bundle/typescript/src/commands/game/sideQuest/utilities/persistence.js.map +1 -0
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js +174 -18
- package/bundle/typescript/src/commands/game/sideQuest.sub.cmd.js.map +1 -1
- 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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"}
|