quake2ts 0.0.533 → 0.0.534
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/package.json +1 -1
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/browser/index.global.js +4 -4
- package/packages/game/dist/browser/index.global.js.map +1 -1
- package/packages/game/dist/cjs/index.cjs +2 -0
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +1 -0
- package/packages/game/dist/esm/index.js.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/types/index.d.ts +1 -0
- package/packages/game/dist/types/index.d.ts.map +1 -1
- package/packages/test-utils/dist/index.cjs +51 -11
- package/packages/test-utils/dist/index.cjs.map +1 -1
- package/packages/test-utils/dist/index.d.cts +4 -9
- package/packages/test-utils/dist/index.d.ts +4 -9
- package/packages/test-utils/dist/index.js +52 -12
- package/packages/test-utils/dist/index.js.map +1 -1
|
@@ -64,6 +64,7 @@ import { GameTraceResult } from './imports.js';
|
|
|
64
64
|
import { CustomEntityRegistration } from './mod.js';
|
|
65
65
|
export { CustomEntityRegistration, ModAPI } from './mod.js';
|
|
66
66
|
import { ScriptHookRegistry, ScriptHooks } from './scripting/hooks.js';
|
|
67
|
+
export { ScriptHookRegistry, ScriptHooks } from './scripting/hooks.js';
|
|
67
68
|
import { ModAPI } from './mod.js';
|
|
68
69
|
export interface GameExports extends GameSimulation<GameStateSnapshot>, CustomEntityRegistration {
|
|
69
70
|
spawnWorld(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -162,9 +162,38 @@ var createEntityStateFactory = (overrides) => ({
|
|
|
162
162
|
...overrides
|
|
163
163
|
});
|
|
164
164
|
var createGameStateSnapshotFactory = (overrides) => ({
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
165
|
+
// Simplified default mock matching the interface as best as possible for basic tests
|
|
166
|
+
gravity: { x: 0, y: 0, z: -800 },
|
|
167
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
168
|
+
velocity: { x: 0, y: 0, z: 0 },
|
|
169
|
+
viewangles: { x: 0, y: 0, z: 0 },
|
|
170
|
+
level: { timeSeconds: 0, frameNumber: 0, previousTimeSeconds: 0 },
|
|
171
|
+
entities: {
|
|
172
|
+
activeCount: 0,
|
|
173
|
+
worldClassname: "worldspawn"
|
|
174
|
+
},
|
|
175
|
+
packetEntities: [],
|
|
176
|
+
pmFlags: 0,
|
|
177
|
+
pmType: 0,
|
|
178
|
+
waterlevel: 0,
|
|
179
|
+
deltaAngles: { x: 0, y: 0, z: 0 },
|
|
180
|
+
health: 100,
|
|
181
|
+
armor: 0,
|
|
182
|
+
ammo: 0,
|
|
183
|
+
blend: [0, 0, 0, 0],
|
|
184
|
+
damageAlpha: 0,
|
|
185
|
+
damageIndicators: [],
|
|
186
|
+
stats: [],
|
|
187
|
+
kick_angles: { x: 0, y: 0, z: 0 },
|
|
188
|
+
kick_origin: { x: 0, y: 0, z: 0 },
|
|
189
|
+
gunoffset: { x: 0, y: 0, z: 0 },
|
|
190
|
+
gunangles: { x: 0, y: 0, z: 0 },
|
|
191
|
+
gunindex: 0,
|
|
192
|
+
pm_time: 0,
|
|
193
|
+
gun_frame: 0,
|
|
194
|
+
rdflags: 0,
|
|
195
|
+
fov: 90,
|
|
196
|
+
renderfx: 0,
|
|
168
197
|
...overrides
|
|
169
198
|
});
|
|
170
199
|
|
|
@@ -312,12 +341,12 @@ function createTestContext(options) {
|
|
|
312
341
|
allsolid: false,
|
|
313
342
|
startsolid: false,
|
|
314
343
|
endpos: end,
|
|
315
|
-
// Use end argument
|
|
316
344
|
plane: { normal: { x: 0, y: 0, z: 1 }, dist: 0 },
|
|
317
345
|
surfaceFlags: 0,
|
|
318
346
|
contents: 0
|
|
319
347
|
}));
|
|
320
348
|
const spawnRegistry = new import_game.SpawnRegistry();
|
|
349
|
+
const hooks = new import_game.ScriptHookRegistry();
|
|
321
350
|
const game = {
|
|
322
351
|
random: (0, import_shared.createRandomGenerator)({ seed }),
|
|
323
352
|
registerEntitySpawn: import_vitest2.vi.fn((classname, spawnFunc) => {
|
|
@@ -326,13 +355,25 @@ function createTestContext(options) {
|
|
|
326
355
|
unregisterEntitySpawn: import_vitest2.vi.fn((classname) => {
|
|
327
356
|
spawnRegistry.unregister(classname);
|
|
328
357
|
}),
|
|
329
|
-
getCustomEntities: import_vitest2.vi.fn(() => Array.from(spawnRegistry.keys()))
|
|
358
|
+
getCustomEntities: import_vitest2.vi.fn(() => Array.from(spawnRegistry.keys())),
|
|
359
|
+
hooks,
|
|
360
|
+
registerHooks: import_vitest2.vi.fn((newHooks) => hooks.register(newHooks)),
|
|
361
|
+
spawnWorld: import_vitest2.vi.fn(() => {
|
|
362
|
+
hooks.onMapLoad("q2dm1");
|
|
363
|
+
}),
|
|
364
|
+
clientBegin: import_vitest2.vi.fn(() => {
|
|
365
|
+
hooks.onPlayerSpawn({});
|
|
366
|
+
}),
|
|
367
|
+
damage: import_vitest2.vi.fn((amount) => {
|
|
368
|
+
hooks.onDamage({}, null, null, amount, 0, 0);
|
|
369
|
+
})
|
|
330
370
|
};
|
|
331
371
|
const entityList = options?.initialEntities ? [...options.initialEntities] : [];
|
|
332
372
|
const entities = {
|
|
333
373
|
spawn: import_vitest2.vi.fn(() => {
|
|
334
374
|
const ent = new import_game.Entity(entityList.length + 1);
|
|
335
375
|
entityList.push(ent);
|
|
376
|
+
hooks.onEntitySpawn(ent);
|
|
336
377
|
return ent;
|
|
337
378
|
}),
|
|
338
379
|
free: import_vitest2.vi.fn((ent) => {
|
|
@@ -340,6 +381,7 @@ function createTestContext(options) {
|
|
|
340
381
|
if (idx !== -1) {
|
|
341
382
|
entityList.splice(idx, 1);
|
|
342
383
|
}
|
|
384
|
+
hooks.onEntityRemove(ent);
|
|
343
385
|
}),
|
|
344
386
|
finalizeSpawn: import_vitest2.vi.fn(),
|
|
345
387
|
freeImmediate: import_vitest2.vi.fn((ent) => {
|
|
@@ -351,19 +393,16 @@ function createTestContext(options) {
|
|
|
351
393
|
setSpawnRegistry: import_vitest2.vi.fn(),
|
|
352
394
|
timeSeconds: 10,
|
|
353
395
|
deltaSeconds: 0.1,
|
|
354
|
-
// Added deltaSeconds
|
|
355
396
|
modelIndex: import_vitest2.vi.fn(() => 0),
|
|
356
397
|
scheduleThink: import_vitest2.vi.fn((entity, time) => {
|
|
357
398
|
entity.nextthink = time;
|
|
358
399
|
}),
|
|
359
400
|
linkentity: import_vitest2.vi.fn(),
|
|
360
401
|
trace: traceFn,
|
|
361
|
-
// Directly provide the mock function property
|
|
362
402
|
pointcontents: import_vitest2.vi.fn(() => 0),
|
|
363
403
|
multicast: import_vitest2.vi.fn(),
|
|
364
404
|
unicast: import_vitest2.vi.fn(),
|
|
365
405
|
engine,
|
|
366
|
-
// Attach mocked engine
|
|
367
406
|
game,
|
|
368
407
|
sound: import_vitest2.vi.fn((ent, chan, sound, vol, attn, timeofs) => {
|
|
369
408
|
engine.sound(ent, chan, sound, vol, attn, timeofs);
|
|
@@ -375,11 +414,9 @@ function createTestContext(options) {
|
|
|
375
414
|
pickTarget: import_vitest2.vi.fn(() => null),
|
|
376
415
|
killBox: import_vitest2.vi.fn(),
|
|
377
416
|
rng: (0, import_shared.createRandomGenerator)({ seed }),
|
|
378
|
-
// Use real RNG for determinism or easy mocking if we replace it
|
|
379
417
|
imports: {
|
|
380
418
|
configstring: import_vitest2.vi.fn(),
|
|
381
419
|
trace: traceFn,
|
|
382
|
-
// Also in imports for good measure
|
|
383
420
|
pointcontents: import_vitest2.vi.fn(() => 0)
|
|
384
421
|
},
|
|
385
422
|
level: {
|
|
@@ -393,6 +430,10 @@ function createTestContext(options) {
|
|
|
393
430
|
find: import_vitest2.vi.fn((predicate) => {
|
|
394
431
|
return entityList.find(predicate);
|
|
395
432
|
}),
|
|
433
|
+
// Helper to find by classname specifically (common pattern)
|
|
434
|
+
findByClassname: import_vitest2.vi.fn((classname) => {
|
|
435
|
+
return entityList.find((e) => e.classname === classname);
|
|
436
|
+
}),
|
|
396
437
|
beginFrame: import_vitest2.vi.fn((timeSeconds) => {
|
|
397
438
|
entities.timeSeconds = timeSeconds;
|
|
398
439
|
}),
|
|
@@ -410,7 +451,6 @@ function createTestContext(options) {
|
|
|
410
451
|
health_multiplier: 1,
|
|
411
452
|
warn: import_vitest2.vi.fn(),
|
|
412
453
|
free: import_vitest2.vi.fn(),
|
|
413
|
-
// Legacy support for tests that might check precache
|
|
414
454
|
precacheModel: import_vitest2.vi.fn(),
|
|
415
455
|
precacheSound: import_vitest2.vi.fn(),
|
|
416
456
|
precacheImage: import_vitest2.vi.fn()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/mocks.ts","../src/factories.ts","../src/helpers.ts"],"sourcesContent":["// Export all test utilities\nexport * from './mocks.js';\nexport * from './factories.js';\nexport * from './helpers.js';\n","import { vi } from 'vitest';\n\nexport const createBinaryWriterMock = () => ({\n writeByte: vi.fn(),\n writeShort: vi.fn(),\n writeLong: vi.fn(),\n writeString: vi.fn(),\n writeBytes: vi.fn(),\n getBuffer: vi.fn(() => new Uint8Array(0)),\n reset: vi.fn(),\n // Legacy methods (if any)\n writeInt8: vi.fn(),\n writeUint8: vi.fn(),\n writeInt16: vi.fn(),\n writeUint16: vi.fn(),\n writeInt32: vi.fn(),\n writeUint32: vi.fn(),\n writeFloat: vi.fn(),\n getData: vi.fn(() => new Uint8Array(0)),\n});\n\nexport const createNetChanMock = () => ({\n qport: 1234,\n\n // Sequencing\n incomingSequence: 0,\n outgoingSequence: 0,\n incomingAcknowledged: 0,\n\n // Reliable messaging\n incomingReliableAcknowledged: false,\n incomingReliableSequence: 0,\n outgoingReliableSequence: 0,\n reliableMessage: createBinaryWriterMock(),\n reliableLength: 0,\n\n // Fragmentation\n fragmentSendOffset: 0,\n fragmentBuffer: null,\n fragmentLength: 0,\n fragmentReceived: 0,\n\n // Timing\n lastReceived: 0,\n lastSent: 0,\n\n remoteAddress: { type: 'IP', port: 1234 },\n\n // Methods\n setup: vi.fn(),\n reset: vi.fn(),\n transmit: vi.fn(),\n process: vi.fn(),\n canSendReliable: vi.fn(() => true),\n writeReliableByte: vi.fn(),\n writeReliableShort: vi.fn(),\n writeReliableLong: vi.fn(),\n writeReliableString: vi.fn(),\n getReliableData: vi.fn(() => new Uint8Array(0)),\n needsKeepalive: vi.fn(() => false),\n isTimedOut: vi.fn(() => false),\n});\n\nexport const createBinaryStreamMock = () => ({\n getPosition: vi.fn(() => 0),\n getReadPosition: vi.fn(() => 0),\n getLength: vi.fn(() => 0),\n getRemaining: vi.fn(() => 0),\n seek: vi.fn(),\n setReadPosition: vi.fn(),\n hasMore: vi.fn(() => true),\n hasBytes: vi.fn(() => true),\n\n readChar: vi.fn(() => 0),\n readByte: vi.fn(() => 0),\n readShort: vi.fn(() => 0),\n readUShort: vi.fn(() => 0),\n readLong: vi.fn(() => 0),\n readULong: vi.fn(() => 0),\n readFloat: vi.fn(() => 0),\n\n readString: vi.fn(() => ''),\n readStringLine: vi.fn(() => ''),\n\n readCoord: vi.fn(() => 0),\n readAngle: vi.fn(() => 0),\n readAngle16: vi.fn(() => 0),\n\n readData: vi.fn(() => new Uint8Array(0)),\n\n readPos: vi.fn(),\n readDir: vi.fn(),\n});\n","import type { PlayerState, EntityState } from '@quake2ts/shared';\n\n// Define GameStateSnapshot locally if it's not exported or if we need a specific mock version\n// Assuming it matches the structure expected by the game/client\nexport interface GameStateSnapshot {\n entities: EntityState[];\n playerState: PlayerState;\n timestamp: number;\n}\n\nexport const createPlayerStateFactory = (overrides?: Partial<PlayerState>): PlayerState => ({\n pm_type: 0,\n pm_time: 0,\n pm_flags: 0,\n origin: { x: 0, y: 0, z: 0 },\n velocity: { x: 0, y: 0, z: 0 },\n viewAngles: { x: 0, y: 0, z: 0 },\n onGround: false,\n waterLevel: 0,\n mins: { x: 0, y: 0, z: 0 },\n maxs: { x: 0, y: 0, z: 0 },\n damageAlpha: 0,\n damageIndicators: [],\n blend: [0, 0, 0, 0],\n stats: [],\n kick_angles: { x: 0, y: 0, z: 0 },\n kick_origin: { x: 0, y: 0, z: 0 },\n gunoffset: { x: 0, y: 0, z: 0 },\n gunangles: { x: 0, y: 0, z: 0 },\n gunindex: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n ...overrides,\n});\n\nexport const createEntityStateFactory = (overrides?: Partial<EntityState>): EntityState => ({\n number: 0,\n origin: { x: 0, y: 0, z: 0 },\n angles: { x: 0, y: 0, z: 0 },\n oldOrigin: { x: 0, y: 0, z: 0 },\n modelIndex: 0,\n modelIndex2: 0,\n modelIndex3: 0,\n modelIndex4: 0,\n frame: 0,\n skinNum: 0,\n effects: 0,\n renderfx: 0,\n solid: 0,\n sound: 0,\n event: 0,\n ...overrides,\n});\n\nexport const createGameStateSnapshotFactory = (overrides?: Partial<GameStateSnapshot>): GameStateSnapshot => ({\n entities: [],\n playerState: createPlayerStateFactory(),\n timestamp: Date.now(),\n ...overrides,\n});\n","import { vi } from 'vitest';\nimport { Entity, SpawnRegistry, type SpawnContext, type EntitySystem } from '@quake2ts/game';\nimport { createRandomGenerator, type PmoveTraceFn, type PmoveTraceResult, type Vec3, CONTENTS_LADDER } from '@quake2ts/shared';\n\n// -- Shared Helpers --\n\nexport const intersects = (end: Vec3, maxs: Vec3, mins: Vec3, boxMins: Vec3, boxMaxs: Vec3): boolean => {\n return (\n end.x + maxs.x > boxMins.x &&\n end.x + mins.x < boxMaxs.x &&\n end.y + maxs.y > boxMins.y &&\n end.y + mins.y < boxMaxs.y &&\n end.z + maxs.z > boxMins.z &&\n end.z + mins.z < boxMaxs.z\n );\n};\n\nexport const stairTrace: PmoveTraceFn = (start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3): PmoveTraceResult => {\n // Default bbox if not provided\n const useMins = mins ?? { x: -16, y: -16, z: -24 };\n const useMaxs = maxs ?? { x: 16, y: 16, z: 32 };\n\n // Step: x from 0 forward, z from 0 to 8\n const STEP_HEIGHT = 8;\n const STEP_X_START = 0;\n\n const isHorizontal = Math.abs(end.z - start.z) < 1;\n const isMovingDown = end.z < start.z;\n\n // Check if trying to go below the floor\n const endMinZ = end.z + useMins.z;\n const startMinZ = start.z + useMins.z;\n const endMaxX = end.x + useMaxs.x;\n\n // If moving horizontally, check if we'd hit the vertical face of the step\n // The step only blocks if the player's origin is below the step height\n if (isHorizontal && end.z < STEP_HEIGHT && endMaxX > STEP_X_START) {\n // Check if we're crossing into the step area\n const startMaxX = start.x + useMaxs.x;\n if (startMaxX <= STEP_X_START) {\n // We're moving from before the step to past it, block\n return {\n allsolid: false,\n startsolid: false,\n fraction: 0,\n endpos: start,\n planeNormal: { x: -1, y: 0, z: 0 },\n contents: 1,\n };\n }\n }\n\n // If moving down and over the step area, land on the step surface\n if (isMovingDown && end.x >= STEP_X_START) {\n // The step surface is at z=STEP_HEIGHT in world space\n // The player's bbox bottom reaches this plane when origin.z + mins.z = STEP_HEIGHT\n // So the player's origin should be at z = STEP_HEIGHT - mins.z\n const landZ = STEP_HEIGHT - useMins.z;\n\n // Check if we'd pass through the step surface\n // We cross the plane if start is above it and end would be below it\n if (startMinZ > STEP_HEIGHT && endMinZ < STEP_HEIGHT) {\n // Calculate the fraction along the ray where we intersect the plane\n // The bbox bottom is at: start.z + useMins.z + t * (end.z - start.z + 0) = STEP_HEIGHT\n // Solving for t: t = (STEP_HEIGHT - (start.z + useMins.z)) / ((end.z + useMins.z) - (start.z + useMins.z))\n const fraction = (STEP_HEIGHT - startMinZ) / (endMinZ - startMinZ);\n\n // Clamp to valid range [0, 1]\n const clampedFraction = Math.max(0, Math.min(1, fraction));\n\n // Calculate the endpos along the ray at this fraction\n const finalX = start.x + clampedFraction * (end.x - start.x);\n const finalY = start.y + clampedFraction * (end.y - start.y);\n const finalZ = start.z + clampedFraction * (end.z - start.z);\n\n return {\n allsolid: false,\n startsolid: false,\n fraction: clampedFraction,\n endpos: { x: finalX, y: finalY, z: finalZ },\n planeNormal: { x: 0, y: 0, z: 1 },\n contents: 1,\n };\n }\n }\n\n // If moving down and would go below floor level, block at floor\n if (isMovingDown && endMinZ < 0) {\n // Floor is at z=0, so player origin should be at z = -mins.z when landing\n const landZ = -useMins.z;\n\n // Only apply if we're crossing the floor plane\n if (startMinZ >= 0) {\n // Calculate fraction where bbox bottom hits z=0\n const fraction = (0 - startMinZ) / (endMinZ - startMinZ);\n const clampedFraction = Math.max(0, Math.min(1, fraction));\n\n const finalX = start.x + clampedFraction * (end.x - start.x);\n const finalY = start.y + clampedFraction * (end.y - start.y);\n const finalZ = start.z + clampedFraction * (end.z - start.z);\n\n return {\n allsolid: false,\n startsolid: false,\n fraction: clampedFraction,\n endpos: { x: finalX, y: finalY, z: finalZ },\n planeNormal: { x: 0, y: 0, z: 1 },\n contents: 1,\n };\n }\n\n // Already below floor, block immediately\n return {\n allsolid: false,\n startsolid: false,\n fraction: 0,\n endpos: start,\n planeNormal: { x: 0, y: 0, z: 1 },\n contents: 1,\n };\n }\n\n // Free movement\n return {\n allsolid: false,\n startsolid: false,\n fraction: 1.0,\n endpos: end,\n contents: 0,\n };\n};\n\nexport const ladderTrace: PmoveTraceFn = (start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3): PmoveTraceResult => {\n // Default bbox if not provided\n const useMins = mins ?? { x: -16, y: -16, z: -24 };\n const useMaxs = maxs ?? { x: 16, y: 16, z: 32 };\n\n // Define the ladder volume (x=0 to x=8, y=-16 to y=16, z=0 to z=100)\n const LADDER_X_MIN = 0;\n const LADDER_X_MAX = 8;\n const LADDER_Y_MIN = -16;\n const LADDER_Y_MAX = 16;\n const LADDER_Z_MIN = 0;\n const LADDER_Z_MAX = 100;\n\n // Check if end position is within the ladder volume\n const endInLadder =\n end.x + useMins.x < LADDER_X_MAX &&\n end.x + useMaxs.x > LADDER_X_MIN &&\n end.y + useMins.y < LADDER_Y_MAX &&\n end.y + useMaxs.y > LADDER_Y_MIN &&\n end.z + useMins.z < LADDER_Z_MAX &&\n end.z + useMaxs.z > LADDER_Z_MIN;\n\n // If moving into the ladder from outside (moving forward into it)\n const movingIntoLadder = start.x < LADDER_X_MIN && end.x >= LADDER_X_MIN;\n\n // If moving horizontally into the ladder front face, block with ladder surface\n if (movingIntoLadder && Math.abs(end.z - start.z) < 0.1) {\n return {\n allsolid: false,\n startsolid: false,\n fraction: 0,\n endpos: start,\n planeNormal: { x: -1, y: 0, z: 0 },\n contents: CONTENTS_LADDER,\n };\n }\n\n // If we're in the ladder volume, return success but with CONTENTS_LADDER\n // This allows the player to detect they're on a ladder without blocking movement\n if (endInLadder) {\n return {\n allsolid: false,\n startsolid: false,\n fraction: 1.0,\n endpos: end,\n contents: CONTENTS_LADDER,\n };\n }\n\n // Floor at z=0\n if (end.z + useMins.z <= 0) {\n return {\n allsolid: false,\n startsolid: false,\n fraction: 0,\n endpos: start,\n planeNormal: { x: 0, y: 0, z: 1 },\n contents: 1,\n };\n }\n\n // No collision - free movement\n return {\n allsolid: false,\n startsolid: false,\n fraction: 1.0,\n endpos: end,\n contents: 0,\n };\n};\n\n// -- Game Helpers --\n\nexport function createTestContext(options?: { seed?: number, initialEntities?: Entity[] }): { entities: EntitySystem, game: any } & SpawnContext {\n const engine = {\n sound: vi.fn(),\n soundIndex: vi.fn((sound: string) => 0),\n modelIndex: vi.fn((model: string) => 0),\n centerprintf: vi.fn(),\n };\n\n const seed = options?.seed ?? 12345;\n const traceFn = vi.fn((start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3) => ({\n fraction: 1.0,\n ent: null,\n allsolid: false,\n startsolid: false,\n endpos: end, // Use end argument\n plane: { normal: { x: 0, y: 0, z: 1 }, dist: 0 },\n surfaceFlags: 0,\n contents: 0\n }));\n\n const spawnRegistry = new SpawnRegistry();\n\n const game = {\n random: createRandomGenerator({ seed }),\n registerEntitySpawn: vi.fn((classname: string, spawnFunc: (entity: Entity) => void) => {\n spawnRegistry.register(classname, (entity) => spawnFunc(entity));\n }),\n unregisterEntitySpawn: vi.fn((classname: string) => {\n spawnRegistry.unregister(classname);\n }),\n getCustomEntities: vi.fn(() => Array.from(spawnRegistry.keys()))\n };\n\n const entityList: Entity[] = options?.initialEntities ? [...options.initialEntities] : [];\n\n const entities = {\n spawn: vi.fn(() => {\n const ent = new Entity(entityList.length + 1);\n entityList.push(ent);\n return ent;\n }),\n free: vi.fn((ent: Entity) => {\n const idx = entityList.indexOf(ent);\n if (idx !== -1) {\n entityList.splice(idx, 1);\n }\n }),\n finalizeSpawn: vi.fn(),\n freeImmediate: vi.fn((ent: Entity) => {\n const idx = entityList.indexOf(ent);\n if (idx !== -1) {\n entityList.splice(idx, 1);\n }\n }),\n setSpawnRegistry: vi.fn(),\n timeSeconds: 10,\n deltaSeconds: 0.1, // Added deltaSeconds\n modelIndex: vi.fn(() => 0),\n scheduleThink: vi.fn((entity: Entity, time: number) => {\n entity.nextthink = time;\n }),\n linkentity: vi.fn(),\n trace: traceFn, // Directly provide the mock function property\n pointcontents: vi.fn(() => 0),\n multicast: vi.fn(),\n unicast: vi.fn(),\n engine, // Attach mocked engine\n game,\n sound: vi.fn((ent: Entity, chan: number, sound: string, vol: number, attn: number, timeofs: number) => {\n engine.sound(ent, chan, sound, vol, attn, timeofs);\n }),\n soundIndex: vi.fn((sound: string) => engine.soundIndex(sound)),\n useTargets: vi.fn((entity: Entity, activator: Entity | null) => {\n }),\n findByTargetName: vi.fn(() => []),\n pickTarget: vi.fn(() => null),\n killBox: vi.fn(),\n rng: createRandomGenerator({ seed }), // Use real RNG for determinism or easy mocking if we replace it\n imports: {\n configstring: vi.fn(),\n trace: traceFn, // Also in imports for good measure\n pointcontents: vi.fn(() => 0),\n },\n level: {\n intermission_angle: { x: 0, y: 0, z: 0 },\n intermission_origin: { x: 0, y: 0, z: 0 },\n },\n targetNameIndex: new Map(),\n forEachEntity: vi.fn((callback: (ent: Entity) => void) => {\n // Iterate over managed list\n entityList.forEach(callback);\n }),\n find: vi.fn((predicate: (ent: Entity) => boolean) => {\n // Find in managed list\n return entityList.find(predicate);\n }),\n beginFrame: vi.fn((timeSeconds: number) => {\n (entities as any).timeSeconds = timeSeconds;\n }),\n targetAwareness: {\n timeSeconds: 10,\n frameNumber: 1,\n sightEntity: null,\n soundEntity: null,\n }\n } as unknown as EntitySystem;\n\n return {\n keyValues: {},\n entities,\n game: game,\n health_multiplier: 1,\n warn: vi.fn(),\n free: vi.fn(),\n // Legacy support for tests that might check precache\n precacheModel: vi.fn(),\n precacheSound: vi.fn(),\n precacheImage: vi.fn(),\n } as unknown as SpawnContext & { entities: EntitySystem, game: any };\n}\n\nexport function createSpawnContext(): SpawnContext {\n return createTestContext();\n}\n\nexport function createEntity(): Entity {\n return new Entity(1);\n}\n"],"mappings":"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","names":["import_vitest"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/mocks.ts","../src/factories.ts","../src/helpers.ts"],"sourcesContent":["// Export all test utilities\nexport * from './mocks.js';\nexport * from './factories.js';\nexport * from './helpers.js';\n","import { vi } from 'vitest';\n\nexport const createBinaryWriterMock = () => ({\n writeByte: vi.fn(),\n writeShort: vi.fn(),\n writeLong: vi.fn(),\n writeString: vi.fn(),\n writeBytes: vi.fn(),\n getBuffer: vi.fn(() => new Uint8Array(0)),\n reset: vi.fn(),\n // Legacy methods (if any)\n writeInt8: vi.fn(),\n writeUint8: vi.fn(),\n writeInt16: vi.fn(),\n writeUint16: vi.fn(),\n writeInt32: vi.fn(),\n writeUint32: vi.fn(),\n writeFloat: vi.fn(),\n getData: vi.fn(() => new Uint8Array(0)),\n});\n\nexport const createNetChanMock = () => ({\n qport: 1234,\n\n // Sequencing\n incomingSequence: 0,\n outgoingSequence: 0,\n incomingAcknowledged: 0,\n\n // Reliable messaging\n incomingReliableAcknowledged: false,\n incomingReliableSequence: 0,\n outgoingReliableSequence: 0,\n reliableMessage: createBinaryWriterMock(),\n reliableLength: 0,\n\n // Fragmentation\n fragmentSendOffset: 0,\n fragmentBuffer: null,\n fragmentLength: 0,\n fragmentReceived: 0,\n\n // Timing\n lastReceived: 0,\n lastSent: 0,\n\n remoteAddress: { type: 'IP', port: 1234 },\n\n // Methods\n setup: vi.fn(),\n reset: vi.fn(),\n transmit: vi.fn(),\n process: vi.fn(),\n canSendReliable: vi.fn(() => true),\n writeReliableByte: vi.fn(),\n writeReliableShort: vi.fn(),\n writeReliableLong: vi.fn(),\n writeReliableString: vi.fn(),\n getReliableData: vi.fn(() => new Uint8Array(0)),\n needsKeepalive: vi.fn(() => false),\n isTimedOut: vi.fn(() => false),\n});\n\nexport const createBinaryStreamMock = () => ({\n getPosition: vi.fn(() => 0),\n getReadPosition: vi.fn(() => 0),\n getLength: vi.fn(() => 0),\n getRemaining: vi.fn(() => 0),\n seek: vi.fn(),\n setReadPosition: vi.fn(),\n hasMore: vi.fn(() => true),\n hasBytes: vi.fn(() => true),\n\n readChar: vi.fn(() => 0),\n readByte: vi.fn(() => 0),\n readShort: vi.fn(() => 0),\n readUShort: vi.fn(() => 0),\n readLong: vi.fn(() => 0),\n readULong: vi.fn(() => 0),\n readFloat: vi.fn(() => 0),\n\n readString: vi.fn(() => ''),\n readStringLine: vi.fn(() => ''),\n\n readCoord: vi.fn(() => 0),\n readAngle: vi.fn(() => 0),\n readAngle16: vi.fn(() => 0),\n\n readData: vi.fn(() => new Uint8Array(0)),\n\n readPos: vi.fn(),\n readDir: vi.fn(),\n});\n","import type { PlayerState, EntityState } from '@quake2ts/shared';\nimport type { GameStateSnapshot } from '@quake2ts/game';\n\nexport const createPlayerStateFactory = (overrides?: Partial<PlayerState>): PlayerState => ({\n pm_type: 0,\n pm_time: 0,\n pm_flags: 0,\n origin: { x: 0, y: 0, z: 0 },\n velocity: { x: 0, y: 0, z: 0 },\n viewAngles: { x: 0, y: 0, z: 0 },\n onGround: false,\n waterLevel: 0,\n mins: { x: 0, y: 0, z: 0 },\n maxs: { x: 0, y: 0, z: 0 },\n damageAlpha: 0,\n damageIndicators: [],\n blend: [0, 0, 0, 0],\n stats: [],\n kick_angles: { x: 0, y: 0, z: 0 },\n kick_origin: { x: 0, y: 0, z: 0 },\n gunoffset: { x: 0, y: 0, z: 0 },\n gunangles: { x: 0, y: 0, z: 0 },\n gunindex: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n ...overrides,\n});\n\nexport const createEntityStateFactory = (overrides?: Partial<EntityState>): EntityState => ({\n number: 0,\n origin: { x: 0, y: 0, z: 0 },\n angles: { x: 0, y: 0, z: 0 },\n oldOrigin: { x: 0, y: 0, z: 0 },\n modelIndex: 0,\n modelIndex2: 0,\n modelIndex3: 0,\n modelIndex4: 0,\n frame: 0,\n skinNum: 0,\n effects: 0,\n renderfx: 0,\n solid: 0,\n sound: 0,\n event: 0,\n ...overrides,\n});\n\n// Note: This factory might need updates if GameStateSnapshot structure changes significantly in @quake2ts/game\nexport const createGameStateSnapshotFactory = (overrides?: Partial<GameStateSnapshot>): any => ({\n // Simplified default mock matching the interface as best as possible for basic tests\n gravity: { x: 0, y: 0, z: -800 },\n origin: { x: 0, y: 0, z: 0 },\n velocity: { x: 0, y: 0, z: 0 },\n viewangles: { x: 0, y: 0, z: 0 },\n level: { timeSeconds: 0, frameNumber: 0, previousTimeSeconds: 0 },\n entities: {\n activeCount: 0,\n worldClassname: 'worldspawn',\n },\n packetEntities: [],\n pmFlags: 0,\n pmType: 0,\n waterlevel: 0,\n deltaAngles: { x: 0, y: 0, z: 0 },\n health: 100,\n armor: 0,\n ammo: 0,\n blend: [0, 0, 0, 0],\n damageAlpha: 0,\n damageIndicators: [],\n stats: [],\n kick_angles: { x: 0, y: 0, z: 0 },\n kick_origin: { x: 0, y: 0, z: 0 },\n gunoffset: { x: 0, y: 0, z: 0 },\n gunangles: { x: 0, y: 0, z: 0 },\n gunindex: 0,\n pm_time: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n ...overrides,\n});\n","import { vi } from 'vitest';\nimport { Entity, SpawnRegistry, ScriptHookRegistry, type SpawnContext, type EntitySystem } from '@quake2ts/game';\nimport { createRandomGenerator, type PmoveTraceFn, type PmoveTraceResult, type Vec3, CONTENTS_LADDER } from '@quake2ts/shared';\n\n// -- Shared Helpers --\n\nexport const intersects = (end: Vec3, maxs: Vec3, mins: Vec3, boxMins: Vec3, boxMaxs: Vec3): boolean => {\n return (\n end.x + maxs.x > boxMins.x &&\n end.x + mins.x < boxMaxs.x &&\n end.y + maxs.y > boxMins.y &&\n end.y + mins.y < boxMaxs.y &&\n end.z + maxs.z > boxMins.z &&\n end.z + mins.z < boxMaxs.z\n );\n};\n\nexport const stairTrace: PmoveTraceFn = (start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3): PmoveTraceResult => {\n // Default bbox if not provided\n const useMins = mins ?? { x: -16, y: -16, z: -24 };\n const useMaxs = maxs ?? { x: 16, y: 16, z: 32 };\n\n // Step: x from 0 forward, z from 0 to 8\n const STEP_HEIGHT = 8;\n const STEP_X_START = 0;\n\n const isHorizontal = Math.abs(end.z - start.z) < 1;\n const isMovingDown = end.z < start.z;\n\n // Check if trying to go below the floor\n const endMinZ = end.z + useMins.z;\n const startMinZ = start.z + useMins.z;\n const endMaxX = end.x + useMaxs.x;\n\n // If moving horizontally, check if we'd hit the vertical face of the step\n // The step only blocks if the player's origin is below the step height\n if (isHorizontal && end.z < STEP_HEIGHT && endMaxX > STEP_X_START) {\n // Check if we're crossing into the step area\n const startMaxX = start.x + useMaxs.x;\n if (startMaxX <= STEP_X_START) {\n // We're moving from before the step to past it, block\n return {\n allsolid: false,\n startsolid: false,\n fraction: 0,\n endpos: start,\n planeNormal: { x: -1, y: 0, z: 0 },\n contents: 1,\n };\n }\n }\n\n // If moving down and over the step area, land on the step surface\n if (isMovingDown && end.x >= STEP_X_START) {\n // The step surface is at z=STEP_HEIGHT in world space\n // The player's bbox bottom reaches this plane when origin.z + mins.z = STEP_HEIGHT\n // So the player's origin should be at z = STEP_HEIGHT - mins.z\n const landZ = STEP_HEIGHT - useMins.z;\n\n // Check if we'd pass through the step surface\n // We cross the plane if start is above it and end would be below it\n if (startMinZ > STEP_HEIGHT && endMinZ < STEP_HEIGHT) {\n // Calculate the fraction along the ray where we intersect the plane\n // The bbox bottom is at: start.z + useMins.z + t * (end.z - start.z + 0) = STEP_HEIGHT\n // Solving for t: t = (STEP_HEIGHT - (start.z + useMins.z)) / ((end.z + useMins.z) - (start.z + useMins.z))\n const fraction = (STEP_HEIGHT - startMinZ) / (endMinZ - startMinZ);\n\n // Clamp to valid range [0, 1]\n const clampedFraction = Math.max(0, Math.min(1, fraction));\n\n // Calculate the endpos along the ray at this fraction\n const finalX = start.x + clampedFraction * (end.x - start.x);\n const finalY = start.y + clampedFraction * (end.y - start.y);\n const finalZ = start.z + clampedFraction * (end.z - start.z);\n\n return {\n allsolid: false,\n startsolid: false,\n fraction: clampedFraction,\n endpos: { x: finalX, y: finalY, z: finalZ },\n planeNormal: { x: 0, y: 0, z: 1 },\n contents: 1,\n };\n }\n }\n\n // If moving down and would go below floor level, block at floor\n if (isMovingDown && endMinZ < 0) {\n // Floor is at z=0, so player origin should be at z = -mins.z when landing\n const landZ = -useMins.z;\n\n // Only apply if we're crossing the floor plane\n if (startMinZ >= 0) {\n // Calculate fraction where bbox bottom hits z=0\n const fraction = (0 - startMinZ) / (endMinZ - startMinZ);\n const clampedFraction = Math.max(0, Math.min(1, fraction));\n\n const finalX = start.x + clampedFraction * (end.x - start.x);\n const finalY = start.y + clampedFraction * (end.y - start.y);\n const finalZ = start.z + clampedFraction * (end.z - start.z);\n\n return {\n allsolid: false,\n startsolid: false,\n fraction: clampedFraction,\n endpos: { x: finalX, y: finalY, z: finalZ },\n planeNormal: { x: 0, y: 0, z: 1 },\n contents: 1,\n };\n }\n\n // Already below floor, block immediately\n return {\n allsolid: false,\n startsolid: false,\n fraction: 0,\n endpos: start,\n planeNormal: { x: 0, y: 0, z: 1 },\n contents: 1,\n };\n }\n\n // Free movement\n return {\n allsolid: false,\n startsolid: false,\n fraction: 1.0,\n endpos: end,\n contents: 0,\n };\n};\n\nexport const ladderTrace: PmoveTraceFn = (start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3): PmoveTraceResult => {\n // Default bbox if not provided\n const useMins = mins ?? { x: -16, y: -16, z: -24 };\n const useMaxs = maxs ?? { x: 16, y: 16, z: 32 };\n\n // Define the ladder volume (x=0 to x=8, y=-16 to y=16, z=0 to z=100)\n const LADDER_X_MIN = 0;\n const LADDER_X_MAX = 8;\n const LADDER_Y_MIN = -16;\n const LADDER_Y_MAX = 16;\n const LADDER_Z_MIN = 0;\n const LADDER_Z_MAX = 100;\n\n // Check if end position is within the ladder volume\n const endInLadder =\n end.x + useMins.x < LADDER_X_MAX &&\n end.x + useMaxs.x > LADDER_X_MIN &&\n end.y + useMins.y < LADDER_Y_MAX &&\n end.y + useMaxs.y > LADDER_Y_MIN &&\n end.z + useMins.z < LADDER_Z_MAX &&\n end.z + useMaxs.z > LADDER_Z_MIN;\n\n // If moving into the ladder from outside (moving forward into it)\n const movingIntoLadder = start.x < LADDER_X_MIN && end.x >= LADDER_X_MIN;\n\n // If moving horizontally into the ladder front face, block with ladder surface\n if (movingIntoLadder && Math.abs(end.z - start.z) < 0.1) {\n return {\n allsolid: false,\n startsolid: false,\n fraction: 0,\n endpos: start,\n planeNormal: { x: -1, y: 0, z: 0 },\n contents: CONTENTS_LADDER,\n };\n }\n\n // If we're in the ladder volume, return success but with CONTENTS_LADDER\n // This allows the player to detect they're on a ladder without blocking movement\n if (endInLadder) {\n return {\n allsolid: false,\n startsolid: false,\n fraction: 1.0,\n endpos: end,\n contents: CONTENTS_LADDER,\n };\n }\n\n // Floor at z=0\n if (end.z + useMins.z <= 0) {\n return {\n allsolid: false,\n startsolid: false,\n fraction: 0,\n endpos: start,\n planeNormal: { x: 0, y: 0, z: 1 },\n contents: 1,\n };\n }\n\n // No collision - free movement\n return {\n allsolid: false,\n startsolid: false,\n fraction: 1.0,\n endpos: end,\n contents: 0,\n };\n};\n\n// -- Game Helpers --\n\nexport function createTestContext(options?: { seed?: number, initialEntities?: Entity[] }): { entities: EntitySystem, game: any } & SpawnContext {\n const engine = {\n sound: vi.fn(),\n soundIndex: vi.fn((sound: string) => 0),\n modelIndex: vi.fn((model: string) => 0),\n centerprintf: vi.fn(),\n };\n\n const seed = options?.seed ?? 12345;\n const traceFn = vi.fn((start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3) => ({\n fraction: 1.0,\n ent: null,\n allsolid: false,\n startsolid: false,\n endpos: end,\n plane: { normal: { x: 0, y: 0, z: 1 }, dist: 0 },\n surfaceFlags: 0,\n contents: 0\n }));\n\n const spawnRegistry = new SpawnRegistry();\n const hooks = new ScriptHookRegistry();\n\n const game = {\n random: createRandomGenerator({ seed }),\n registerEntitySpawn: vi.fn((classname: string, spawnFunc: (entity: Entity) => void) => {\n spawnRegistry.register(classname, (entity) => spawnFunc(entity));\n }),\n unregisterEntitySpawn: vi.fn((classname: string) => {\n spawnRegistry.unregister(classname);\n }),\n getCustomEntities: vi.fn(() => Array.from(spawnRegistry.keys())),\n hooks,\n registerHooks: vi.fn((newHooks) => hooks.register(newHooks)),\n spawnWorld: vi.fn(() => {\n hooks.onMapLoad('q2dm1');\n }),\n clientBegin: vi.fn(() => {\n hooks.onPlayerSpawn({} as any);\n }),\n damage: vi.fn((amount: number) => {\n hooks.onDamage({} as any, null, null, amount, 0, 0);\n })\n };\n\n const entityList: Entity[] = options?.initialEntities ? [...options.initialEntities] : [];\n\n const entities = {\n spawn: vi.fn(() => {\n const ent = new Entity(entityList.length + 1);\n entityList.push(ent);\n hooks.onEntitySpawn(ent);\n return ent;\n }),\n free: vi.fn((ent: Entity) => {\n const idx = entityList.indexOf(ent);\n if (idx !== -1) {\n entityList.splice(idx, 1);\n }\n hooks.onEntityRemove(ent);\n }),\n finalizeSpawn: vi.fn(),\n freeImmediate: vi.fn((ent: Entity) => {\n const idx = entityList.indexOf(ent);\n if (idx !== -1) {\n entityList.splice(idx, 1);\n }\n }),\n setSpawnRegistry: vi.fn(),\n timeSeconds: 10,\n deltaSeconds: 0.1,\n modelIndex: vi.fn(() => 0),\n scheduleThink: vi.fn((entity: Entity, time: number) => {\n entity.nextthink = time;\n }),\n linkentity: vi.fn(),\n trace: traceFn,\n pointcontents: vi.fn(() => 0),\n multicast: vi.fn(),\n unicast: vi.fn(),\n engine,\n game,\n sound: vi.fn((ent: Entity, chan: number, sound: string, vol: number, attn: number, timeofs: number) => {\n engine.sound(ent, chan, sound, vol, attn, timeofs);\n }),\n soundIndex: vi.fn((sound: string) => engine.soundIndex(sound)),\n useTargets: vi.fn((entity: Entity, activator: Entity | null) => {\n }),\n findByTargetName: vi.fn(() => []),\n pickTarget: vi.fn(() => null),\n killBox: vi.fn(),\n rng: createRandomGenerator({ seed }),\n imports: {\n configstring: vi.fn(),\n trace: traceFn,\n pointcontents: vi.fn(() => 0),\n },\n level: {\n intermission_angle: { x: 0, y: 0, z: 0 },\n intermission_origin: { x: 0, y: 0, z: 0 },\n },\n targetNameIndex: new Map(),\n forEachEntity: vi.fn((callback: (ent: Entity) => void) => {\n // Iterate over managed list\n entityList.forEach(callback);\n }),\n find: vi.fn((predicate: (ent: Entity) => boolean) => {\n return entityList.find(predicate);\n }),\n // Helper to find by classname specifically (common pattern)\n findByClassname: vi.fn((classname: string) => {\n return entityList.find(e => e.classname === classname);\n }),\n beginFrame: vi.fn((timeSeconds: number) => {\n (entities as any).timeSeconds = timeSeconds;\n }),\n targetAwareness: {\n timeSeconds: 10,\n frameNumber: 1,\n sightEntity: null,\n soundEntity: null,\n }\n } as unknown as EntitySystem;\n\n return {\n keyValues: {},\n entities,\n game: game,\n health_multiplier: 1,\n warn: vi.fn(),\n free: vi.fn(),\n precacheModel: vi.fn(),\n precacheSound: vi.fn(),\n precacheImage: vi.fn(),\n } as unknown as SpawnContext & { entities: EntitySystem, game: any };\n}\n\nexport function createSpawnContext(): SpawnContext {\n return createTestContext();\n}\n\nexport function createEntity(): Entity {\n return new Entity(1);\n}\n"],"mappings":"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","names":["import_vitest"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as vitest from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
import { Entity, EntitySystem, SpawnContext } from '@quake2ts/game';
|
|
2
|
+
import { PlayerState, EntityState, Vec3, PmoveTraceFn } from '@quake2ts/shared';
|
|
3
|
+
import { GameStateSnapshot, Entity, EntitySystem, SpawnContext } from '@quake2ts/game';
|
|
4
4
|
|
|
5
5
|
declare const createBinaryWriterMock: () => {
|
|
6
6
|
writeByte: vitest.Mock<any, any>;
|
|
@@ -94,14 +94,9 @@ declare const createBinaryStreamMock: () => {
|
|
|
94
94
|
readDir: vitest.Mock<any, any>;
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
-
interface GameStateSnapshot {
|
|
98
|
-
entities: EntityState[];
|
|
99
|
-
playerState: PlayerState;
|
|
100
|
-
timestamp: number;
|
|
101
|
-
}
|
|
102
97
|
declare const createPlayerStateFactory: (overrides?: Partial<PlayerState>) => PlayerState;
|
|
103
98
|
declare const createEntityStateFactory: (overrides?: Partial<EntityState>) => EntityState;
|
|
104
|
-
declare const createGameStateSnapshotFactory: (overrides?: Partial<GameStateSnapshot>) =>
|
|
99
|
+
declare const createGameStateSnapshotFactory: (overrides?: Partial<GameStateSnapshot>) => any;
|
|
105
100
|
|
|
106
101
|
declare const intersects: (end: Vec3, maxs: Vec3, mins: Vec3, boxMins: Vec3, boxMaxs: Vec3) => boolean;
|
|
107
102
|
declare const stairTrace: PmoveTraceFn;
|
|
@@ -116,4 +111,4 @@ declare function createTestContext(options?: {
|
|
|
116
111
|
declare function createSpawnContext(): SpawnContext;
|
|
117
112
|
declare function createEntity(): Entity;
|
|
118
113
|
|
|
119
|
-
export {
|
|
114
|
+
export { createBinaryStreamMock, createBinaryWriterMock, createEntity, createEntityStateFactory, createGameStateSnapshotFactory, createNetChanMock, createPlayerStateFactory, createSpawnContext, createTestContext, intersects, ladderTrace, stairTrace };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as vitest from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
import { Entity, EntitySystem, SpawnContext } from '@quake2ts/game';
|
|
2
|
+
import { PlayerState, EntityState, Vec3, PmoveTraceFn } from '@quake2ts/shared';
|
|
3
|
+
import { GameStateSnapshot, Entity, EntitySystem, SpawnContext } from '@quake2ts/game';
|
|
4
4
|
|
|
5
5
|
declare const createBinaryWriterMock: () => {
|
|
6
6
|
writeByte: vitest.Mock<any, any>;
|
|
@@ -94,14 +94,9 @@ declare const createBinaryStreamMock: () => {
|
|
|
94
94
|
readDir: vitest.Mock<any, any>;
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
-
interface GameStateSnapshot {
|
|
98
|
-
entities: EntityState[];
|
|
99
|
-
playerState: PlayerState;
|
|
100
|
-
timestamp: number;
|
|
101
|
-
}
|
|
102
97
|
declare const createPlayerStateFactory: (overrides?: Partial<PlayerState>) => PlayerState;
|
|
103
98
|
declare const createEntityStateFactory: (overrides?: Partial<EntityState>) => EntityState;
|
|
104
|
-
declare const createGameStateSnapshotFactory: (overrides?: Partial<GameStateSnapshot>) =>
|
|
99
|
+
declare const createGameStateSnapshotFactory: (overrides?: Partial<GameStateSnapshot>) => any;
|
|
105
100
|
|
|
106
101
|
declare const intersects: (end: Vec3, maxs: Vec3, mins: Vec3, boxMins: Vec3, boxMaxs: Vec3) => boolean;
|
|
107
102
|
declare const stairTrace: PmoveTraceFn;
|
|
@@ -116,4 +111,4 @@ declare function createTestContext(options?: {
|
|
|
116
111
|
declare function createSpawnContext(): SpawnContext;
|
|
117
112
|
declare function createEntity(): Entity;
|
|
118
113
|
|
|
119
|
-
export {
|
|
114
|
+
export { createBinaryStreamMock, createBinaryWriterMock, createEntity, createEntityStateFactory, createGameStateSnapshotFactory, createNetChanMock, createPlayerStateFactory, createSpawnContext, createTestContext, intersects, ladderTrace, stairTrace };
|
|
@@ -125,15 +125,44 @@ var createEntityStateFactory = (overrides) => ({
|
|
|
125
125
|
...overrides
|
|
126
126
|
});
|
|
127
127
|
var createGameStateSnapshotFactory = (overrides) => ({
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
// Simplified default mock matching the interface as best as possible for basic tests
|
|
129
|
+
gravity: { x: 0, y: 0, z: -800 },
|
|
130
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
131
|
+
velocity: { x: 0, y: 0, z: 0 },
|
|
132
|
+
viewangles: { x: 0, y: 0, z: 0 },
|
|
133
|
+
level: { timeSeconds: 0, frameNumber: 0, previousTimeSeconds: 0 },
|
|
134
|
+
entities: {
|
|
135
|
+
activeCount: 0,
|
|
136
|
+
worldClassname: "worldspawn"
|
|
137
|
+
},
|
|
138
|
+
packetEntities: [],
|
|
139
|
+
pmFlags: 0,
|
|
140
|
+
pmType: 0,
|
|
141
|
+
waterlevel: 0,
|
|
142
|
+
deltaAngles: { x: 0, y: 0, z: 0 },
|
|
143
|
+
health: 100,
|
|
144
|
+
armor: 0,
|
|
145
|
+
ammo: 0,
|
|
146
|
+
blend: [0, 0, 0, 0],
|
|
147
|
+
damageAlpha: 0,
|
|
148
|
+
damageIndicators: [],
|
|
149
|
+
stats: [],
|
|
150
|
+
kick_angles: { x: 0, y: 0, z: 0 },
|
|
151
|
+
kick_origin: { x: 0, y: 0, z: 0 },
|
|
152
|
+
gunoffset: { x: 0, y: 0, z: 0 },
|
|
153
|
+
gunangles: { x: 0, y: 0, z: 0 },
|
|
154
|
+
gunindex: 0,
|
|
155
|
+
pm_time: 0,
|
|
156
|
+
gun_frame: 0,
|
|
157
|
+
rdflags: 0,
|
|
158
|
+
fov: 90,
|
|
159
|
+
renderfx: 0,
|
|
131
160
|
...overrides
|
|
132
161
|
});
|
|
133
162
|
|
|
134
163
|
// src/helpers.ts
|
|
135
164
|
import { vi as vi2 } from "vitest";
|
|
136
|
-
import { Entity, SpawnRegistry } from "@quake2ts/game";
|
|
165
|
+
import { Entity, SpawnRegistry, ScriptHookRegistry } from "@quake2ts/game";
|
|
137
166
|
import { createRandomGenerator, CONTENTS_LADDER } from "@quake2ts/shared";
|
|
138
167
|
var intersects = (end, maxs, mins, boxMins, boxMaxs) => {
|
|
139
168
|
return end.x + maxs.x > boxMins.x && end.x + mins.x < boxMaxs.x && end.y + maxs.y > boxMins.y && end.y + mins.y < boxMaxs.y && end.z + maxs.z > boxMins.z && end.z + mins.z < boxMaxs.z;
|
|
@@ -275,12 +304,12 @@ function createTestContext(options) {
|
|
|
275
304
|
allsolid: false,
|
|
276
305
|
startsolid: false,
|
|
277
306
|
endpos: end,
|
|
278
|
-
// Use end argument
|
|
279
307
|
plane: { normal: { x: 0, y: 0, z: 1 }, dist: 0 },
|
|
280
308
|
surfaceFlags: 0,
|
|
281
309
|
contents: 0
|
|
282
310
|
}));
|
|
283
311
|
const spawnRegistry = new SpawnRegistry();
|
|
312
|
+
const hooks = new ScriptHookRegistry();
|
|
284
313
|
const game = {
|
|
285
314
|
random: createRandomGenerator({ seed }),
|
|
286
315
|
registerEntitySpawn: vi2.fn((classname, spawnFunc) => {
|
|
@@ -289,13 +318,25 @@ function createTestContext(options) {
|
|
|
289
318
|
unregisterEntitySpawn: vi2.fn((classname) => {
|
|
290
319
|
spawnRegistry.unregister(classname);
|
|
291
320
|
}),
|
|
292
|
-
getCustomEntities: vi2.fn(() => Array.from(spawnRegistry.keys()))
|
|
321
|
+
getCustomEntities: vi2.fn(() => Array.from(spawnRegistry.keys())),
|
|
322
|
+
hooks,
|
|
323
|
+
registerHooks: vi2.fn((newHooks) => hooks.register(newHooks)),
|
|
324
|
+
spawnWorld: vi2.fn(() => {
|
|
325
|
+
hooks.onMapLoad("q2dm1");
|
|
326
|
+
}),
|
|
327
|
+
clientBegin: vi2.fn(() => {
|
|
328
|
+
hooks.onPlayerSpawn({});
|
|
329
|
+
}),
|
|
330
|
+
damage: vi2.fn((amount) => {
|
|
331
|
+
hooks.onDamage({}, null, null, amount, 0, 0);
|
|
332
|
+
})
|
|
293
333
|
};
|
|
294
334
|
const entityList = options?.initialEntities ? [...options.initialEntities] : [];
|
|
295
335
|
const entities = {
|
|
296
336
|
spawn: vi2.fn(() => {
|
|
297
337
|
const ent = new Entity(entityList.length + 1);
|
|
298
338
|
entityList.push(ent);
|
|
339
|
+
hooks.onEntitySpawn(ent);
|
|
299
340
|
return ent;
|
|
300
341
|
}),
|
|
301
342
|
free: vi2.fn((ent) => {
|
|
@@ -303,6 +344,7 @@ function createTestContext(options) {
|
|
|
303
344
|
if (idx !== -1) {
|
|
304
345
|
entityList.splice(idx, 1);
|
|
305
346
|
}
|
|
347
|
+
hooks.onEntityRemove(ent);
|
|
306
348
|
}),
|
|
307
349
|
finalizeSpawn: vi2.fn(),
|
|
308
350
|
freeImmediate: vi2.fn((ent) => {
|
|
@@ -314,19 +356,16 @@ function createTestContext(options) {
|
|
|
314
356
|
setSpawnRegistry: vi2.fn(),
|
|
315
357
|
timeSeconds: 10,
|
|
316
358
|
deltaSeconds: 0.1,
|
|
317
|
-
// Added deltaSeconds
|
|
318
359
|
modelIndex: vi2.fn(() => 0),
|
|
319
360
|
scheduleThink: vi2.fn((entity, time) => {
|
|
320
361
|
entity.nextthink = time;
|
|
321
362
|
}),
|
|
322
363
|
linkentity: vi2.fn(),
|
|
323
364
|
trace: traceFn,
|
|
324
|
-
// Directly provide the mock function property
|
|
325
365
|
pointcontents: vi2.fn(() => 0),
|
|
326
366
|
multicast: vi2.fn(),
|
|
327
367
|
unicast: vi2.fn(),
|
|
328
368
|
engine,
|
|
329
|
-
// Attach mocked engine
|
|
330
369
|
game,
|
|
331
370
|
sound: vi2.fn((ent, chan, sound, vol, attn, timeofs) => {
|
|
332
371
|
engine.sound(ent, chan, sound, vol, attn, timeofs);
|
|
@@ -338,11 +377,9 @@ function createTestContext(options) {
|
|
|
338
377
|
pickTarget: vi2.fn(() => null),
|
|
339
378
|
killBox: vi2.fn(),
|
|
340
379
|
rng: createRandomGenerator({ seed }),
|
|
341
|
-
// Use real RNG for determinism or easy mocking if we replace it
|
|
342
380
|
imports: {
|
|
343
381
|
configstring: vi2.fn(),
|
|
344
382
|
trace: traceFn,
|
|
345
|
-
// Also in imports for good measure
|
|
346
383
|
pointcontents: vi2.fn(() => 0)
|
|
347
384
|
},
|
|
348
385
|
level: {
|
|
@@ -356,6 +393,10 @@ function createTestContext(options) {
|
|
|
356
393
|
find: vi2.fn((predicate) => {
|
|
357
394
|
return entityList.find(predicate);
|
|
358
395
|
}),
|
|
396
|
+
// Helper to find by classname specifically (common pattern)
|
|
397
|
+
findByClassname: vi2.fn((classname) => {
|
|
398
|
+
return entityList.find((e) => e.classname === classname);
|
|
399
|
+
}),
|
|
359
400
|
beginFrame: vi2.fn((timeSeconds) => {
|
|
360
401
|
entities.timeSeconds = timeSeconds;
|
|
361
402
|
}),
|
|
@@ -373,7 +414,6 @@ function createTestContext(options) {
|
|
|
373
414
|
health_multiplier: 1,
|
|
374
415
|
warn: vi2.fn(),
|
|
375
416
|
free: vi2.fn(),
|
|
376
|
-
// Legacy support for tests that might check precache
|
|
377
417
|
precacheModel: vi2.fn(),
|
|
378
418
|
precacheSound: vi2.fn(),
|
|
379
419
|
precacheImage: vi2.fn()
|