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.
@@ -1,4 +1,4 @@
1
- export { Entity, type DieCallback, type EntityFieldDescriptor, type EntityFieldType, type PainCallback, type ThinkCallback, type TouchCallback, type UseCallback, type MonsterInfo, type MonsterMove, type MonsterFrame, MoveType, Solid, ServerFlags, DeadFlag, ENTITY_FIELD_METADATA, } from './entity.js';
1
+ export { Entity, type DieCallback, type EntityFieldDescriptor, type EntityFieldType, type PainCallback, type ThinkCallback, type TouchCallback, type UseCallback, type MonsterInfo, type MonsterMove, type MonsterFrame, type MonsterAction, type AIAction, MoveType, Solid, ServerFlags, DeadFlag, EntityFlags, EntityEffects, MuzzleFlash, ENTITY_FIELD_METADATA, } from './entity.js';
2
2
  export { EntitySystem, type EntitySystemSnapshot, type SerializedEntityState, type SerializedTargetAwareness, type LevelState } from './system.js';
3
3
  export { type EntityPoolSnapshot } from './pool.js';
4
4
  export { type ThinkScheduleEntry } from './thinkScheduler.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/entities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,QAAQ,EACR,KAAK,EACL,WAAW,EACX,QAAQ,EACR,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACnJ,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/entities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,QAAQ,EACR,KAAK,EACL,WAAW,EACX,QAAQ,EACR,WAAW,EACX,aAAa,EACb,WAAW,EACX,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,KAAK,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,KAAK,yBAAyB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACnJ,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
@@ -41,16 +41,21 @@ __export(index_exports, {
41
41
  compareScreenshots: () => compareScreenshots,
42
42
  createBinaryStreamMock: () => createBinaryStreamMock,
43
43
  createBinaryWriterMock: () => createBinaryWriterMock,
44
+ createCombatTestContext: () => createCombatTestContext,
44
45
  createControlledTimer: () => createControlledTimer,
45
46
  createCustomNetworkCondition: () => createCustomNetworkCondition,
46
47
  createDeltaSnapshot: () => createDeltaSnapshot,
47
48
  createEntity: () => createEntity,
49
+ createEntityFactory: () => createEntityFactory,
48
50
  createEntityStateFactory: () => createEntityStateFactory,
49
51
  createGameStateSnapshotFactory: () => createGameStateSnapshotFactory,
52
+ createItemEntityFactory: () => createItemEntityFactory,
53
+ createMockAI: () => createMockAI,
50
54
  createMockAudioContext: () => createMockAudioContext,
51
55
  createMockCanvas: () => createMockCanvas,
52
56
  createMockCanvasContext2D: () => createMockCanvasContext2D,
53
57
  createMockConnection: () => createMockConnection,
58
+ createMockDamageInfo: () => createMockDamageInfo,
54
59
  createMockEngine: () => createMockEngine,
55
60
  createMockGPUAdapter: () => createMockGPUAdapter,
56
61
  createMockGPUCanvasContext: () => createMockGPUCanvasContext,
@@ -62,6 +67,8 @@ __export(index_exports, {
62
67
  createMockImageData: () => createMockImageData,
63
68
  createMockIndexedDB: () => createMockIndexedDB,
64
69
  createMockLocalStorage: () => createMockLocalStorage,
70
+ createMockMonsterAI: () => createMockMonsterAI,
71
+ createMockMonsterMove: () => createMockMonsterMove,
65
72
  createMockNetDriver: () => createMockNetDriver,
66
73
  createMockNetworkAddress: () => createMockNetworkAddress,
67
74
  createMockPerformance: () => createMockPerformance,
@@ -76,15 +83,21 @@ __export(index_exports, {
76
83
  createMockTransport: () => createMockTransport,
77
84
  createMockUDPSocket: () => createMockUDPSocket,
78
85
  createMockUserInfo: () => createMockUserInfo,
86
+ createMockWeapon: () => createMockWeapon,
79
87
  createMockWebGL2Context: () => createMockWebGL2Context,
88
+ createMonsterEntityFactory: () => createMonsterEntityFactory,
80
89
  createMultiplayerTestScenario: () => createMultiplayerTestScenario,
81
90
  createNetChanMock: () => createNetChanMock,
91
+ createPhysicsTestContext: () => createPhysicsTestContext,
92
+ createPlayerEntityFactory: () => createPlayerEntityFactory,
82
93
  createPlayerStateFactory: () => createPlayerStateFactory,
83
94
  createPlaywrightTestClient: () => createPlaywrightTestClient,
95
+ createProjectileEntityFactory: () => createProjectileEntityFactory,
84
96
  createServerSnapshot: () => createServerSnapshot,
85
- createSpawnContext: () => createSpawnContext,
97
+ createSpawnTestContext: () => createSpawnTestContext,
86
98
  createStorageTestScenario: () => createStorageTestScenario,
87
99
  createTestContext: () => createTestContext,
100
+ createTriggerEntityFactory: () => createTriggerEntityFactory,
88
101
  createVisualTestScenario: () => createVisualTestScenario,
89
102
  intersects: () => import_shared3.intersects,
90
103
  ladderTrace: () => import_shared3.ladderTrace,
@@ -95,6 +108,7 @@ __export(index_exports, {
95
108
  makeLeafModel: () => makeLeafModel,
96
109
  makeNode: () => makeNode,
97
110
  makePlane: () => makePlane,
111
+ mockMonsterAttacks: () => mockMonsterAttacks,
98
112
  serializeUserInfo: () => serializeUserInfo,
99
113
  setupBrowserEnvironment: () => setupBrowserEnvironment,
100
114
  setupMockAudioContext: () => setupMockAudioContext,
@@ -268,6 +282,7 @@ function makeBrushFromMinsMaxs(mins, maxs, contents = import_shared.CONTENTS_SOL
268
282
  }
269
283
 
270
284
  // src/game/factories.ts
285
+ var import_game = require("@quake2ts/game");
271
286
  var createPlayerStateFactory = (overrides) => ({
272
287
  pm_type: 0,
273
288
  pm_time: 0,
@@ -350,10 +365,77 @@ var createGameStateSnapshotFactory = (overrides) => ({
350
365
  pm_type: 0,
351
366
  ...overrides
352
367
  });
368
+ function createEntityFactory(overrides = {}) {
369
+ const ent = new import_game.Entity(1);
370
+ Object.assign(ent, {
371
+ classname: "info_null",
372
+ health: 0,
373
+ max_health: 0,
374
+ takedamage: false,
375
+ deadflag: import_game.DeadFlag.Alive,
376
+ solid: import_game.Solid.Not,
377
+ movetype: import_game.MoveType.None,
378
+ flags: 0,
379
+ svflags: 0,
380
+ ...overrides
381
+ });
382
+ return ent;
383
+ }
384
+ function createPlayerEntityFactory(overrides = {}) {
385
+ return createEntityFactory({
386
+ classname: "player",
387
+ health: 100,
388
+ max_health: 100,
389
+ takedamage: true,
390
+ solid: import_game.Solid.BoundingBox,
391
+ movetype: import_game.MoveType.Walk,
392
+ svflags: import_game.ServerFlags.Player,
393
+ viewheight: 22,
394
+ ...overrides
395
+ });
396
+ }
397
+ function createMonsterEntityFactory(classname, overrides = {}) {
398
+ return createEntityFactory({
399
+ classname,
400
+ health: 100,
401
+ max_health: 100,
402
+ takedamage: true,
403
+ solid: import_game.Solid.BoundingBox,
404
+ movetype: import_game.MoveType.Step,
405
+ svflags: import_game.ServerFlags.Monster,
406
+ deadflag: import_game.DeadFlag.Alive,
407
+ ...overrides
408
+ });
409
+ }
410
+ function createItemEntityFactory(classname, overrides = {}) {
411
+ return createEntityFactory({
412
+ classname,
413
+ solid: import_game.Solid.Trigger,
414
+ movetype: import_game.MoveType.Toss,
415
+ ...overrides
416
+ });
417
+ }
418
+ function createProjectileEntityFactory(classname, overrides = {}) {
419
+ return createEntityFactory({
420
+ classname,
421
+ solid: import_game.Solid.Bsp,
422
+ movetype: import_game.MoveType.FlyMissile,
423
+ svflags: import_game.ServerFlags.Projectile,
424
+ ...overrides
425
+ });
426
+ }
427
+ function createTriggerEntityFactory(classname, overrides = {}) {
428
+ return createEntityFactory({
429
+ classname,
430
+ solid: import_game.Solid.Trigger,
431
+ movetype: import_game.MoveType.None,
432
+ ...overrides
433
+ });
434
+ }
353
435
 
354
436
  // src/game/helpers.ts
355
437
  var import_vitest2 = require("vitest");
356
- var import_game = require("@quake2ts/game");
438
+ var import_game2 = require("@quake2ts/game");
357
439
  var import_shared2 = require("@quake2ts/shared");
358
440
  var import_shared3 = require("@quake2ts/shared");
359
441
  var createMockEngine = () => ({
@@ -363,8 +445,8 @@ var createMockEngine = () => ({
363
445
  centerprintf: import_vitest2.vi.fn()
364
446
  });
365
447
  var createMockGame = (seed = 12345) => {
366
- const spawnRegistry = new import_game.SpawnRegistry();
367
- const hooks = new import_game.ScriptHookRegistry();
448
+ const spawnRegistry = new import_game2.SpawnRegistry();
449
+ const hooks = new import_game2.ScriptHookRegistry();
368
450
  const game = {
369
451
  random: (0, import_shared2.createRandomGenerator)({ seed }),
370
452
  registerEntitySpawn: import_vitest2.vi.fn((classname, spawnFunc) => {
@@ -406,7 +488,7 @@ function createTestContext(options) {
406
488
  const hooks = game.hooks;
407
489
  const entities = {
408
490
  spawn: import_vitest2.vi.fn(() => {
409
- const ent = new import_game.Entity(entityList.length + 1);
491
+ const ent = new import_game2.Entity(entityList.length + 1);
410
492
  entityList.push(ent);
411
493
  hooks.onEntitySpawn(ent);
412
494
  return ent;
@@ -485,7 +567,7 @@ function createTestContext(options) {
485
567
  deathmatch: false,
486
568
  coop: false,
487
569
  activeCount: entityList.length,
488
- world: entityList.find((e) => e.classname === "worldspawn") || new import_game.Entity(0)
570
+ world: entityList.find((e) => e.classname === "worldspawn") || new import_game2.Entity(0)
489
571
  // ... other EntitySystem properties would go here
490
572
  };
491
573
  return {
@@ -502,13 +584,113 @@ function createTestContext(options) {
502
584
  precacheImage: import_vitest2.vi.fn()
503
585
  };
504
586
  }
505
- function createSpawnContext() {
587
+ function createSpawnTestContext(mapName) {
588
+ const ctx = createTestContext();
589
+ if (mapName) {
590
+ ctx.game.spawnWorld();
591
+ }
592
+ return ctx;
593
+ }
594
+ function createCombatTestContext() {
595
+ return createTestContext();
596
+ }
597
+ function createPhysicsTestContext() {
506
598
  return createTestContext();
507
599
  }
508
600
  function createEntity() {
509
- return new import_game.Entity(1);
601
+ return new import_game2.Entity(1);
510
602
  }
511
603
 
604
+ // src/game/mocks/ai.ts
605
+ var import_vitest3 = require("vitest");
606
+ function createMockAI(overrides = {}) {
607
+ return {
608
+ checkAttack: import_vitest3.vi.fn(() => false),
609
+ findTarget: import_vitest3.vi.fn(() => null),
610
+ visible: import_vitest3.vi.fn(() => true),
611
+ infront: import_vitest3.vi.fn(() => true),
612
+ ...overrides
613
+ };
614
+ }
615
+ function createMockMonsterAI(overrides = {}) {
616
+ return {
617
+ stand: import_vitest3.vi.fn(),
618
+ walk: import_vitest3.vi.fn(),
619
+ run: import_vitest3.vi.fn(),
620
+ dodge: import_vitest3.vi.fn(),
621
+ attack: import_vitest3.vi.fn(),
622
+ melee: import_vitest3.vi.fn(),
623
+ sight: import_vitest3.vi.fn(),
624
+ idle: import_vitest3.vi.fn(),
625
+ ...overrides
626
+ };
627
+ }
628
+ function createMockMonsterMove(first, last, think, action) {
629
+ const frames = [];
630
+ for (let i = first; i <= last; i++) {
631
+ frames.push({
632
+ ai: action,
633
+ dist: 0,
634
+ think
635
+ });
636
+ }
637
+ return {
638
+ firstframe: first,
639
+ lastframe: last,
640
+ frames,
641
+ endfunc: null
642
+ };
643
+ }
644
+
645
+ // src/game/mocks/combat.ts
646
+ var import_vitest4 = require("vitest");
647
+ var import_game3 = require("@quake2ts/game");
648
+ function createMockDamageInfo(overrides = {}) {
649
+ return {
650
+ damage: 10,
651
+ mod: import_game3.DamageMod.UNKNOWN,
652
+ knockback: 0,
653
+ attacker: null,
654
+ inflictor: null,
655
+ dir: null,
656
+ point: null,
657
+ ...overrides
658
+ };
659
+ }
660
+ var WEAPON_NAMES = {
661
+ "weapon_blaster": "Blaster",
662
+ "weapon_shotgun": "Shotgun",
663
+ "weapon_supershotgun": "Super Shotgun",
664
+ "weapon_machinegun": "Machinegun",
665
+ "weapon_chaingun": "Chaingun",
666
+ "weapon_grenadelauncher": "Grenade Launcher",
667
+ "weapon_rocketlauncher": "Rocket Launcher",
668
+ "weapon_hyperblaster": "HyperBlaster",
669
+ "weapon_railgun": "Railgun",
670
+ "weapon_bfg": "BFG10K"
671
+ };
672
+ function createMockWeapon(name = "Mock Weapon") {
673
+ const displayName = WEAPON_NAMES[name] || name;
674
+ return {
675
+ name: displayName,
676
+ ammoType: "bullets",
677
+ ammoUse: 1,
678
+ selection: import_vitest4.vi.fn(),
679
+ think: import_vitest4.vi.fn(),
680
+ command: import_vitest4.vi.fn()
681
+ };
682
+ }
683
+ var mockMonsterAttacks = {
684
+ fireBlaster: import_vitest4.vi.fn(),
685
+ fireRocket: import_vitest4.vi.fn(),
686
+ fireGrenade: import_vitest4.vi.fn(),
687
+ fireHeat: import_vitest4.vi.fn(),
688
+ fireBullet: import_vitest4.vi.fn(),
689
+ fireShotgun: import_vitest4.vi.fn(),
690
+ fireRailgun: import_vitest4.vi.fn(),
691
+ fireBFG: import_vitest4.vi.fn()
692
+ };
693
+
512
694
  // src/game/mocks.ts
513
695
  function createMockGameState(overrides) {
514
696
  return {
@@ -521,7 +703,7 @@ function createMockGameState(overrides) {
521
703
  }
522
704
 
523
705
  // src/server/mocks/transport.ts
524
- var import_vitest3 = require("vitest");
706
+ var import_vitest5 = require("vitest");
525
707
  var MockTransport = class {
526
708
  constructor() {
527
709
  this.address = "127.0.0.1";
@@ -529,11 +711,11 @@ var MockTransport = class {
529
711
  this.sentMessages = [];
530
712
  this.receivedMessages = [];
531
713
  this.listening = false;
532
- this.listenSpy = import_vitest3.vi.fn().mockImplementation(async (port) => {
714
+ this.listenSpy = import_vitest5.vi.fn().mockImplementation(async (port) => {
533
715
  this.port = port;
534
716
  this.listening = true;
535
717
  });
536
- this.closeSpy = import_vitest3.vi.fn().mockImplementation(() => {
718
+ this.closeSpy = import_vitest5.vi.fn().mockImplementation(() => {
537
719
  this.listening = false;
538
720
  });
539
721
  }
@@ -589,11 +771,11 @@ var MockTransport = class {
589
771
  };
590
772
  function createMockUDPSocket(overrides) {
591
773
  const socket = {
592
- send: import_vitest3.vi.fn(),
593
- on: import_vitest3.vi.fn(),
594
- close: import_vitest3.vi.fn(),
595
- bind: import_vitest3.vi.fn(),
596
- address: import_vitest3.vi.fn().mockReturnValue({ address: "127.0.0.1", family: "IPv4", port: 0 }),
774
+ send: import_vitest5.vi.fn(),
775
+ on: import_vitest5.vi.fn(),
776
+ close: import_vitest5.vi.fn(),
777
+ bind: import_vitest5.vi.fn(),
778
+ address: import_vitest5.vi.fn().mockReturnValue({ address: "127.0.0.1", family: "IPv4", port: 0 }),
597
779
  ...overrides
598
780
  };
599
781
  return socket;
@@ -610,13 +792,13 @@ function createMockTransport(address = "127.0.0.1", port = 27910, overrides) {
610
792
  }
611
793
  function createMockNetDriver(overrides) {
612
794
  return {
613
- connect: import_vitest3.vi.fn().mockResolvedValue(void 0),
614
- disconnect: import_vitest3.vi.fn(),
615
- send: import_vitest3.vi.fn(),
616
- onMessage: import_vitest3.vi.fn(),
617
- onClose: import_vitest3.vi.fn(),
618
- onError: import_vitest3.vi.fn(),
619
- isConnected: import_vitest3.vi.fn().mockReturnValue(true),
795
+ connect: import_vitest5.vi.fn().mockResolvedValue(void 0),
796
+ disconnect: import_vitest5.vi.fn(),
797
+ send: import_vitest5.vi.fn(),
798
+ onMessage: import_vitest5.vi.fn(),
799
+ onClose: import_vitest5.vi.fn(),
800
+ onError: import_vitest5.vi.fn(),
801
+ isConnected: import_vitest5.vi.fn().mockReturnValue(true),
620
802
  ...overrides
621
803
  };
622
804
  }
@@ -624,7 +806,7 @@ function createMockNetDriver(overrides) {
624
806
  // src/server/mocks/state.ts
625
807
  var import_server = require("@quake2ts/server");
626
808
  var import_shared4 = require("@quake2ts/shared");
627
- var import_vitest4 = require("vitest");
809
+ var import_vitest6 = require("vitest");
628
810
  function createMockServerState(overrides) {
629
811
  return {
630
812
  state: import_server.ServerState.Game,
@@ -666,13 +848,13 @@ function createMockServerClient(clientNum, overrides) {
666
848
  incomingSequence: 0,
667
849
  outgoingSequence: 0,
668
850
  lastReceived: 0,
669
- process: import_vitest4.vi.fn(),
670
- transmit: import_vitest4.vi.fn(),
671
- writeReliableByte: import_vitest4.vi.fn(),
672
- writeReliableShort: import_vitest4.vi.fn(),
673
- writeReliableLong: import_vitest4.vi.fn(),
674
- writeReliableString: import_vitest4.vi.fn(),
675
- writeReliableData: import_vitest4.vi.fn()
851
+ process: import_vitest6.vi.fn(),
852
+ transmit: import_vitest6.vi.fn(),
853
+ writeReliableByte: import_vitest6.vi.fn(),
854
+ writeReliableShort: import_vitest6.vi.fn(),
855
+ writeReliableLong: import_vitest6.vi.fn(),
856
+ writeReliableString: import_vitest6.vi.fn(),
857
+ writeReliableData: import_vitest6.vi.fn()
676
858
  },
677
859
  // Cast as any because NetChan might be complex to fully mock here
678
860
  userInfo: "",
@@ -714,13 +896,13 @@ function createMockServerClient(clientNum, overrides) {
714
896
  }
715
897
  function createMockServer(overrides) {
716
898
  return {
717
- start: import_vitest4.vi.fn().mockResolvedValue(void 0),
718
- stop: import_vitest4.vi.fn(),
719
- multicast: import_vitest4.vi.fn(),
720
- unicast: import_vitest4.vi.fn(),
721
- configstring: import_vitest4.vi.fn(),
722
- kickPlayer: import_vitest4.vi.fn(),
723
- changeMap: import_vitest4.vi.fn().mockResolvedValue(void 0),
899
+ start: import_vitest6.vi.fn().mockResolvedValue(void 0),
900
+ stop: import_vitest6.vi.fn(),
901
+ multicast: import_vitest6.vi.fn(),
902
+ unicast: import_vitest6.vi.fn(),
903
+ configstring: import_vitest6.vi.fn(),
904
+ kickPlayer: import_vitest6.vi.fn(),
905
+ changeMap: import_vitest6.vi.fn().mockResolvedValue(void 0),
724
906
  ...overrides
725
907
  };
726
908
  }
@@ -782,19 +964,19 @@ async function simulateHandshake(client, server) {
782
964
  }
783
965
 
784
966
  // src/server/mocks/commands.ts
785
- var import_vitest5 = require("vitest");
967
+ var import_vitest7 = require("vitest");
786
968
  function createMockServerConsole(overrides) {
787
969
  const outputBuffer = [];
788
970
  const commandBuffer = [];
789
971
  return {
790
- exec: import_vitest5.vi.fn((cmd) => {
972
+ exec: import_vitest7.vi.fn((cmd) => {
791
973
  commandBuffer.push(cmd);
792
974
  return `Executed: ${cmd}`;
793
975
  }),
794
- print: import_vitest5.vi.fn((text) => {
976
+ print: import_vitest7.vi.fn((text) => {
795
977
  outputBuffer.push(text);
796
978
  }),
797
- broadcast: import_vitest5.vi.fn((text) => {
979
+ broadcast: import_vitest7.vi.fn((text) => {
798
980
  outputBuffer.push(`Broadcast: ${text}`);
799
981
  }),
800
982
  commandBuffer,
@@ -807,13 +989,13 @@ function createMockRConClient(password = "") {
807
989
  connected: false,
808
990
  lastCommand: "",
809
991
  lastResponse: "",
810
- connect: import_vitest5.vi.fn(async (address, port, pwd) => {
992
+ connect: import_vitest7.vi.fn(async (address, port, pwd) => {
811
993
  return pwd === password;
812
994
  }),
813
- sendCommand: import_vitest5.vi.fn(async (cmd) => {
995
+ sendCommand: import_vitest7.vi.fn(async (cmd) => {
814
996
  return `RCON Response for: ${cmd}`;
815
997
  }),
816
- disconnect: import_vitest5.vi.fn()
998
+ disconnect: import_vitest7.vi.fn()
817
999
  };
818
1000
  }
819
1001
  function simulateServerCommand(server, command) {
@@ -1456,10 +1638,10 @@ function createMockImage(width, height, src) {
1456
1638
  }
1457
1639
 
1458
1640
  // src/engine/mocks/webgpu.ts
1459
- var import_vitest6 = require("vitest");
1641
+ var import_vitest8 = require("vitest");
1460
1642
  function createMockGPUAdapter() {
1461
1643
  return {
1462
- requestDevice: import_vitest6.vi.fn().mockResolvedValue(createMockGPUDevice()),
1644
+ requestDevice: import_vitest8.vi.fn().mockResolvedValue(createMockGPUDevice()),
1463
1645
  features: /* @__PURE__ */ new Set(),
1464
1646
  limits: {}
1465
1647
  };
@@ -1469,40 +1651,40 @@ function createMockGPUDevice() {
1469
1651
  features: /* @__PURE__ */ new Set(),
1470
1652
  limits: {},
1471
1653
  queue: {
1472
- submit: import_vitest6.vi.fn(),
1473
- writeBuffer: import_vitest6.vi.fn(),
1474
- writeTexture: import_vitest6.vi.fn(),
1475
- copyExternalImageToTexture: import_vitest6.vi.fn()
1476
- },
1477
- createCommandEncoder: import_vitest6.vi.fn().mockReturnValue({
1478
- beginRenderPass: import_vitest6.vi.fn().mockReturnValue({
1479
- setPipeline: import_vitest6.vi.fn(),
1480
- draw: import_vitest6.vi.fn(),
1481
- end: import_vitest6.vi.fn()
1654
+ submit: import_vitest8.vi.fn(),
1655
+ writeBuffer: import_vitest8.vi.fn(),
1656
+ writeTexture: import_vitest8.vi.fn(),
1657
+ copyExternalImageToTexture: import_vitest8.vi.fn()
1658
+ },
1659
+ createCommandEncoder: import_vitest8.vi.fn().mockReturnValue({
1660
+ beginRenderPass: import_vitest8.vi.fn().mockReturnValue({
1661
+ setPipeline: import_vitest8.vi.fn(),
1662
+ draw: import_vitest8.vi.fn(),
1663
+ end: import_vitest8.vi.fn()
1482
1664
  }),
1483
- finish: import_vitest6.vi.fn()
1665
+ finish: import_vitest8.vi.fn()
1484
1666
  }),
1485
- createRenderPipeline: import_vitest6.vi.fn(),
1486
- createShaderModule: import_vitest6.vi.fn(),
1487
- createBindGroup: import_vitest6.vi.fn(),
1488
- createBindGroupLayout: import_vitest6.vi.fn(),
1489
- createBuffer: import_vitest6.vi.fn(),
1490
- createTexture: import_vitest6.vi.fn(),
1491
- createSampler: import_vitest6.vi.fn()
1667
+ createRenderPipeline: import_vitest8.vi.fn(),
1668
+ createShaderModule: import_vitest8.vi.fn(),
1669
+ createBindGroup: import_vitest8.vi.fn(),
1670
+ createBindGroupLayout: import_vitest8.vi.fn(),
1671
+ createBuffer: import_vitest8.vi.fn(),
1672
+ createTexture: import_vitest8.vi.fn(),
1673
+ createSampler: import_vitest8.vi.fn()
1492
1674
  };
1493
1675
  }
1494
1676
  function createMockGPUCanvasContext() {
1495
1677
  return {
1496
- configure: import_vitest6.vi.fn(),
1497
- unconfigure: import_vitest6.vi.fn(),
1498
- getCurrentTexture: import_vitest6.vi.fn()
1678
+ configure: import_vitest8.vi.fn(),
1679
+ unconfigure: import_vitest8.vi.fn(),
1680
+ getCurrentTexture: import_vitest8.vi.fn()
1499
1681
  };
1500
1682
  }
1501
1683
  function setupWebGPUMocks() {
1502
1684
  const mockAdapter = createMockGPUAdapter();
1503
1685
  const mockGpu = {
1504
- requestAdapter: import_vitest6.vi.fn().mockResolvedValue(mockAdapter),
1505
- getPreferredCanvasFormat: import_vitest6.vi.fn().mockReturnValue("bgra8unorm")
1686
+ requestAdapter: import_vitest8.vi.fn().mockResolvedValue(mockAdapter),
1687
+ getPreferredCanvasFormat: import_vitest8.vi.fn().mockReturnValue("bgra8unorm")
1506
1688
  };
1507
1689
  Object.defineProperty(global.navigator, "gpu", {
1508
1690
  value: mockGpu,
@@ -2119,16 +2301,21 @@ function createVisualTestScenario(page, sceneName) {
2119
2301
  compareScreenshots,
2120
2302
  createBinaryStreamMock,
2121
2303
  createBinaryWriterMock,
2304
+ createCombatTestContext,
2122
2305
  createControlledTimer,
2123
2306
  createCustomNetworkCondition,
2124
2307
  createDeltaSnapshot,
2125
2308
  createEntity,
2309
+ createEntityFactory,
2126
2310
  createEntityStateFactory,
2127
2311
  createGameStateSnapshotFactory,
2312
+ createItemEntityFactory,
2313
+ createMockAI,
2128
2314
  createMockAudioContext,
2129
2315
  createMockCanvas,
2130
2316
  createMockCanvasContext2D,
2131
2317
  createMockConnection,
2318
+ createMockDamageInfo,
2132
2319
  createMockEngine,
2133
2320
  createMockGPUAdapter,
2134
2321
  createMockGPUCanvasContext,
@@ -2140,6 +2327,8 @@ function createVisualTestScenario(page, sceneName) {
2140
2327
  createMockImageData,
2141
2328
  createMockIndexedDB,
2142
2329
  createMockLocalStorage,
2330
+ createMockMonsterAI,
2331
+ createMockMonsterMove,
2143
2332
  createMockNetDriver,
2144
2333
  createMockNetworkAddress,
2145
2334
  createMockPerformance,
@@ -2154,15 +2343,21 @@ function createVisualTestScenario(page, sceneName) {
2154
2343
  createMockTransport,
2155
2344
  createMockUDPSocket,
2156
2345
  createMockUserInfo,
2346
+ createMockWeapon,
2157
2347
  createMockWebGL2Context,
2348
+ createMonsterEntityFactory,
2158
2349
  createMultiplayerTestScenario,
2159
2350
  createNetChanMock,
2351
+ createPhysicsTestContext,
2352
+ createPlayerEntityFactory,
2160
2353
  createPlayerStateFactory,
2161
2354
  createPlaywrightTestClient,
2355
+ createProjectileEntityFactory,
2162
2356
  createServerSnapshot,
2163
- createSpawnContext,
2357
+ createSpawnTestContext,
2164
2358
  createStorageTestScenario,
2165
2359
  createTestContext,
2360
+ createTriggerEntityFactory,
2166
2361
  createVisualTestScenario,
2167
2362
  intersects,
2168
2363
  ladderTrace,
@@ -2173,6 +2368,7 @@ function createVisualTestScenario(page, sceneName) {
2173
2368
  makeLeafModel,
2174
2369
  makeNode,
2175
2370
  makePlane,
2371
+ mockMonsterAttacks,
2176
2372
  serializeUserInfo,
2177
2373
  setupBrowserEnvironment,
2178
2374
  setupMockAudioContext,