quake2ts 0.0.568 → 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,12 +458,112 @@ 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);
476
+ }
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
+ };
392
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
+ };
393
567
 
394
568
  // src/game/mocks.ts
395
569
  function createMockGameState(overrides) {
@@ -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;
@@ -492,13 +666,13 @@ function createMockTransport(address = "127.0.0.1", port = 27910, overrides) {
492
666
  }
493
667
  function createMockNetDriver(overrides) {
494
668
  return {
495
- connect: vi3.fn().mockResolvedValue(void 0),
496
- disconnect: vi3.fn(),
497
- send: vi3.fn(),
498
- onMessage: vi3.fn(),
499
- onClose: vi3.fn(),
500
- onError: vi3.fn(),
501
- isConnected: vi3.fn().mockReturnValue(true),
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),
502
676
  ...overrides
503
677
  };
504
678
  }
@@ -506,7 +680,7 @@ function createMockNetDriver(overrides) {
506
680
  // src/server/mocks/state.ts
507
681
  import { ServerState, ClientState } from "@quake2ts/server";
508
682
  import { MAX_CONFIGSTRINGS, MAX_EDICTS } from "@quake2ts/shared";
509
- import { vi as vi4 } from "vitest";
683
+ import { vi as vi6 } from "vitest";
510
684
  function createMockServerState(overrides) {
511
685
  return {
512
686
  state: ServerState.Game,
@@ -548,13 +722,13 @@ function createMockServerClient(clientNum, overrides) {
548
722
  incomingSequence: 0,
549
723
  outgoingSequence: 0,
550
724
  lastReceived: 0,
551
- process: vi4.fn(),
552
- transmit: vi4.fn(),
553
- writeReliableByte: vi4.fn(),
554
- writeReliableShort: vi4.fn(),
555
- writeReliableLong: vi4.fn(),
556
- writeReliableString: vi4.fn(),
557
- 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()
558
732
  },
559
733
  // Cast as any because NetChan might be complex to fully mock here
560
734
  userInfo: "",
@@ -596,13 +770,13 @@ function createMockServerClient(clientNum, overrides) {
596
770
  }
597
771
  function createMockServer(overrides) {
598
772
  return {
599
- start: vi4.fn().mockResolvedValue(void 0),
600
- stop: vi4.fn(),
601
- multicast: vi4.fn(),
602
- unicast: vi4.fn(),
603
- configstring: vi4.fn(),
604
- kickPlayer: vi4.fn(),
605
- 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),
606
780
  ...overrides
607
781
  };
608
782
  }
@@ -664,19 +838,19 @@ async function simulateHandshake(client, server) {
664
838
  }
665
839
 
666
840
  // src/server/mocks/commands.ts
667
- import { vi as vi5 } from "vitest";
841
+ import { vi as vi7 } from "vitest";
668
842
  function createMockServerConsole(overrides) {
669
843
  const outputBuffer = [];
670
844
  const commandBuffer = [];
671
845
  return {
672
- exec: vi5.fn((cmd) => {
846
+ exec: vi7.fn((cmd) => {
673
847
  commandBuffer.push(cmd);
674
848
  return `Executed: ${cmd}`;
675
849
  }),
676
- print: vi5.fn((text) => {
850
+ print: vi7.fn((text) => {
677
851
  outputBuffer.push(text);
678
852
  }),
679
- broadcast: vi5.fn((text) => {
853
+ broadcast: vi7.fn((text) => {
680
854
  outputBuffer.push(`Broadcast: ${text}`);
681
855
  }),
682
856
  commandBuffer,
@@ -689,13 +863,13 @@ function createMockRConClient(password = "") {
689
863
  connected: false,
690
864
  lastCommand: "",
691
865
  lastResponse: "",
692
- connect: vi5.fn(async (address, port, pwd) => {
866
+ connect: vi7.fn(async (address, port, pwd) => {
693
867
  return pwd === password;
694
868
  }),
695
- sendCommand: vi5.fn(async (cmd) => {
869
+ sendCommand: vi7.fn(async (cmd) => {
696
870
  return `RCON Response for: ${cmd}`;
697
871
  }),
698
- disconnect: vi5.fn()
872
+ disconnect: vi7.fn()
699
873
  };
700
874
  }
701
875
  function simulateServerCommand(server, command) {
@@ -1338,10 +1512,10 @@ function createMockImage(width, height, src) {
1338
1512
  }
1339
1513
 
1340
1514
  // src/engine/mocks/webgpu.ts
1341
- import { vi as vi6 } from "vitest";
1515
+ import { vi as vi8 } from "vitest";
1342
1516
  function createMockGPUAdapter() {
1343
1517
  return {
1344
- requestDevice: vi6.fn().mockResolvedValue(createMockGPUDevice()),
1518
+ requestDevice: vi8.fn().mockResolvedValue(createMockGPUDevice()),
1345
1519
  features: /* @__PURE__ */ new Set(),
1346
1520
  limits: {}
1347
1521
  };
@@ -1351,40 +1525,40 @@ function createMockGPUDevice() {
1351
1525
  features: /* @__PURE__ */ new Set(),
1352
1526
  limits: {},
1353
1527
  queue: {
1354
- submit: vi6.fn(),
1355
- writeBuffer: vi6.fn(),
1356
- writeTexture: vi6.fn(),
1357
- copyExternalImageToTexture: vi6.fn()
1358
- },
1359
- createCommandEncoder: vi6.fn().mockReturnValue({
1360
- beginRenderPass: vi6.fn().mockReturnValue({
1361
- setPipeline: vi6.fn(),
1362
- draw: vi6.fn(),
1363
- 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()
1364
1538
  }),
1365
- finish: vi6.fn()
1539
+ finish: vi8.fn()
1366
1540
  }),
1367
- createRenderPipeline: vi6.fn(),
1368
- createShaderModule: vi6.fn(),
1369
- createBindGroup: vi6.fn(),
1370
- createBindGroupLayout: vi6.fn(),
1371
- createBuffer: vi6.fn(),
1372
- createTexture: vi6.fn(),
1373
- 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()
1374
1548
  };
1375
1549
  }
1376
1550
  function createMockGPUCanvasContext() {
1377
1551
  return {
1378
- configure: vi6.fn(),
1379
- unconfigure: vi6.fn(),
1380
- getCurrentTexture: vi6.fn()
1552
+ configure: vi8.fn(),
1553
+ unconfigure: vi8.fn(),
1554
+ getCurrentTexture: vi8.fn()
1381
1555
  };
1382
1556
  }
1383
1557
  function setupWebGPUMocks() {
1384
1558
  const mockAdapter = createMockGPUAdapter();
1385
1559
  const mockGpu = {
1386
- requestAdapter: vi6.fn().mockResolvedValue(mockAdapter),
1387
- getPreferredCanvasFormat: vi6.fn().mockReturnValue("bgra8unorm")
1560
+ requestAdapter: vi8.fn().mockResolvedValue(mockAdapter),
1561
+ getPreferredCanvasFormat: vi8.fn().mockReturnValue("bgra8unorm")
1388
1562
  };
1389
1563
  Object.defineProperty(global.navigator, "gpu", {
1390
1564
  value: mockGpu,
@@ -2000,16 +2174,21 @@ export {
2000
2174
  compareScreenshots,
2001
2175
  createBinaryStreamMock,
2002
2176
  createBinaryWriterMock,
2177
+ createCombatTestContext,
2003
2178
  createControlledTimer,
2004
2179
  createCustomNetworkCondition,
2005
2180
  createDeltaSnapshot,
2006
2181
  createEntity,
2182
+ createEntityFactory,
2007
2183
  createEntityStateFactory,
2008
2184
  createGameStateSnapshotFactory,
2185
+ createItemEntityFactory,
2186
+ createMockAI,
2009
2187
  createMockAudioContext,
2010
2188
  createMockCanvas,
2011
2189
  createMockCanvasContext2D,
2012
2190
  createMockConnection,
2191
+ createMockDamageInfo,
2013
2192
  createMockEngine,
2014
2193
  createMockGPUAdapter,
2015
2194
  createMockGPUCanvasContext,
@@ -2021,6 +2200,8 @@ export {
2021
2200
  createMockImageData,
2022
2201
  createMockIndexedDB,
2023
2202
  createMockLocalStorage,
2203
+ createMockMonsterAI,
2204
+ createMockMonsterMove,
2024
2205
  createMockNetDriver,
2025
2206
  createMockNetworkAddress,
2026
2207
  createMockPerformance,
@@ -2035,15 +2216,21 @@ export {
2035
2216
  createMockTransport,
2036
2217
  createMockUDPSocket,
2037
2218
  createMockUserInfo,
2219
+ createMockWeapon,
2038
2220
  createMockWebGL2Context,
2221
+ createMonsterEntityFactory,
2039
2222
  createMultiplayerTestScenario,
2040
2223
  createNetChanMock,
2224
+ createPhysicsTestContext,
2225
+ createPlayerEntityFactory,
2041
2226
  createPlayerStateFactory,
2042
2227
  createPlaywrightTestClient,
2228
+ createProjectileEntityFactory,
2043
2229
  createServerSnapshot,
2044
- createSpawnContext,
2230
+ createSpawnTestContext,
2045
2231
  createStorageTestScenario,
2046
2232
  createTestContext,
2233
+ createTriggerEntityFactory,
2047
2234
  createVisualTestScenario,
2048
2235
  intersects,
2049
2236
  ladderTrace,
@@ -2054,6 +2241,7 @@ export {
2054
2241
  makeLeafModel,
2055
2242
  makeNode,
2056
2243
  makePlane,
2244
+ mockMonsterAttacks,
2057
2245
  serializeUserInfo,
2058
2246
  setupBrowserEnvironment,
2059
2247
  setupMockAudioContext,