quake2ts 0.0.533 → 0.0.535

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.
@@ -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":"AAAA,OAAO,KAAK,EAEV,cAAc,EAEf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAiC,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAI9B,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAMD,OAAO,EAAE,WAAW,EAAwC,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAgC,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAM5D,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,iBAAiB,CAAC,EAAE,wBAAwB;IAC9F,UAAU,IAAI,IAAI,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,CAAC;IAClI,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACzF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACpF,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,kBAAkB,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5E,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,YAAY,CAAC;IACvF,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,SAAS,IAAI,mBAAmB,CAAC;IACjC,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC5C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnE,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC;IAC1C,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACjD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IAG7B,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,IAAI,CAAC;IAC9C,KAAK,EAAE,kBAAkB,CAAC;IAE1B,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAG3D,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAuD,MAAM,mBAAmB,CAAC;AAC7G,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAyB,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAIhG,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAI7D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,CAAC;AAI5B,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,EAC7B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,iBAAiB,GACzB,WAAW,CAsqBb"}
@@ -162,9 +162,38 @@ var createEntityStateFactory = (overrides) => ({
162
162
  ...overrides
163
163
  });
164
164
  var createGameStateSnapshotFactory = (overrides) => ({
165
- entities: [],
166
- playerState: createPlayerStateFactory(),
167
- timestamp: Date.now(),
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 { EntityState, PlayerState, Vec3, PmoveTraceFn } from '@quake2ts/shared';
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>) => 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 { type GameStateSnapshot, createBinaryStreamMock, createBinaryWriterMock, createEntity, createEntityStateFactory, createGameStateSnapshotFactory, createNetChanMock, createPlayerStateFactory, createSpawnContext, createTestContext, intersects, ladderTrace, stairTrace };
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 { EntityState, PlayerState, Vec3, PmoveTraceFn } from '@quake2ts/shared';
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>) => 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 { type GameStateSnapshot, createBinaryStreamMock, createBinaryWriterMock, createEntity, createEntityStateFactory, createGameStateSnapshotFactory, createNetChanMock, createPlayerStateFactory, createSpawnContext, createTestContext, intersects, ladderTrace, stairTrace };
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
- entities: [],
129
- playerState: createPlayerStateFactory(),
130
- timestamp: Date.now(),
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()