quake2ts 0.0.567 → 0.0.569

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.
@@ -150,6 +150,13 @@ function makeBrushFromMinsMaxs(mins, maxs, contents = CONTENTS_SOLID) {
150
150
  }
151
151
 
152
152
  // src/game/factories.ts
153
+ import {
154
+ Entity,
155
+ MoveType,
156
+ Solid,
157
+ ServerFlags,
158
+ DeadFlag
159
+ } from "@quake2ts/game";
153
160
  var createPlayerStateFactory = (overrides) => ({
154
161
  pm_type: 0,
155
162
  pm_time: 0,
@@ -232,10 +239,77 @@ var createGameStateSnapshotFactory = (overrides) => ({
232
239
  pm_type: 0,
233
240
  ...overrides
234
241
  });
242
+ function createEntityFactory(overrides = {}) {
243
+ const ent = new Entity(1);
244
+ Object.assign(ent, {
245
+ classname: "info_null",
246
+ health: 0,
247
+ max_health: 0,
248
+ takedamage: false,
249
+ deadflag: DeadFlag.Alive,
250
+ solid: Solid.Not,
251
+ movetype: MoveType.None,
252
+ flags: 0,
253
+ svflags: 0,
254
+ ...overrides
255
+ });
256
+ return ent;
257
+ }
258
+ function createPlayerEntityFactory(overrides = {}) {
259
+ return createEntityFactory({
260
+ classname: "player",
261
+ health: 100,
262
+ max_health: 100,
263
+ takedamage: true,
264
+ solid: Solid.BoundingBox,
265
+ movetype: MoveType.Walk,
266
+ svflags: ServerFlags.Player,
267
+ viewheight: 22,
268
+ ...overrides
269
+ });
270
+ }
271
+ function createMonsterEntityFactory(classname, overrides = {}) {
272
+ return createEntityFactory({
273
+ classname,
274
+ health: 100,
275
+ max_health: 100,
276
+ takedamage: true,
277
+ solid: Solid.BoundingBox,
278
+ movetype: MoveType.Step,
279
+ svflags: ServerFlags.Monster,
280
+ deadflag: DeadFlag.Alive,
281
+ ...overrides
282
+ });
283
+ }
284
+ function createItemEntityFactory(classname, overrides = {}) {
285
+ return createEntityFactory({
286
+ classname,
287
+ solid: Solid.Trigger,
288
+ movetype: MoveType.Toss,
289
+ ...overrides
290
+ });
291
+ }
292
+ function createProjectileEntityFactory(classname, overrides = {}) {
293
+ return createEntityFactory({
294
+ classname,
295
+ solid: Solid.Bsp,
296
+ movetype: MoveType.FlyMissile,
297
+ svflags: ServerFlags.Projectile,
298
+ ...overrides
299
+ });
300
+ }
301
+ function createTriggerEntityFactory(classname, overrides = {}) {
302
+ return createEntityFactory({
303
+ classname,
304
+ solid: Solid.Trigger,
305
+ movetype: MoveType.None,
306
+ ...overrides
307
+ });
308
+ }
235
309
 
236
310
  // src/game/helpers.ts
237
311
  import { vi as vi2 } from "vitest";
238
- import { Entity, SpawnRegistry, ScriptHookRegistry } from "@quake2ts/game";
312
+ import { Entity as Entity2, SpawnRegistry, ScriptHookRegistry } from "@quake2ts/game";
239
313
  import { createRandomGenerator } from "@quake2ts/shared";
240
314
  import { intersects, stairTrace, ladderTrace } from "@quake2ts/shared";
241
315
  var createMockEngine = () => ({
@@ -288,7 +362,7 @@ function createTestContext(options) {
288
362
  const hooks = game.hooks;
289
363
  const entities = {
290
364
  spawn: vi2.fn(() => {
291
- const ent = new Entity(entityList.length + 1);
365
+ const ent = new Entity2(entityList.length + 1);
292
366
  entityList.push(ent);
293
367
  hooks.onEntitySpawn(ent);
294
368
  return ent;
@@ -367,7 +441,7 @@ function createTestContext(options) {
367
441
  deathmatch: false,
368
442
  coop: false,
369
443
  activeCount: entityList.length,
370
- world: entityList.find((e) => e.classname === "worldspawn") || new Entity(0)
444
+ world: entityList.find((e) => e.classname === "worldspawn") || new Entity2(0)
371
445
  // ... other EntitySystem properties would go here
372
446
  };
373
447
  return {
@@ -384,13 +458,113 @@ function createTestContext(options) {
384
458
  precacheImage: vi2.fn()
385
459
  };
386
460
  }
387
- function createSpawnContext() {
461
+ function createSpawnTestContext(mapName) {
462
+ const ctx = createTestContext();
463
+ if (mapName) {
464
+ ctx.game.spawnWorld();
465
+ }
466
+ return ctx;
467
+ }
468
+ function createCombatTestContext() {
469
+ return createTestContext();
470
+ }
471
+ function createPhysicsTestContext() {
388
472
  return createTestContext();
389
473
  }
390
474
  function createEntity() {
391
- return new Entity(1);
475
+ return new Entity2(1);
392
476
  }
393
477
 
478
+ // src/game/mocks/ai.ts
479
+ import { vi as vi3 } from "vitest";
480
+ function createMockAI(overrides = {}) {
481
+ return {
482
+ checkAttack: vi3.fn(() => false),
483
+ findTarget: vi3.fn(() => null),
484
+ visible: vi3.fn(() => true),
485
+ infront: vi3.fn(() => true),
486
+ ...overrides
487
+ };
488
+ }
489
+ function createMockMonsterAI(overrides = {}) {
490
+ return {
491
+ stand: vi3.fn(),
492
+ walk: vi3.fn(),
493
+ run: vi3.fn(),
494
+ dodge: vi3.fn(),
495
+ attack: vi3.fn(),
496
+ melee: vi3.fn(),
497
+ sight: vi3.fn(),
498
+ idle: vi3.fn(),
499
+ ...overrides
500
+ };
501
+ }
502
+ function createMockMonsterMove(first, last, think, action) {
503
+ const frames = [];
504
+ for (let i = first; i <= last; i++) {
505
+ frames.push({
506
+ ai: action,
507
+ dist: 0,
508
+ think
509
+ });
510
+ }
511
+ return {
512
+ firstframe: first,
513
+ lastframe: last,
514
+ frames,
515
+ endfunc: null
516
+ };
517
+ }
518
+
519
+ // src/game/mocks/combat.ts
520
+ import { vi as vi4 } from "vitest";
521
+ import { DamageMod } from "@quake2ts/game";
522
+ function createMockDamageInfo(overrides = {}) {
523
+ return {
524
+ damage: 10,
525
+ mod: DamageMod.UNKNOWN,
526
+ knockback: 0,
527
+ attacker: null,
528
+ inflictor: null,
529
+ dir: null,
530
+ point: null,
531
+ ...overrides
532
+ };
533
+ }
534
+ var WEAPON_NAMES = {
535
+ "weapon_blaster": "Blaster",
536
+ "weapon_shotgun": "Shotgun",
537
+ "weapon_supershotgun": "Super Shotgun",
538
+ "weapon_machinegun": "Machinegun",
539
+ "weapon_chaingun": "Chaingun",
540
+ "weapon_grenadelauncher": "Grenade Launcher",
541
+ "weapon_rocketlauncher": "Rocket Launcher",
542
+ "weapon_hyperblaster": "HyperBlaster",
543
+ "weapon_railgun": "Railgun",
544
+ "weapon_bfg": "BFG10K"
545
+ };
546
+ function createMockWeapon(name = "Mock Weapon") {
547
+ const displayName = WEAPON_NAMES[name] || name;
548
+ return {
549
+ name: displayName,
550
+ ammoType: "bullets",
551
+ ammoUse: 1,
552
+ selection: vi4.fn(),
553
+ think: vi4.fn(),
554
+ command: vi4.fn()
555
+ };
556
+ }
557
+ var mockMonsterAttacks = {
558
+ fireBlaster: vi4.fn(),
559
+ fireRocket: vi4.fn(),
560
+ fireGrenade: vi4.fn(),
561
+ fireHeat: vi4.fn(),
562
+ fireBullet: vi4.fn(),
563
+ fireShotgun: vi4.fn(),
564
+ fireRailgun: vi4.fn(),
565
+ fireBFG: vi4.fn()
566
+ };
567
+
394
568
  // src/game/mocks.ts
395
569
  function createMockGameState(overrides) {
396
570
  return {
@@ -403,7 +577,7 @@ function createMockGameState(overrides) {
403
577
  }
404
578
 
405
579
  // src/server/mocks/transport.ts
406
- import { vi as vi3 } from "vitest";
580
+ import { vi as vi5 } from "vitest";
407
581
  var MockTransport = class {
408
582
  constructor() {
409
583
  this.address = "127.0.0.1";
@@ -411,11 +585,11 @@ var MockTransport = class {
411
585
  this.sentMessages = [];
412
586
  this.receivedMessages = [];
413
587
  this.listening = false;
414
- this.listenSpy = vi3.fn().mockImplementation(async (port) => {
588
+ this.listenSpy = vi5.fn().mockImplementation(async (port) => {
415
589
  this.port = port;
416
590
  this.listening = true;
417
591
  });
418
- this.closeSpy = vi3.fn().mockImplementation(() => {
592
+ this.closeSpy = vi5.fn().mockImplementation(() => {
419
593
  this.listening = false;
420
594
  });
421
595
  }
@@ -471,11 +645,11 @@ var MockTransport = class {
471
645
  };
472
646
  function createMockUDPSocket(overrides) {
473
647
  const socket = {
474
- send: vi3.fn(),
475
- on: vi3.fn(),
476
- close: vi3.fn(),
477
- bind: vi3.fn(),
478
- address: vi3.fn().mockReturnValue({ address: "127.0.0.1", family: "IPv4", port: 0 }),
648
+ send: vi5.fn(),
649
+ on: vi5.fn(),
650
+ close: vi5.fn(),
651
+ bind: vi5.fn(),
652
+ address: vi5.fn().mockReturnValue({ address: "127.0.0.1", family: "IPv4", port: 0 }),
479
653
  ...overrides
480
654
  };
481
655
  return socket;
@@ -490,11 +664,23 @@ function createMockTransport(address = "127.0.0.1", port = 27910, overrides) {
490
664
  Object.assign(transport, overrides);
491
665
  return transport;
492
666
  }
667
+ function createMockNetDriver(overrides) {
668
+ return {
669
+ connect: vi5.fn().mockResolvedValue(void 0),
670
+ disconnect: vi5.fn(),
671
+ send: vi5.fn(),
672
+ onMessage: vi5.fn(),
673
+ onClose: vi5.fn(),
674
+ onError: vi5.fn(),
675
+ isConnected: vi5.fn().mockReturnValue(true),
676
+ ...overrides
677
+ };
678
+ }
493
679
 
494
680
  // src/server/mocks/state.ts
495
681
  import { ServerState, ClientState } from "@quake2ts/server";
496
682
  import { MAX_CONFIGSTRINGS, MAX_EDICTS } from "@quake2ts/shared";
497
- import { vi as vi4 } from "vitest";
683
+ import { vi as vi6 } from "vitest";
498
684
  function createMockServerState(overrides) {
499
685
  return {
500
686
  state: ServerState.Game,
@@ -524,15 +710,7 @@ function createMockServerStatic(maxClients = 16, overrides) {
524
710
  };
525
711
  }
526
712
  function createMockServerClient(clientNum, overrides) {
527
- const mockNet = {
528
- connect: vi4.fn(),
529
- disconnect: vi4.fn(),
530
- send: vi4.fn(),
531
- onMessage: vi4.fn(),
532
- onClose: vi4.fn(),
533
- onError: vi4.fn(),
534
- isConnected: vi4.fn().mockReturnValue(true)
535
- };
713
+ const mockNet = createMockNetDriver();
536
714
  return {
537
715
  index: clientNum,
538
716
  state: ClientState.Connected,
@@ -544,13 +722,13 @@ function createMockServerClient(clientNum, overrides) {
544
722
  incomingSequence: 0,
545
723
  outgoingSequence: 0,
546
724
  lastReceived: 0,
547
- process: vi4.fn(),
548
- transmit: vi4.fn(),
549
- writeReliableByte: vi4.fn(),
550
- writeReliableShort: vi4.fn(),
551
- writeReliableLong: vi4.fn(),
552
- writeReliableString: vi4.fn(),
553
- writeReliableData: vi4.fn()
725
+ process: vi6.fn(),
726
+ transmit: vi6.fn(),
727
+ writeReliableByte: vi6.fn(),
728
+ writeReliableShort: vi6.fn(),
729
+ writeReliableLong: vi6.fn(),
730
+ writeReliableString: vi6.fn(),
731
+ writeReliableData: vi6.fn()
554
732
  },
555
733
  // Cast as any because NetChan might be complex to fully mock here
556
734
  userInfo: "",
@@ -592,13 +770,13 @@ function createMockServerClient(clientNum, overrides) {
592
770
  }
593
771
  function createMockServer(overrides) {
594
772
  return {
595
- start: vi4.fn().mockResolvedValue(void 0),
596
- stop: vi4.fn(),
597
- multicast: vi4.fn(),
598
- unicast: vi4.fn(),
599
- configstring: vi4.fn(),
600
- kickPlayer: vi4.fn(),
601
- changeMap: vi4.fn().mockResolvedValue(void 0),
773
+ start: vi6.fn().mockResolvedValue(void 0),
774
+ stop: vi6.fn(),
775
+ multicast: vi6.fn(),
776
+ unicast: vi6.fn(),
777
+ configstring: vi6.fn(),
778
+ kickPlayer: vi6.fn(),
779
+ changeMap: vi6.fn().mockResolvedValue(void 0),
602
780
  ...overrides
603
781
  };
604
782
  }
@@ -660,19 +838,19 @@ async function simulateHandshake(client, server) {
660
838
  }
661
839
 
662
840
  // src/server/mocks/commands.ts
663
- import { vi as vi5 } from "vitest";
841
+ import { vi as vi7 } from "vitest";
664
842
  function createMockServerConsole(overrides) {
665
843
  const outputBuffer = [];
666
844
  const commandBuffer = [];
667
845
  return {
668
- exec: vi5.fn((cmd) => {
846
+ exec: vi7.fn((cmd) => {
669
847
  commandBuffer.push(cmd);
670
848
  return `Executed: ${cmd}`;
671
849
  }),
672
- print: vi5.fn((text) => {
850
+ print: vi7.fn((text) => {
673
851
  outputBuffer.push(text);
674
852
  }),
675
- broadcast: vi5.fn((text) => {
853
+ broadcast: vi7.fn((text) => {
676
854
  outputBuffer.push(`Broadcast: ${text}`);
677
855
  }),
678
856
  commandBuffer,
@@ -685,13 +863,13 @@ function createMockRConClient(password = "") {
685
863
  connected: false,
686
864
  lastCommand: "",
687
865
  lastResponse: "",
688
- connect: vi5.fn(async (address, port, pwd) => {
866
+ connect: vi7.fn(async (address, port, pwd) => {
689
867
  return pwd === password;
690
868
  }),
691
- sendCommand: vi5.fn(async (cmd) => {
869
+ sendCommand: vi7.fn(async (cmd) => {
692
870
  return `RCON Response for: ${cmd}`;
693
871
  }),
694
- disconnect: vi5.fn()
872
+ disconnect: vi7.fn()
695
873
  };
696
874
  }
697
875
  function simulateServerCommand(server, command) {
@@ -1334,10 +1512,10 @@ function createMockImage(width, height, src) {
1334
1512
  }
1335
1513
 
1336
1514
  // src/engine/mocks/webgpu.ts
1337
- import { vi as vi6 } from "vitest";
1515
+ import { vi as vi8 } from "vitest";
1338
1516
  function createMockGPUAdapter() {
1339
1517
  return {
1340
- requestDevice: vi6.fn().mockResolvedValue(createMockGPUDevice()),
1518
+ requestDevice: vi8.fn().mockResolvedValue(createMockGPUDevice()),
1341
1519
  features: /* @__PURE__ */ new Set(),
1342
1520
  limits: {}
1343
1521
  };
@@ -1347,40 +1525,40 @@ function createMockGPUDevice() {
1347
1525
  features: /* @__PURE__ */ new Set(),
1348
1526
  limits: {},
1349
1527
  queue: {
1350
- submit: vi6.fn(),
1351
- writeBuffer: vi6.fn(),
1352
- writeTexture: vi6.fn(),
1353
- copyExternalImageToTexture: vi6.fn()
1354
- },
1355
- createCommandEncoder: vi6.fn().mockReturnValue({
1356
- beginRenderPass: vi6.fn().mockReturnValue({
1357
- setPipeline: vi6.fn(),
1358
- draw: vi6.fn(),
1359
- end: vi6.fn()
1528
+ submit: vi8.fn(),
1529
+ writeBuffer: vi8.fn(),
1530
+ writeTexture: vi8.fn(),
1531
+ copyExternalImageToTexture: vi8.fn()
1532
+ },
1533
+ createCommandEncoder: vi8.fn().mockReturnValue({
1534
+ beginRenderPass: vi8.fn().mockReturnValue({
1535
+ setPipeline: vi8.fn(),
1536
+ draw: vi8.fn(),
1537
+ end: vi8.fn()
1360
1538
  }),
1361
- finish: vi6.fn()
1539
+ finish: vi8.fn()
1362
1540
  }),
1363
- createRenderPipeline: vi6.fn(),
1364
- createShaderModule: vi6.fn(),
1365
- createBindGroup: vi6.fn(),
1366
- createBindGroupLayout: vi6.fn(),
1367
- createBuffer: vi6.fn(),
1368
- createTexture: vi6.fn(),
1369
- createSampler: vi6.fn()
1541
+ createRenderPipeline: vi8.fn(),
1542
+ createShaderModule: vi8.fn(),
1543
+ createBindGroup: vi8.fn(),
1544
+ createBindGroupLayout: vi8.fn(),
1545
+ createBuffer: vi8.fn(),
1546
+ createTexture: vi8.fn(),
1547
+ createSampler: vi8.fn()
1370
1548
  };
1371
1549
  }
1372
1550
  function createMockGPUCanvasContext() {
1373
1551
  return {
1374
- configure: vi6.fn(),
1375
- unconfigure: vi6.fn(),
1376
- getCurrentTexture: vi6.fn()
1552
+ configure: vi8.fn(),
1553
+ unconfigure: vi8.fn(),
1554
+ getCurrentTexture: vi8.fn()
1377
1555
  };
1378
1556
  }
1379
1557
  function setupWebGPUMocks() {
1380
1558
  const mockAdapter = createMockGPUAdapter();
1381
1559
  const mockGpu = {
1382
- requestAdapter: vi6.fn().mockResolvedValue(mockAdapter),
1383
- getPreferredCanvasFormat: vi6.fn().mockReturnValue("bgra8unorm")
1560
+ requestAdapter: vi8.fn().mockResolvedValue(mockAdapter),
1561
+ getPreferredCanvasFormat: vi8.fn().mockReturnValue("bgra8unorm")
1384
1562
  };
1385
1563
  Object.defineProperty(global.navigator, "gpu", {
1386
1564
  value: mockGpu,
@@ -1996,16 +2174,21 @@ export {
1996
2174
  compareScreenshots,
1997
2175
  createBinaryStreamMock,
1998
2176
  createBinaryWriterMock,
2177
+ createCombatTestContext,
1999
2178
  createControlledTimer,
2000
2179
  createCustomNetworkCondition,
2001
2180
  createDeltaSnapshot,
2002
2181
  createEntity,
2182
+ createEntityFactory,
2003
2183
  createEntityStateFactory,
2004
2184
  createGameStateSnapshotFactory,
2185
+ createItemEntityFactory,
2186
+ createMockAI,
2005
2187
  createMockAudioContext,
2006
2188
  createMockCanvas,
2007
2189
  createMockCanvasContext2D,
2008
2190
  createMockConnection,
2191
+ createMockDamageInfo,
2009
2192
  createMockEngine,
2010
2193
  createMockGPUAdapter,
2011
2194
  createMockGPUCanvasContext,
@@ -2017,6 +2200,9 @@ export {
2017
2200
  createMockImageData,
2018
2201
  createMockIndexedDB,
2019
2202
  createMockLocalStorage,
2203
+ createMockMonsterAI,
2204
+ createMockMonsterMove,
2205
+ createMockNetDriver,
2020
2206
  createMockNetworkAddress,
2021
2207
  createMockPerformance,
2022
2208
  createMockRAF,
@@ -2030,15 +2216,21 @@ export {
2030
2216
  createMockTransport,
2031
2217
  createMockUDPSocket,
2032
2218
  createMockUserInfo,
2219
+ createMockWeapon,
2033
2220
  createMockWebGL2Context,
2221
+ createMonsterEntityFactory,
2034
2222
  createMultiplayerTestScenario,
2035
2223
  createNetChanMock,
2224
+ createPhysicsTestContext,
2225
+ createPlayerEntityFactory,
2036
2226
  createPlayerStateFactory,
2037
2227
  createPlaywrightTestClient,
2228
+ createProjectileEntityFactory,
2038
2229
  createServerSnapshot,
2039
- createSpawnContext,
2230
+ createSpawnTestContext,
2040
2231
  createStorageTestScenario,
2041
2232
  createTestContext,
2233
+ createTriggerEntityFactory,
2042
2234
  createVisualTestScenario,
2043
2235
  intersects,
2044
2236
  ladderTrace,
@@ -2049,6 +2241,7 @@ export {
2049
2241
  makeLeafModel,
2050
2242
  makeNode,
2051
2243
  makePlane,
2244
+ mockMonsterAttacks,
2052
2245
  serializeUserInfo,
2053
2246
  setupBrowserEnvironment,
2054
2247
  setupMockAudioContext,