@sharpee/world-model 0.9.113 → 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.
- package/entities/entity-types.d.ts +2 -0
- package/entities/entity-types.d.ts.map +1 -1
- package/entities/entity-types.js +3 -0
- package/entities/entity-types.js.map +1 -1
- package/entities/index.d.ts +2 -0
- package/entities/index.d.ts.map +1 -1
- package/entities/index.js +3 -1
- package/entities/index.js.map +1 -1
- package/entities/wall-entity.d.ts +112 -0
- package/entities/wall-entity.d.ts.map +1 -0
- package/entities/wall-entity.js +50 -0
- package/entities/wall-entity.js.map +1 -0
- package/index.d.ts +3 -0
- package/index.d.ts.map +1 -1
- package/index.js +3 -0
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/traits/acoustic/acousticDampenerTrait.d.ts +61 -0
- package/traits/acoustic/acousticDampenerTrait.d.ts.map +1 -0
- package/traits/acoustic/acousticDampenerTrait.js +38 -0
- package/traits/acoustic/acousticDampenerTrait.js.map +1 -0
- package/traits/acoustic/acousticTrait.d.ts +64 -0
- package/traits/acoustic/acousticTrait.d.ts.map +1 -0
- package/traits/acoustic/acousticTrait.js +47 -0
- package/traits/acoustic/acousticTrait.js.map +1 -0
- package/traits/acoustic/index.d.ts +3 -0
- package/traits/acoustic/index.d.ts.map +1 -0
- package/traits/acoustic/index.js +10 -0
- package/traits/acoustic/index.js.map +1 -0
- package/traits/implementations.d.ts.map +1 -1
- package/traits/implementations.js +8 -0
- package/traits/implementations.js.map +1 -1
- package/traits/index.d.ts +3 -0
- package/traits/index.d.ts.map +1 -1
- package/traits/index.js +5 -0
- package/traits/index.js.map +1 -1
- package/traits/listener/index.d.ts +2 -0
- package/traits/listener/index.d.ts.map +1 -0
- package/traits/listener/index.js +7 -0
- package/traits/listener/index.js.map +1 -0
- package/traits/listener/listenerTrait.d.ts +40 -0
- package/traits/listener/listenerTrait.d.ts.map +1 -0
- package/traits/listener/listenerTrait.js +23 -0
- package/traits/listener/listenerTrait.js.map +1 -0
- package/traits/obstructor-protocol.d.ts +96 -0
- package/traits/obstructor-protocol.d.ts.map +1 -0
- package/traits/obstructor-protocol.js +77 -0
- package/traits/obstructor-protocol.js.map +1 -0
- package/traits/room/roomTrait.d.ts +7 -0
- package/traits/room/roomTrait.d.ts.map +1 -1
- package/traits/room/roomTrait.js +2 -0
- package/traits/room/roomTrait.js.map +1 -1
- package/traits/story-info/storyInfoTrait.d.ts +6 -0
- package/traits/story-info/storyInfoTrait.d.ts.map +1 -1
- package/traits/story-info/storyInfoTrait.js +6 -0
- package/traits/story-info/storyInfoTrait.js.map +1 -1
- package/traits/trait-types.d.ts +3 -0
- package/traits/trait-types.d.ts.map +1 -1
- package/traits/trait-types.js +8 -0
- package/traits/trait-types.js.map +1 -1
- package/world/AuthorModel.d.ts +3 -0
- package/world/AuthorModel.d.ts.map +1 -1
- package/world/AuthorModel.js +7 -0
- package/world/AuthorModel.js.map +1 -1
- package/world/WorldModel.d.ts +23 -0
- package/world/WorldModel.d.ts.map +1 -1
- package/world/WorldModel.js +36 -0
- package/world/WorldModel.js.map +1 -1
- package/world/index.d.ts +4 -0
- package/world/index.d.ts.map +1 -1
- package/world/index.js +7 -1
- package/world/index.js.map +1 -1
- package/world/wall-creation.d.ts +38 -0
- package/world/wall-creation.d.ts.map +1 -0
- package/world/wall-creation.js +98 -0
- package/world/wall-creation.js.map +1 -0
- package/world/wall-validation.d.ts +45 -0
- package/world/wall-validation.d.ts.map +1 -0
- package/world/wall-validation.js +98 -0
- package/world/wall-validation.js.map +1 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// packages/world-model/src/world/wall-validation.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.validateWallSpec = validateWallSpec;
|
|
5
|
+
const trait_types_1 = require("../traits/trait-types");
|
|
6
|
+
/**
|
|
7
|
+
* Resolves an `IFEntity | EntityId` reference to its id string.
|
|
8
|
+
*/
|
|
9
|
+
function refToId(ref) {
|
|
10
|
+
return typeof ref === 'string' ? ref : ref.id;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Validates a wall specification before mutation.
|
|
14
|
+
*
|
|
15
|
+
* @param spec - The author-supplied wall specification.
|
|
16
|
+
* @param world - Read-only view of the world for entity/location lookups.
|
|
17
|
+
* @throws Error if cardinality, adjective presence, per-room adjective
|
|
18
|
+
* uniqueness, or `obstructedBy` resolution fails. The first failure
|
|
19
|
+
* detected aborts validation; no partial state escapes.
|
|
20
|
+
*/
|
|
21
|
+
function validateWallSpec(spec, world) {
|
|
22
|
+
if (!Array.isArray(spec.between)) {
|
|
23
|
+
throw new Error('createWall: `between` must be a tuple of exactly two rooms');
|
|
24
|
+
}
|
|
25
|
+
if (spec.between.length !== 2) {
|
|
26
|
+
throw new Error(`createWall: \`between\` must contain exactly 2 rooms (got ${spec.between.length})`);
|
|
27
|
+
}
|
|
28
|
+
const roomAId = refToId(spec.between[0]);
|
|
29
|
+
const roomBId = refToId(spec.between[1]);
|
|
30
|
+
if (roomAId === roomBId) {
|
|
31
|
+
throw new Error(`createWall: \`between\` must reference two distinct rooms (got self-reference '${roomAId}')`);
|
|
32
|
+
}
|
|
33
|
+
const roomA = world.getEntity(roomAId);
|
|
34
|
+
if (!roomA) {
|
|
35
|
+
throw new Error(`createWall: room '${roomAId}' does not exist`);
|
|
36
|
+
}
|
|
37
|
+
const roomB = world.getEntity(roomBId);
|
|
38
|
+
if (!roomB) {
|
|
39
|
+
throw new Error(`createWall: room '${roomBId}' does not exist`);
|
|
40
|
+
}
|
|
41
|
+
const roomATrait = roomA.get(trait_types_1.TraitType.ROOM);
|
|
42
|
+
if (!roomATrait) {
|
|
43
|
+
throw new Error(`createWall: entity '${roomAId}' is not a room`);
|
|
44
|
+
}
|
|
45
|
+
const roomBTrait = roomB.get(trait_types_1.TraitType.ROOM);
|
|
46
|
+
if (!roomBTrait) {
|
|
47
|
+
throw new Error(`createWall: entity '${roomBId}' is not a room`);
|
|
48
|
+
}
|
|
49
|
+
if (!spec.sides || typeof spec.sides !== 'object') {
|
|
50
|
+
throw new Error('createWall: `sides` must be a record keyed by room id');
|
|
51
|
+
}
|
|
52
|
+
const sideA = spec.sides[roomAId];
|
|
53
|
+
const sideB = spec.sides[roomBId];
|
|
54
|
+
validateSide(roomAId, sideA);
|
|
55
|
+
validateSide(roomBId, sideB);
|
|
56
|
+
validateAdjectiveUniqueness(roomAId, sideA.adjective, roomATrait, world);
|
|
57
|
+
validateAdjectiveUniqueness(roomBId, sideB.adjective, roomBTrait, world);
|
|
58
|
+
validateObstructor(roomAId, sideA, world);
|
|
59
|
+
validateObstructor(roomBId, sideB, world);
|
|
60
|
+
return { roomAId, roomBId, roomA, roomB };
|
|
61
|
+
}
|
|
62
|
+
function validateSide(roomId, side) {
|
|
63
|
+
if (!side) {
|
|
64
|
+
throw new Error(`createWall: missing per-side data for room '${roomId}'`);
|
|
65
|
+
}
|
|
66
|
+
if (typeof side.adjective !== 'string') {
|
|
67
|
+
throw new Error(`createWall: side for room '${roomId}' is missing a string \`adjective\``);
|
|
68
|
+
}
|
|
69
|
+
if (side.adjective.trim().length === 0) {
|
|
70
|
+
throw new Error(`createWall: side for room '${roomId}' has an empty \`adjective\``);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function validateAdjectiveUniqueness(roomId, adjective, roomTrait, world) {
|
|
74
|
+
const existingWallIds = roomTrait.walls ?? [];
|
|
75
|
+
for (const existingWallId of existingWallIds) {
|
|
76
|
+
const existing = world.getEntity(existingWallId);
|
|
77
|
+
if (!existing)
|
|
78
|
+
continue;
|
|
79
|
+
const sides = existing.sides;
|
|
80
|
+
const existingSide = sides?.get(roomId);
|
|
81
|
+
if (existingSide && existingSide.adjective === adjective) {
|
|
82
|
+
throw new Error(`createWall: adjective '${adjective}' is already used by another wall in room '${roomId}'`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function validateObstructor(roomId, side, world) {
|
|
87
|
+
if (side.obstructedBy === undefined)
|
|
88
|
+
return;
|
|
89
|
+
const obstructor = world.getEntity(side.obstructedBy);
|
|
90
|
+
if (!obstructor) {
|
|
91
|
+
throw new Error(`createWall: \`obstructedBy\` references nonexistent entity '${side.obstructedBy}' for room '${roomId}'`);
|
|
92
|
+
}
|
|
93
|
+
const obstructorLocation = world.getLocation(side.obstructedBy);
|
|
94
|
+
if (obstructorLocation !== roomId) {
|
|
95
|
+
throw new Error(`createWall: \`obstructedBy\` entity '${side.obstructedBy}' must be located in room '${roomId}' (currently in '${obstructorLocation ?? 'no location'}')`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=wall-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wall-validation.js","sourceRoot":"","sources":["../../../../../../../repos/sharpee/packages/world-model/src/world/wall-validation.ts"],"names":[],"mappings":"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"}
|