@mythxengine/types 0.1.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/rules.test.d.ts +5 -0
  3. package/dist/__tests__/rules.test.d.ts.map +1 -0
  4. package/dist/__tests__/rules.test.js +278 -0
  5. package/dist/__tests__/rules.test.js.map +1 -0
  6. package/dist/__tests__/time.test.d.ts +2 -0
  7. package/dist/__tests__/time.test.d.ts.map +1 -0
  8. package/dist/__tests__/time.test.js +125 -0
  9. package/dist/__tests__/time.test.js.map +1 -0
  10. package/dist/game/abilities.d.ts +77 -0
  11. package/dist/game/abilities.d.ts.map +1 -0
  12. package/dist/game/abilities.js +38 -0
  13. package/dist/game/abilities.js.map +1 -0
  14. package/dist/game/actions.d.ts +84 -0
  15. package/dist/game/actions.d.ts.map +1 -0
  16. package/dist/game/actions.js +10 -0
  17. package/dist/game/actions.js.map +1 -0
  18. package/dist/game/character.d.ts +128 -0
  19. package/dist/game/character.d.ts.map +1 -0
  20. package/dist/game/character.js +16 -0
  21. package/dist/game/character.js.map +1 -0
  22. package/dist/game/combat.d.ts +56 -0
  23. package/dist/game/combat.d.ts.map +1 -0
  24. package/dist/game/combat.js +5 -0
  25. package/dist/game/combat.js.map +1 -0
  26. package/dist/game/conditions.d.ts +216 -0
  27. package/dist/game/conditions.d.ts.map +1 -0
  28. package/dist/game/conditions.js +99 -0
  29. package/dist/game/conditions.js.map +1 -0
  30. package/dist/game/dice.d.ts +87 -0
  31. package/dist/game/dice.d.ts.map +1 -0
  32. package/dist/game/dice.js +13 -0
  33. package/dist/game/dice.js.map +1 -0
  34. package/dist/game/events.d.ts +85 -0
  35. package/dist/game/events.d.ts.map +1 -0
  36. package/dist/game/events.js +10 -0
  37. package/dist/game/events.js.map +1 -0
  38. package/dist/game/index.d.ts +13 -0
  39. package/dist/game/index.d.ts.map +1 -0
  40. package/dist/game/index.js +13 -0
  41. package/dist/game/index.js.map +1 -0
  42. package/dist/game/player.d.ts +110 -0
  43. package/dist/game/player.d.ts.map +1 -0
  44. package/dist/game/player.js +45 -0
  45. package/dist/game/player.js.map +1 -0
  46. package/dist/game/state.d.ts +99 -0
  47. package/dist/game/state.d.ts.map +1 -0
  48. package/dist/game/state.js +60 -0
  49. package/dist/game/state.js.map +1 -0
  50. package/dist/index.d.ts +10 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +14 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/rules/abilities.d.ts +82 -0
  55. package/dist/rules/abilities.d.ts.map +1 -0
  56. package/dist/rules/abilities.js +94 -0
  57. package/dist/rules/abilities.js.map +1 -0
  58. package/dist/rules/custom-tests.d.ts +163 -0
  59. package/dist/rules/custom-tests.d.ts.map +1 -0
  60. package/dist/rules/custom-tests.js +43 -0
  61. package/dist/rules/custom-tests.js.map +1 -0
  62. package/dist/rules/difficulties.d.ts +51 -0
  63. package/dist/rules/difficulties.d.ts.map +1 -0
  64. package/dist/rules/difficulties.js +77 -0
  65. package/dist/rules/difficulties.js.map +1 -0
  66. package/dist/rules/index.d.ts +123 -0
  67. package/dist/rules/index.d.ts.map +1 -0
  68. package/dist/rules/index.js +170 -0
  69. package/dist/rules/index.js.map +1 -0
  70. package/dist/rules/mechanics.d.ts +130 -0
  71. package/dist/rules/mechanics.d.ts.map +1 -0
  72. package/dist/rules/mechanics.js +64 -0
  73. package/dist/rules/mechanics.js.map +1 -0
  74. package/dist/session/index.d.ts +228 -0
  75. package/dist/session/index.d.ts.map +1 -0
  76. package/dist/session/index.js +60 -0
  77. package/dist/session/index.js.map +1 -0
  78. package/dist/tools/contract.d.ts +63 -0
  79. package/dist/tools/contract.d.ts.map +1 -0
  80. package/dist/tools/contract.js +36 -0
  81. package/dist/tools/contract.js.map +1 -0
  82. package/package.json +47 -0
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Rules Configuration System
3
+ *
4
+ * Allows world packs to extend or override base game rules,
5
+ * enabling genre-specific mechanics while keeping a generic base.
6
+ *
7
+ * @example Basic usage - keep defaults
8
+ * ```ts
9
+ * // No rules config = use all defaults
10
+ * const worldPack = { meta: {...}, archetypes: {...} };
11
+ * ```
12
+ *
13
+ * @example Add stress tracking
14
+ * ```ts
15
+ * const worldPack = {
16
+ * rules: {
17
+ * abilities: {
18
+ * add: [{ id: "STRESS", name: "Stress", minValue: 0, maxValue: 20, defaultValue: 2 }]
19
+ * }
20
+ * }
21
+ * };
22
+ * ```
23
+ *
24
+ * @example Full Mothership-style system
25
+ * ```ts
26
+ * const worldPack = {
27
+ * rules: {
28
+ * abilities: {
29
+ * replace: [
30
+ * { id: "STR", name: "Strength", minValue: 10, maxValue: 80, defaultValue: 30 },
31
+ * { id: "SPD", name: "Speed", minValue: 10, maxValue: 80, defaultValue: 30 },
32
+ * // ... etc
33
+ * ]
34
+ * },
35
+ * mechanics: {
36
+ * rollUnder: { enabled: true, dice: "d100" }
37
+ * },
38
+ * customTests: {
39
+ * tests: [{ id: "panic", name: "Panic Check", ... }]
40
+ * }
41
+ * }
42
+ * };
43
+ * ```
44
+ */
45
+ // Re-export all rule types
46
+ export * from "./abilities.js";
47
+ export * from "./difficulties.js";
48
+ export * from "./mechanics.js";
49
+ export * from "./custom-tests.js";
50
+ import { resolveAbilities, BASE_ABILITIES } from "./abilities.js";
51
+ import { resolveDifficulties } from "./difficulties.js";
52
+ import { resolveMechanics } from "./mechanics.js";
53
+ /**
54
+ * Resolve a world's rules configuration into fully resolved rules
55
+ *
56
+ * @param config - The world's rules configuration (or undefined for defaults)
57
+ * @returns Fully resolved rules with all defaults applied
58
+ */
59
+ export function resolveRules(config) {
60
+ const abilities = resolveAbilities(config?.abilities);
61
+ const difficulties = resolveDifficulties(config?.difficulties);
62
+ const mechanics = resolveMechanics(config?.mechanics);
63
+ const customTests = config?.customTests?.tests ?? [];
64
+ return {
65
+ abilities,
66
+ abilityMap: new Map(abilities.map((a) => [a.id, a])),
67
+ difficulties,
68
+ difficultyMap: new Map(difficulties.map((d) => [d.id, d])),
69
+ mechanics,
70
+ customTests,
71
+ customTestMap: new Map(customTests.map((t) => [t.id, t])),
72
+ };
73
+ }
74
+ /**
75
+ * Get the default rules (no configuration)
76
+ */
77
+ export function getDefaultRules() {
78
+ return resolveRules(undefined);
79
+ }
80
+ /**
81
+ * Validate that a rules configuration is valid
82
+ *
83
+ * @param config - The configuration to validate
84
+ * @returns Array of validation errors (empty if valid)
85
+ */
86
+ export function validateRulesConfig(config) {
87
+ const errors = [];
88
+ // Validate abilities
89
+ if (config.abilities?.replace) {
90
+ if (config.abilities.replace.length === 0) {
91
+ errors.push("abilities.replace cannot be empty");
92
+ }
93
+ const ids = new Set();
94
+ for (const ability of config.abilities.replace) {
95
+ if (ids.has(ability.id)) {
96
+ errors.push(`Duplicate ability ID: ${ability.id}`);
97
+ }
98
+ ids.add(ability.id);
99
+ if (ability.minValue >= ability.maxValue) {
100
+ errors.push(`Ability ${ability.id}: minValue must be less than maxValue`);
101
+ }
102
+ if (ability.defaultValue < ability.minValue ||
103
+ ability.defaultValue > ability.maxValue) {
104
+ errors.push(`Ability ${ability.id}: defaultValue must be between minValue and maxValue`);
105
+ }
106
+ }
107
+ }
108
+ if (config.abilities?.add) {
109
+ const baseIds = new Set(BASE_ABILITIES.map((a) => a.id));
110
+ for (const ability of config.abilities.add) {
111
+ if (baseIds.has(ability.id)) {
112
+ errors.push(`Cannot add ability ${ability.id}: conflicts with base ability`);
113
+ }
114
+ }
115
+ }
116
+ // Validate difficulties
117
+ if (config.difficulties?.replace) {
118
+ if (config.difficulties.replace.length === 0) {
119
+ errors.push("difficulties.replace cannot be empty");
120
+ }
121
+ const ids = new Set();
122
+ for (const diff of config.difficulties.replace) {
123
+ if (ids.has(diff.id)) {
124
+ errors.push(`Duplicate difficulty ID: ${diff.id}`);
125
+ }
126
+ ids.add(diff.id);
127
+ }
128
+ }
129
+ // Validate mechanics
130
+ if (config.mechanics?.criticals) {
131
+ const { successOn, failureOn } = config.mechanics.criticals;
132
+ if (successOn && failureOn) {
133
+ const overlap = successOn.filter((n) => failureOn.includes(n));
134
+ if (overlap.length > 0) {
135
+ errors.push(`Critical success and failure ranges overlap: ${overlap.join(", ")}`);
136
+ }
137
+ }
138
+ }
139
+ // Validate custom tests
140
+ if (config.customTests?.tests) {
141
+ const ids = new Set();
142
+ for (const test of config.customTests.tests) {
143
+ if (ids.has(test.id)) {
144
+ errors.push(`Duplicate custom test ID: ${test.id}`);
145
+ }
146
+ ids.add(test.id);
147
+ if (!test.roll.dice) {
148
+ errors.push(`Custom test ${test.id}: roll.dice is required`);
149
+ }
150
+ if (!test.outcomes.success && !test.outcomes.failure) {
151
+ errors.push(`Custom test ${test.id}: at least success or failure outcome is required`);
152
+ }
153
+ }
154
+ }
155
+ return errors;
156
+ }
157
+ /**
158
+ * Check if a rules config uses roll-under mechanics
159
+ */
160
+ export function isRollUnderSystem(config) {
161
+ return config?.mechanics?.rollUnder?.enabled ?? false;
162
+ }
163
+ /**
164
+ * Get ability IDs from a rules config
165
+ */
166
+ export function getAbilityIds(config) {
167
+ const abilities = resolveAbilities(config?.abilities);
168
+ return abilities.map((a) => a.id);
169
+ }
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Core Mechanics Configuration
3
+ *
4
+ * Allows world packs to customize fundamental game mechanics.
5
+ */
6
+ /**
7
+ * Defense calculation configuration
8
+ */
9
+ export interface DefenseConfig {
10
+ /** Base defense value before ability modifier (default: 10) */
11
+ base: number;
12
+ /** Which ability adds to defense (default: "AGI") */
13
+ ability?: string;
14
+ /**
15
+ * Advanced: Custom formula using template syntax.
16
+ * Available variables: {base}, {ability_id}, {armor}
17
+ * Example: "{base} + {AGI} + {armor}"
18
+ */
19
+ formula?: string;
20
+ }
21
+ /**
22
+ * Damage calculation configuration
23
+ */
24
+ export interface DamageConfig {
25
+ /** Add ability modifier to damage (default: true) */
26
+ addAbility: boolean;
27
+ /** Subtract armor from damage (default: true) */
28
+ subtractArmor: boolean;
29
+ /** Minimum damage after all modifiers (default: 0) */
30
+ minimumDamage: number;
31
+ }
32
+ /**
33
+ * Critical hit/miss configuration
34
+ */
35
+ export interface CriticalsConfig {
36
+ /** Natural rolls that count as critical success (default: [20]) */
37
+ successOn: number[];
38
+ /** Natural rolls that count as critical failure (default: [1]) */
39
+ failureOn: number[];
40
+ /** Damage multiplier on critical hit (default: 2) */
41
+ damageMultiplier: number;
42
+ /** Critical success always succeeds regardless of total (default: true) */
43
+ autoSuccess: boolean;
44
+ /** Critical failure always fails regardless of total (default: true) */
45
+ autoFailure: boolean;
46
+ }
47
+ /**
48
+ * Roll-under system configuration (for d100 systems like Mothership)
49
+ */
50
+ export interface RollUnderConfig {
51
+ /** Enable roll-under mechanics (default: false) */
52
+ enabled: boolean;
53
+ /** Dice to use for roll-under tests (default: "d100") */
54
+ dice: string;
55
+ /** Critical success range (e.g., [1, 5] means 1-5 is critical) */
56
+ criticalSuccessRange?: [number, number];
57
+ /** Critical failure range (e.g., [96, 100]) */
58
+ criticalFailureRange?: [number, number];
59
+ }
60
+ /**
61
+ * Advantage/disadvantage configuration
62
+ */
63
+ export interface AdvantageConfig {
64
+ /** Dice to roll for advantage/disadvantage (default: "d20") */
65
+ dice: string;
66
+ /** How advantage works (default: "best_of_two") */
67
+ advantageMethod: "best_of_two" | "reroll_failures" | "bonus";
68
+ /** If bonus method, the bonus amount */
69
+ bonusAmount?: number;
70
+ }
71
+ /**
72
+ * Full mechanics configuration for a world pack
73
+ */
74
+ export interface MechanicsConfig {
75
+ /** Defense calculation */
76
+ defense?: Partial<DefenseConfig>;
77
+ /** Damage calculation */
78
+ damage?: Partial<DamageConfig>;
79
+ /** Critical rules */
80
+ criticals?: Partial<CriticalsConfig>;
81
+ /** Roll-under system (for d100 games) */
82
+ rollUnder?: RollUnderConfig;
83
+ /** Advantage/disadvantage mechanics */
84
+ advantage?: Partial<AdvantageConfig>;
85
+ /** Default resistance multiplier (default: 0.5) */
86
+ resistanceMultiplier?: number;
87
+ /** Default vulnerability multiplier (default: 2.0) */
88
+ vulnerabilityMultiplier?: number;
89
+ }
90
+ /**
91
+ * Base defense configuration
92
+ */
93
+ export declare const BASE_DEFENSE: DefenseConfig;
94
+ /**
95
+ * Base damage configuration
96
+ */
97
+ export declare const BASE_DAMAGE: DamageConfig;
98
+ /**
99
+ * Base critical configuration
100
+ */
101
+ export declare const BASE_CRITICALS: CriticalsConfig;
102
+ /**
103
+ * Base advantage configuration
104
+ */
105
+ export declare const BASE_ADVANTAGE: AdvantageConfig;
106
+ /**
107
+ * Fully resolved mechanics with all defaults applied
108
+ */
109
+ export interface ResolvedMechanics {
110
+ defense: DefenseConfig;
111
+ damage: DamageConfig;
112
+ criticals: CriticalsConfig;
113
+ rollUnder?: RollUnderConfig;
114
+ advantage: AdvantageConfig;
115
+ resistanceMultiplier: number;
116
+ vulnerabilityMultiplier: number;
117
+ }
118
+ /**
119
+ * Resolve mechanics configuration with defaults
120
+ */
121
+ export declare function resolveMechanics(config?: MechanicsConfig): ResolvedMechanics;
122
+ /**
123
+ * Check if a natural roll is a critical success
124
+ */
125
+ export declare function isCriticalSuccess(natural: number, criticals: CriticalsConfig): boolean;
126
+ /**
127
+ * Check if a natural roll is a critical failure
128
+ */
129
+ export declare function isCriticalFailure(natural: number, criticals: CriticalsConfig): boolean;
130
+ //# sourceMappingURL=mechanics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mechanics.d.ts","sourceRoot":"","sources":["../../src/rules/mechanics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Core Mechanics Configuration
3
+ *
4
+ * Allows world packs to customize fundamental game mechanics.
5
+ */
6
+ /**
7
+ * Base defense configuration
8
+ */
9
+ export const BASE_DEFENSE = {
10
+ base: 10,
11
+ ability: "AGI",
12
+ };
13
+ /**
14
+ * Base damage configuration
15
+ */
16
+ export const BASE_DAMAGE = {
17
+ addAbility: true,
18
+ subtractArmor: true,
19
+ minimumDamage: 0,
20
+ };
21
+ /**
22
+ * Base critical configuration
23
+ */
24
+ export const BASE_CRITICALS = {
25
+ successOn: [20],
26
+ failureOn: [1],
27
+ damageMultiplier: 2,
28
+ autoSuccess: true,
29
+ autoFailure: true,
30
+ };
31
+ /**
32
+ * Base advantage configuration
33
+ */
34
+ export const BASE_ADVANTAGE = {
35
+ dice: "d20",
36
+ advantageMethod: "best_of_two",
37
+ };
38
+ /**
39
+ * Resolve mechanics configuration with defaults
40
+ */
41
+ export function resolveMechanics(config) {
42
+ return {
43
+ defense: { ...BASE_DEFENSE, ...config?.defense },
44
+ damage: { ...BASE_DAMAGE, ...config?.damage },
45
+ criticals: { ...BASE_CRITICALS, ...config?.criticals },
46
+ rollUnder: config?.rollUnder,
47
+ advantage: { ...BASE_ADVANTAGE, ...config?.advantage },
48
+ resistanceMultiplier: config?.resistanceMultiplier ?? 0.5,
49
+ vulnerabilityMultiplier: config?.vulnerabilityMultiplier ?? 2.0,
50
+ };
51
+ }
52
+ /**
53
+ * Check if a natural roll is a critical success
54
+ */
55
+ export function isCriticalSuccess(natural, criticals) {
56
+ return criticals.successOn.includes(natural);
57
+ }
58
+ /**
59
+ * Check if a natural roll is a critical failure
60
+ */
61
+ export function isCriticalFailure(natural, criticals) {
62
+ return criticals.failureOn.includes(natural);
63
+ }
64
+ //# sourceMappingURL=mechanics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mechanics.js","sourceRoot":"","sources":["../../src/rules/mechanics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4FH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,SAAS,EAAE,CAAC,EAAE,CAAC;IACf,SAAS,EAAE,CAAC,CAAC,CAAC;IACd,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,IAAI,EAAE,KAAK;IACX,eAAe,EAAE,aAAa;CAC/B,CAAC;AAeF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,OAAO;QACL,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE;QAChD,MAAM,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE;QAC7C,SAAS,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE;QACtD,SAAS,EAAE,MAAM,EAAE,SAAS;QAC5B,SAAS,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE;QACtD,oBAAoB,EAAE,MAAM,EAAE,oBAAoB,IAAI,GAAG;QACzD,uBAAuB,EAAE,MAAM,EAAE,uBAAuB,IAAI,GAAG;KAChE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,SAA0B;IAE1B,OAAO,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,SAA0B;IAE1B,OAAO,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Session state types for persistence
3
+ */
4
+ import type { Character, Enemy, NPC, GameTime, Deadline, Player, TurnState } from "../game/index.js";
5
+ import type { RNGState, CombatState } from "../game/index.js";
6
+ /**
7
+ * Generation manifest step status
8
+ */
9
+ export interface ManifestStep {
10
+ /** Step type (seed, archetypes, monsters, etc.) */
11
+ type: string;
12
+ /** Step ID linking to session history (handles duplicate step types) */
13
+ stepId?: string;
14
+ /** Current status */
15
+ status: "in_progress" | "completed" | "failed";
16
+ /** Output file path relative to generation dir */
17
+ file?: string;
18
+ /** Completion timestamp */
19
+ completedAt?: string;
20
+ /** Error message if failed */
21
+ error?: string;
22
+ /** IDs of generated entities */
23
+ generatedIds?: string[];
24
+ }
25
+ /**
26
+ * Generation manifest - source of truth for generation progress
27
+ * Stored at data/generation/{sessionId}/manifest.json
28
+ */
29
+ export interface GenerationManifest {
30
+ /** Session ID */
31
+ sessionId: string;
32
+ /** Original campaign seed prompt */
33
+ campaignSeed: string;
34
+ /** World tier (small/medium/large) */
35
+ tier: "small" | "medium" | "large";
36
+ /** Optional rules configuration */
37
+ rulesConfig?: unknown;
38
+ /** World settings */
39
+ settings?: {
40
+ lethality?: "low" | "medium" | "high" | "brutal";
41
+ magicLevel?: "none" | "rare" | "common" | "high";
42
+ technologyLevel?: "primitive" | "medieval" | "renaissance" | "industrial" | "modern" | "futuristic";
43
+ supernaturalPresence?: "subtle" | "common" | "pervasive";
44
+ };
45
+ /** Creation timestamp */
46
+ createdAt: string;
47
+ /** Overall status */
48
+ status: "seeding" | "generating" | "expanding" | "assembling" | "complete";
49
+ /** Generation steps */
50
+ steps: ManifestStep[];
51
+ }
52
+ /**
53
+ * World generation session state (minimal interface)
54
+ * Full implementation in @mythxengine/worlds package
55
+ */
56
+ export interface WorldGenerationSession {
57
+ /** World seed (null until seeding complete) */
58
+ worldSeed: unknown | null;
59
+ /** Generated content */
60
+ generatedContent: {
61
+ archetypes: unknown[];
62
+ monsters: unknown[];
63
+ items: unknown[];
64
+ encounters: unknown[];
65
+ locations: unknown[];
66
+ npcs: unknown[];
67
+ conditions: unknown[];
68
+ factions: unknown[];
69
+ narrative: unknown | null;
70
+ situations: unknown[];
71
+ arcs: unknown[];
72
+ };
73
+ /** Expanded content */
74
+ expansions: {
75
+ locations: unknown[];
76
+ archetypes: unknown[];
77
+ npcs: unknown[];
78
+ monsters: unknown[];
79
+ };
80
+ /** Generation status */
81
+ status: "idle" | "seeding" | "generating" | "expanding" | "assembling" | "complete";
82
+ /** Generation history */
83
+ history: Array<{
84
+ id: string;
85
+ type: string;
86
+ startedAt: string;
87
+ completedAt: string | null;
88
+ status: "pending" | "in_progress" | "completed" | "failed";
89
+ error?: string;
90
+ generatedIds: string[];
91
+ }>;
92
+ /** Assembled world pack ID (if complete) */
93
+ worldPackId: string | null;
94
+ }
95
+ /**
96
+ * Session metadata
97
+ */
98
+ export interface SessionMetadata {
99
+ id: string;
100
+ name: string;
101
+ campaignId?: string;
102
+ createdAt: string;
103
+ updatedAt: string;
104
+ }
105
+ /**
106
+ * Session note
107
+ */
108
+ export interface SessionNote {
109
+ id: string;
110
+ timestamp: string;
111
+ content: string;
112
+ tags: string[];
113
+ }
114
+ /**
115
+ * Active situation clock (runtime state)
116
+ */
117
+ export interface ActiveClock {
118
+ /** Clock ID (from the situation) */
119
+ clockId: string;
120
+ /** Situation ID this clock belongs to */
121
+ situationId: string;
122
+ /** Clock name */
123
+ name: string;
124
+ /** What the clock counts toward */
125
+ doom: string;
126
+ /** Current stage index (0-based, null if not started) */
127
+ currentStage: number;
128
+ /** When the clock was started */
129
+ startedAt: GameTime;
130
+ /** Is the clock paused? */
131
+ paused: boolean;
132
+ /** Total stages in this clock */
133
+ totalStages: number;
134
+ /** Copy of stage definitions for runtime */
135
+ stages: Array<{
136
+ id: string;
137
+ name: string;
138
+ description: string;
139
+ trigger: unknown;
140
+ consequences: unknown;
141
+ reversible: boolean;
142
+ }>;
143
+ }
144
+ /**
145
+ * A discovered lead (tracking player progress through situations)
146
+ */
147
+ export interface DiscoveredLead {
148
+ /** Lead ID */
149
+ leadId: string;
150
+ /** Situation the lead points to */
151
+ targetSituationId: string;
152
+ /** When it was discovered */
153
+ discoveredAt: GameTime;
154
+ /** How it was discovered */
155
+ discoveryMethod: string;
156
+ /** Context about discovery */
157
+ discoveryContext?: string;
158
+ /** The information the lead revealed */
159
+ information: string;
160
+ }
161
+ /**
162
+ * NPC relationship tracking
163
+ */
164
+ export interface NPCRelationship {
165
+ /** NPC ID */
166
+ npcId: string;
167
+ /** NPC name (for convenience) */
168
+ npcName: string;
169
+ /** Overall attitude toward the party */
170
+ attitude: "hostile" | "unfriendly" | "neutral" | "friendly" | "allied";
171
+ /** Per-character attitudes (optional) */
172
+ characterAttitudes?: Record<string, "hostile" | "unfriendly" | "neutral" | "friendly" | "allied">;
173
+ /** Interaction history */
174
+ history: Array<{
175
+ timestamp: GameTime;
176
+ interaction: string;
177
+ impact: "very_negative" | "negative" | "neutral" | "positive" | "very_positive";
178
+ }>;
179
+ /** What the NPC knows about the party */
180
+ knows: string[];
181
+ /** Favors/debts */
182
+ owes: string[];
183
+ /** What the NPC fears from the party */
184
+ fears: string[];
185
+ /** What the NPC wants from the party */
186
+ wants: string[];
187
+ }
188
+ /**
189
+ * Full session state for persistence
190
+ */
191
+ export interface SessionState {
192
+ metadata: SessionMetadata;
193
+ rng: RNGState;
194
+ seq: number;
195
+ characters: Record<string, Character>;
196
+ npcs: Record<string, NPC>;
197
+ enemies: Record<string, Enemy>;
198
+ combat: CombatState | null;
199
+ notes: SessionNote[];
200
+ flags: string[];
201
+ worldState: Record<string, unknown>;
202
+ gameTime: GameTime;
203
+ deadlines: Deadline[];
204
+ generation?: WorldGenerationSession;
205
+ /** Players in the session (human and AI) */
206
+ players?: Record<string, Player>;
207
+ /** Turn coordination state (null if not in turn-based mode) */
208
+ turns?: TurnState | null;
209
+ /** The GM player ID */
210
+ gmPlayerId?: string;
211
+ /** Active situation clocks */
212
+ activeClocks?: ActiveClock[];
213
+ /** Leads discovered by players */
214
+ discoveredLeads?: DiscoveredLead[];
215
+ /** NPC relationship tracking */
216
+ relationships?: Record<string, NPCRelationship>;
217
+ /** ID of the active world pack (for rules context) */
218
+ worldPackId?: string;
219
+ }
220
+ /**
221
+ * Create a new empty generation session
222
+ */
223
+ export declare function createEmptyGenerationSession(): WorldGenerationSession;
224
+ /**
225
+ * Create a new empty session
226
+ */
227
+ export declare function createEmptySession(id: string, name: string): SessionState;
228
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Session state types for persistence
3
+ */
4
+ import { createInitialGameTime } from "../game/index.js";
5
+ /**
6
+ * Create a new empty generation session
7
+ */
8
+ export function createEmptyGenerationSession() {
9
+ return {
10
+ worldSeed: null,
11
+ generatedContent: {
12
+ archetypes: [],
13
+ monsters: [],
14
+ items: [],
15
+ encounters: [],
16
+ locations: [],
17
+ npcs: [],
18
+ conditions: [],
19
+ factions: [],
20
+ narrative: null,
21
+ situations: [],
22
+ arcs: [],
23
+ },
24
+ expansions: {
25
+ locations: [],
26
+ archetypes: [],
27
+ npcs: [],
28
+ monsters: [],
29
+ },
30
+ status: "idle",
31
+ history: [],
32
+ worldPackId: null,
33
+ };
34
+ }
35
+ /**
36
+ * Create a new empty session
37
+ */
38
+ export function createEmptySession(id, name) {
39
+ const now = new Date().toISOString();
40
+ return {
41
+ metadata: {
42
+ id,
43
+ name,
44
+ createdAt: now,
45
+ updatedAt: now,
46
+ },
47
+ rng: { seed: Date.now(), cursor: 0 },
48
+ seq: 0,
49
+ characters: {},
50
+ npcs: {},
51
+ enemies: {},
52
+ combat: null,
53
+ notes: [],
54
+ flags: [],
55
+ worldState: {},
56
+ gameTime: createInitialGameTime(),
57
+ deadlines: [],
58
+ };
59
+ }
60
+ //# sourceMappingURL=index.js.map