@ai-rpg-engine/modules 1.0.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 (117) hide show
  1. package/dist/belief-provenance.d.ts +41 -0
  2. package/dist/belief-provenance.d.ts.map +1 -0
  3. package/dist/belief-provenance.js +254 -0
  4. package/dist/belief-provenance.js.map +1 -0
  5. package/dist/belief-provenance.test.d.ts +2 -0
  6. package/dist/belief-provenance.test.d.ts.map +1 -0
  7. package/dist/belief-provenance.test.js +139 -0
  8. package/dist/belief-provenance.test.js.map +1 -0
  9. package/dist/cognition-core.d.ts +89 -0
  10. package/dist/cognition-core.d.ts.map +1 -0
  11. package/dist/cognition-core.js +370 -0
  12. package/dist/cognition-core.js.map +1 -0
  13. package/dist/cognition-core.test.d.ts +2 -0
  14. package/dist/cognition-core.test.d.ts.map +1 -0
  15. package/dist/cognition-core.test.js +215 -0
  16. package/dist/cognition-core.test.js.map +1 -0
  17. package/dist/combat-core.d.ts +11 -0
  18. package/dist/combat-core.d.ts.map +1 -0
  19. package/dist/combat-core.js +152 -0
  20. package/dist/combat-core.js.map +1 -0
  21. package/dist/dialogue-core.d.ts +10 -0
  22. package/dist/dialogue-core.d.ts.map +1 -0
  23. package/dist/dialogue-core.js +172 -0
  24. package/dist/dialogue-core.js.map +1 -0
  25. package/dist/district-core.d.ts +59 -0
  26. package/dist/district-core.d.ts.map +1 -0
  27. package/dist/district-core.js +224 -0
  28. package/dist/district-core.js.map +1 -0
  29. package/dist/district-core.test.d.ts +2 -0
  30. package/dist/district-core.test.d.ts.map +1 -0
  31. package/dist/district-core.test.js +157 -0
  32. package/dist/district-core.test.js.map +1 -0
  33. package/dist/environment-core.d.ts +78 -0
  34. package/dist/environment-core.d.ts.map +1 -0
  35. package/dist/environment-core.js +229 -0
  36. package/dist/environment-core.js.map +1 -0
  37. package/dist/environment-core.test.d.ts +2 -0
  38. package/dist/environment-core.test.d.ts.map +1 -0
  39. package/dist/environment-core.test.js +252 -0
  40. package/dist/environment-core.test.js.map +1 -0
  41. package/dist/faction-cognition.d.ts +39 -0
  42. package/dist/faction-cognition.d.ts.map +1 -0
  43. package/dist/faction-cognition.js +139 -0
  44. package/dist/faction-cognition.js.map +1 -0
  45. package/dist/faction-cognition.test.d.ts +2 -0
  46. package/dist/faction-cognition.test.d.ts.map +1 -0
  47. package/dist/faction-cognition.test.js +166 -0
  48. package/dist/faction-cognition.test.js.map +1 -0
  49. package/dist/index.d.ts +31 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +18 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/inventory-core.d.ts +10 -0
  54. package/dist/inventory-core.d.ts.map +1 -0
  55. package/dist/inventory-core.js +69 -0
  56. package/dist/inventory-core.js.map +1 -0
  57. package/dist/knowledge-decay.test.d.ts +2 -0
  58. package/dist/knowledge-decay.test.d.ts.map +1 -0
  59. package/dist/knowledge-decay.test.js +143 -0
  60. package/dist/knowledge-decay.test.js.map +1 -0
  61. package/dist/narrative-authority.d.ts +40 -0
  62. package/dist/narrative-authority.d.ts.map +1 -0
  63. package/dist/narrative-authority.js +89 -0
  64. package/dist/narrative-authority.js.map +1 -0
  65. package/dist/narrative-authority.test.d.ts +2 -0
  66. package/dist/narrative-authority.test.d.ts.map +1 -0
  67. package/dist/narrative-authority.test.js +237 -0
  68. package/dist/narrative-authority.test.js.map +1 -0
  69. package/dist/observer-presentation.d.ts +74 -0
  70. package/dist/observer-presentation.d.ts.map +1 -0
  71. package/dist/observer-presentation.js +277 -0
  72. package/dist/observer-presentation.js.map +1 -0
  73. package/dist/observer-presentation.test.d.ts +2 -0
  74. package/dist/observer-presentation.test.d.ts.map +1 -0
  75. package/dist/observer-presentation.test.js +156 -0
  76. package/dist/observer-presentation.test.js.map +1 -0
  77. package/dist/perception-filter.d.ts +46 -0
  78. package/dist/perception-filter.d.ts.map +1 -0
  79. package/dist/perception-filter.js +281 -0
  80. package/dist/perception-filter.js.map +1 -0
  81. package/dist/perception-filter.test.d.ts +2 -0
  82. package/dist/perception-filter.test.d.ts.map +1 -0
  83. package/dist/perception-filter.test.js +308 -0
  84. package/dist/perception-filter.test.js.map +1 -0
  85. package/dist/progression-core.d.ts +63 -0
  86. package/dist/progression-core.d.ts.map +1 -0
  87. package/dist/progression-core.js +232 -0
  88. package/dist/progression-core.js.map +1 -0
  89. package/dist/progression-core.test.d.ts +2 -0
  90. package/dist/progression-core.test.d.ts.map +1 -0
  91. package/dist/progression-core.test.js +328 -0
  92. package/dist/progression-core.test.js.map +1 -0
  93. package/dist/rumor-propagation.d.ts +31 -0
  94. package/dist/rumor-propagation.d.ts.map +1 -0
  95. package/dist/rumor-propagation.js +180 -0
  96. package/dist/rumor-propagation.js.map +1 -0
  97. package/dist/rumor-propagation.test.d.ts +2 -0
  98. package/dist/rumor-propagation.test.d.ts.map +1 -0
  99. package/dist/rumor-propagation.test.js +176 -0
  100. package/dist/rumor-propagation.test.js.map +1 -0
  101. package/dist/simulation-inspector.d.ts +78 -0
  102. package/dist/simulation-inspector.d.ts.map +1 -0
  103. package/dist/simulation-inspector.js +263 -0
  104. package/dist/simulation-inspector.js.map +1 -0
  105. package/dist/simulation-inspector.test.d.ts +2 -0
  106. package/dist/simulation-inspector.test.d.ts.map +1 -0
  107. package/dist/simulation-inspector.test.js +152 -0
  108. package/dist/simulation-inspector.test.js.map +1 -0
  109. package/dist/status-core.d.ts +17 -0
  110. package/dist/status-core.d.ts.map +1 -0
  111. package/dist/status-core.js +106 -0
  112. package/dist/status-core.js.map +1 -0
  113. package/dist/traversal-core.d.ts +3 -0
  114. package/dist/traversal-core.d.ts.map +1 -0
  115. package/dist/traversal-core.js +93 -0
  116. package/dist/traversal-core.js.map +1 -0
  117. package/package.json +34 -0
@@ -0,0 +1,152 @@
1
+ import { describe, test, expect } from 'vitest';
2
+ import { createTestEngine } from '@ai-rpg-engine/core';
3
+ import { createCognitionCore, getCognition, setBelief, addMemory } from './cognition-core.js';
4
+ import { createPerceptionFilter } from './perception-filter.js';
5
+ import { createEnvironmentCore, setZoneProperty } from './environment-core.js';
6
+ import { createFactionCognition, setFactionBelief, getFactionCognition } from './faction-cognition.js';
7
+ import { createRumorPropagation } from './rumor-propagation.js';
8
+ import { createSimulationInspector, inspectEntity, inspectAllEntities, inspectFaction, inspectAllFactions, inspectZone, inspectAllZones, createSnapshot, formatEntityInspection, formatFactionInspection, } from './simulation-inspector.js';
9
+ const guard = {
10
+ id: 'guard_1',
11
+ blueprintId: 'guard',
12
+ type: 'npc',
13
+ name: 'Guard Captain',
14
+ tags: ['enemy'],
15
+ stats: { vigor: 5, instinct: 6, will: 4 },
16
+ resources: { hp: 20 },
17
+ statuses: [],
18
+ zoneId: 'hall',
19
+ ai: { profileId: 'aggressive', goals: ['guard'], fears: [], alertLevel: 0, knowledge: {} },
20
+ };
21
+ const player = {
22
+ id: 'player',
23
+ blueprintId: 'player',
24
+ type: 'player',
25
+ name: 'Hero',
26
+ tags: ['player'],
27
+ stats: { vigor: 7, instinct: 5, will: 5 },
28
+ resources: { hp: 30 },
29
+ statuses: [],
30
+ zoneId: 'hall',
31
+ };
32
+ const zones = [
33
+ { id: 'hall', roomId: 'castle', name: 'Great Hall', tags: [], neighbors: ['yard'] },
34
+ { id: 'yard', roomId: 'castle', name: 'Courtyard', tags: [], neighbors: ['hall'] },
35
+ ];
36
+ describe('simulation-inspector', () => {
37
+ function createEngine() {
38
+ return createTestEngine({
39
+ modules: [
40
+ createCognitionCore(),
41
+ createPerceptionFilter(),
42
+ createEnvironmentCore(),
43
+ createFactionCognition({
44
+ factions: [{ factionId: 'castle-guard', entityIds: ['guard_1'] }],
45
+ }),
46
+ createRumorPropagation(),
47
+ createSimulationInspector(),
48
+ ],
49
+ entities: [player, { ...guard }],
50
+ zones,
51
+ playerId: 'player',
52
+ startZone: 'hall',
53
+ });
54
+ }
55
+ test('inspectEntity returns cognition state', () => {
56
+ const engine = createEngine();
57
+ const cog = getCognition(engine.world, 'guard_1');
58
+ setBelief(cog, 'player', 'hostile', true, 0.8, 'observed', 0);
59
+ addMemory(cog, 'saw-combat', 0, { attackerId: 'player' });
60
+ const inspection = inspectEntity(engine.world, 'guard_1');
61
+ expect(inspection).not.toBeNull();
62
+ expect(inspection.name).toBe('Guard Captain');
63
+ expect(inspection.zone).toBe('hall');
64
+ expect(inspection.faction).toBe('castle-guard');
65
+ expect(inspection.cognition.beliefs).toHaveLength(1);
66
+ expect(inspection.cognition.recentMemories).toHaveLength(1);
67
+ });
68
+ test('inspectEntity returns null for unknown entity', () => {
69
+ const engine = createEngine();
70
+ expect(inspectEntity(engine.world, 'nobody')).toBeNull();
71
+ });
72
+ test('inspectAllEntities returns only AI entities', () => {
73
+ const engine = createEngine();
74
+ const all = inspectAllEntities(engine.world);
75
+ expect(Object.keys(all)).toContain('guard_1');
76
+ expect(Object.keys(all)).not.toContain('player'); // player has no ai field
77
+ });
78
+ test('inspectFaction returns faction beliefs and members', () => {
79
+ const engine = createEngine();
80
+ const factionCog = getFactionCognition(engine.world, 'castle-guard');
81
+ setFactionBelief(factionCog, 'player', 'hostile', true, 0.7, 'guard_1', 0);
82
+ const inspection = inspectFaction(engine.world, 'castle-guard');
83
+ expect(inspection).not.toBeNull();
84
+ expect(inspection.members).toContain('guard_1');
85
+ expect(inspection.beliefs).toHaveLength(1);
86
+ expect(inspection.alertLevel).toBe(0);
87
+ expect(inspection.cohesion).toBe(0.8); // default cohesion
88
+ });
89
+ test('inspectAllFactions returns all faction data', () => {
90
+ const engine = createEngine();
91
+ const all = inspectAllFactions(engine.world);
92
+ expect(Object.keys(all)).toContain('castle-guard');
93
+ });
94
+ test('inspectZone returns dynamic properties and entities', () => {
95
+ const engine = createEngine();
96
+ setZoneProperty(engine.world, 'hall', 'noise', 5);
97
+ const inspection = inspectZone(engine.world, 'hall');
98
+ expect(inspection).not.toBeNull();
99
+ expect(inspection.name).toBe('Great Hall');
100
+ expect(inspection.dynamicProperties.noise).toBe(5);
101
+ expect(inspection.entities).toContain('guard_1');
102
+ expect(inspection.entities).toContain('player');
103
+ });
104
+ test('inspectAllZones returns all zones', () => {
105
+ const engine = createEngine();
106
+ const all = inspectAllZones(engine.world);
107
+ expect(Object.keys(all)).toContain('hall');
108
+ expect(Object.keys(all)).toContain('yard');
109
+ });
110
+ test('createSnapshot returns full simulation state', () => {
111
+ const engine = createEngine();
112
+ const snapshot = createSnapshot(engine.world);
113
+ expect(snapshot.tick).toBe(engine.world.meta.tick);
114
+ expect(snapshot.entities).toBeDefined();
115
+ expect(snapshot.factions).toBeDefined();
116
+ expect(snapshot.zones).toBeDefined();
117
+ expect(typeof snapshot.rumorCount).toBe('number');
118
+ expect(typeof snapshot.eventLogSize).toBe('number');
119
+ });
120
+ test('formatEntityInspection produces readable text', () => {
121
+ const engine = createEngine();
122
+ const cog = getCognition(engine.world, 'guard_1');
123
+ setBelief(cog, 'player', 'hostile', true, 0.8, 'observed', 0);
124
+ const inspection = inspectEntity(engine.world, 'guard_1');
125
+ const text = formatEntityInspection(inspection);
126
+ expect(text).toContain('Guard Captain');
127
+ expect(text).toContain('guard_1');
128
+ expect(text).toContain('hostile');
129
+ expect(text).toContain('castle-guard');
130
+ });
131
+ test('formatFactionInspection produces readable text', () => {
132
+ const engine = createEngine();
133
+ const factionCog = getFactionCognition(engine.world, 'castle-guard');
134
+ setFactionBelief(factionCog, 'player', 'hostile', true, 0.7, 'guard_1', 0);
135
+ const inspection = inspectFaction(engine.world, 'castle-guard');
136
+ const text = formatFactionInspection(inspection);
137
+ expect(text).toContain('castle-guard');
138
+ expect(text).toContain('guard_1');
139
+ expect(text).toContain('hostile');
140
+ });
141
+ test('debug inspectors are registered', () => {
142
+ const engine = createEngine();
143
+ const inspectors = engine.moduleManager.getInspectors();
144
+ const ids = inspectors.map(i => i.id);
145
+ expect(ids).toContain('entity-cognition');
146
+ expect(ids).toContain('faction-state');
147
+ expect(ids).toContain('environment-state');
148
+ expect(ids).toContain('rumor-trace');
149
+ expect(ids).toContain('simulation-snapshot');
150
+ });
151
+ });
152
+ //# sourceMappingURL=simulation-inspector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulation-inspector.test.js","sourceRoot":"","sources":["../src/simulation-inspector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { EngineModule, ResolvedEvent, EntityState } from '@ai-rpg-engine/core';
2
+ export declare const statusCore: EngineModule;
3
+ /** Apply a status to an entity. Returns the event to record. */
4
+ export declare function applyStatus(entity: EntityState, statusId: string, tick: number, options?: {
5
+ stacking?: 'replace' | 'stack' | 'refresh';
6
+ maxStacks?: number;
7
+ duration?: number;
8
+ sourceId?: string;
9
+ data?: Record<string, import('@ai-rpg-engine/core').ScalarValue>;
10
+ }): ResolvedEvent;
11
+ /** Remove a status from an entity. Returns the event to record. */
12
+ export declare function removeStatus(entity: EntityState, statusId: string, tick: number): ResolvedEvent | null;
13
+ /** Check if an entity has a specific status */
14
+ export declare function hasStatus(entity: EntityState, statusId: string): boolean;
15
+ /** Get status stacks for an entity */
16
+ export declare function getStatusStacks(entity: EntityState, statusId: string): number;
17
+ //# sourceMappingURL=status-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-core.d.ts","sourceRoot":"","sources":["../src/status-core.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAGb,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAG7B,eAAO,MAAM,UAAU,EAAE,YAUxB,CAAC;AAEF,gEAAgE;AAChE,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,qBAAqB,EAAE,WAAW,CAAC,CAAC;CAClE,GACA,aAAa,CAwDf;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,aAAa,GAAG,IAAI,CAOtB;AAED,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExE;AAED,sCAAsC;AACtC,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7E"}
@@ -0,0 +1,106 @@
1
+ // status-core — apply, remove, expire, stack statuses
2
+ import { nextId } from '@ai-rpg-engine/core';
3
+ export const statusCore = {
4
+ id: 'status-core',
5
+ version: '0.1.0',
6
+ register(ctx) {
7
+ // Tick-based expiration
8
+ ctx.events.on('action.resolved', (_event, world) => {
9
+ processExpirations(world, ctx);
10
+ });
11
+ },
12
+ };
13
+ /** Apply a status to an entity. Returns the event to record. */
14
+ export function applyStatus(entity, statusId, tick, options) {
15
+ const stacking = options?.stacking ?? 'replace';
16
+ const existing = entity.statuses.find(s => s.statusId === statusId);
17
+ if (existing) {
18
+ switch (stacking) {
19
+ case 'stack': {
20
+ const max = options?.maxStacks ?? 99;
21
+ if ((existing.stacks ?? 1) < max) {
22
+ existing.stacks = (existing.stacks ?? 1) + 1;
23
+ return makeStatusEvent('status.stacked', entity.id, statusId, tick, {
24
+ stacks: existing.stacks,
25
+ });
26
+ }
27
+ // At max stacks, just refresh
28
+ if (options?.duration) {
29
+ existing.expiresAtTick = tick + options.duration;
30
+ }
31
+ return makeStatusEvent('status.stacked', entity.id, statusId, tick, {
32
+ stacks: existing.stacks ?? 1,
33
+ atMax: true,
34
+ });
35
+ }
36
+ case 'refresh': {
37
+ if (options?.duration) {
38
+ existing.expiresAtTick = tick + options.duration;
39
+ }
40
+ return makeStatusEvent('status.applied', entity.id, statusId, tick, {
41
+ refreshed: true,
42
+ });
43
+ }
44
+ case 'replace':
45
+ default: {
46
+ // Remove old, add new
47
+ entity.statuses = entity.statuses.filter(s => s.statusId !== statusId);
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ const applied = {
53
+ id: nextId('status'),
54
+ statusId,
55
+ stacks: 1,
56
+ sourceId: options?.sourceId,
57
+ appliedAtTick: tick,
58
+ expiresAtTick: options?.duration ? tick + options.duration : undefined,
59
+ data: options?.data,
60
+ };
61
+ entity.statuses.push(applied);
62
+ return makeStatusEvent('status.applied', entity.id, statusId, tick, {
63
+ stacks: 1,
64
+ expiresAtTick: applied.expiresAtTick,
65
+ });
66
+ }
67
+ /** Remove a status from an entity. Returns the event to record. */
68
+ export function removeStatus(entity, statusId, tick) {
69
+ const idx = entity.statuses.findIndex(s => s.statusId === statusId);
70
+ if (idx === -1)
71
+ return null;
72
+ entity.statuses.splice(idx, 1);
73
+ return makeStatusEvent('status.removed', entity.id, statusId, tick, {});
74
+ }
75
+ /** Check if an entity has a specific status */
76
+ export function hasStatus(entity, statusId) {
77
+ return entity.statuses.some(s => s.statusId === statusId);
78
+ }
79
+ /** Get status stacks for an entity */
80
+ export function getStatusStacks(entity, statusId) {
81
+ return entity.statuses.find(s => s.statusId === statusId)?.stacks ?? 0;
82
+ }
83
+ function processExpirations(world, ctx) {
84
+ const tick = world.meta.tick;
85
+ for (const entity of Object.values(world.entities)) {
86
+ const expired = entity.statuses.filter(s => s.expiresAtTick !== undefined && s.expiresAtTick <= tick);
87
+ for (const status of expired) {
88
+ entity.statuses = entity.statuses.filter(s => s.id !== status.id);
89
+ const event = makeStatusEvent('status.expired', entity.id, status.statusId, tick, {
90
+ stacks: status.stacks,
91
+ });
92
+ ctx.events.emit(event);
93
+ }
94
+ }
95
+ }
96
+ function makeStatusEvent(type, entityId, statusId, tick, payload) {
97
+ return {
98
+ id: nextId('evt'),
99
+ tick,
100
+ type,
101
+ actorId: entityId,
102
+ payload: { statusId, ...payload },
103
+ tags: ['status'],
104
+ };
105
+ }
106
+ //# sourceMappingURL=status-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-core.js","sourceRoot":"","sources":["../src/status-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { EngineModule } from '@ai-rpg-engine/core';
2
+ export declare const traversalCore: EngineModule;
3
+ //# sourceMappingURL=traversal-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal-core.d.ts","sourceRoot":"","sources":["../src/traversal-core.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAA2C,MAAM,qBAAqB,CAAC;AAGjG,eAAO,MAAM,aAAa,EAAE,YAS3B,CAAC"}
@@ -0,0 +1,93 @@
1
+ // traversal-core — movement between zones
2
+ import { nextId } from '@ai-rpg-engine/core';
3
+ export const traversalCore = {
4
+ id: 'traversal-core',
5
+ version: '0.1.0',
6
+ register(ctx) {
7
+ ctx.actions.registerVerb('move', moveHandler);
8
+ ctx.actions.registerVerb('inspect', inspectHandler);
9
+ },
10
+ };
11
+ function moveHandler(action, world) {
12
+ const targetZoneId = action.targetIds?.[0];
13
+ if (!targetZoneId) {
14
+ return [makeEvent(action, 'action.rejected', { reason: 'no target zone specified' })];
15
+ }
16
+ const currentZone = world.zones[world.locationId];
17
+ if (!currentZone) {
18
+ return [makeEvent(action, 'action.rejected', { reason: 'current zone not found' })];
19
+ }
20
+ // Check adjacency
21
+ if (!currentZone.neighbors.includes(targetZoneId)) {
22
+ return [makeEvent(action, 'action.rejected', { reason: `cannot reach ${targetZoneId} from ${currentZone.id}` })];
23
+ }
24
+ const targetZone = world.zones[targetZoneId];
25
+ if (!targetZone) {
26
+ return [makeEvent(action, 'action.rejected', { reason: `zone ${targetZoneId} does not exist` })];
27
+ }
28
+ // Update location
29
+ world.locationId = targetZoneId;
30
+ const player = world.entities[world.playerId];
31
+ if (player) {
32
+ player.zoneId = targetZoneId;
33
+ }
34
+ return [
35
+ makeEvent(action, 'world.zone.entered', {
36
+ zoneId: targetZoneId,
37
+ zoneName: targetZone.name,
38
+ previousZoneId: currentZone.id,
39
+ tags: targetZone.tags,
40
+ }, {
41
+ presentation: {
42
+ channels: ['objective'],
43
+ priority: 'normal',
44
+ soundCues: ['scene.enter'],
45
+ },
46
+ }),
47
+ ];
48
+ }
49
+ function inspectHandler(action, world) {
50
+ const targetId = action.targetIds?.[0];
51
+ // Inspect current zone if no target
52
+ if (!targetId) {
53
+ const zone = world.zones[world.locationId];
54
+ if (!zone) {
55
+ return [makeEvent(action, 'action.rejected', { reason: 'no zone to inspect' })];
56
+ }
57
+ const entities = Object.values(world.entities).filter(e => e.zoneId === zone.id);
58
+ return [makeEvent(action, 'world.zone.inspected', {
59
+ zoneId: zone.id,
60
+ zoneName: zone.name,
61
+ tags: zone.tags,
62
+ entities: entities.map(e => ({ id: e.id, name: e.name, type: e.type, tags: e.tags })),
63
+ interactables: zone.interactables ?? [],
64
+ exits: zone.neighbors,
65
+ hazards: zone.hazards ?? [],
66
+ })];
67
+ }
68
+ // Inspect a specific entity
69
+ const entity = world.entities[targetId];
70
+ if (!entity) {
71
+ return [makeEvent(action, 'action.rejected', { reason: `nothing to inspect: ${targetId}` })];
72
+ }
73
+ return [makeEvent(action, 'world.entity.inspected', {
74
+ entityId: entity.id,
75
+ name: entity.name,
76
+ type: entity.type,
77
+ tags: entity.tags,
78
+ stats: entity.stats,
79
+ resources: entity.resources,
80
+ statuses: entity.statuses.map(s => s.statusId),
81
+ })];
82
+ }
83
+ function makeEvent(action, type, payload, extra) {
84
+ return {
85
+ id: nextId('evt'),
86
+ tick: action.issuedAtTick,
87
+ type,
88
+ actorId: action.actorId,
89
+ payload,
90
+ ...extra,
91
+ };
92
+ }
93
+ //# sourceMappingURL=traversal-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal-core.js","sourceRoot":"","sources":["../src/traversal-core.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@ai-rpg-engine/modules",
3
+ "version": "1.0.0",
4
+ "description": "AI RPG Engine built-in modules: combat, dialogue, inventory, traversal, status",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": ["dist"],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "test": "vitest run"
18
+ },
19
+ "dependencies": {
20
+ "@ai-rpg-engine/core": "*",
21
+ "@ai-rpg-engine/content-schema": "*"
22
+ },
23
+ "license": "MIT",
24
+ "author": "mcp-tool-shop",
25
+ "homepage": "https://mcp-tool-shop-org.github.io/ai-rpg-engine/",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/mcp-tool-shop-org/ai-rpg-engine.git",
29
+ "directory": "packages/modules"
30
+ },
31
+ "engines": {
32
+ "node": ">=20"
33
+ }
34
+ }