quake2ts 0.0.277 → 0.0.281

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.
Files changed (62) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +13 -13
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs.map +1 -1
  5. package/packages/client/dist/esm/index.js.map +1 -1
  6. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  7. package/packages/engine/dist/browser/index.global.js +9 -9
  8. package/packages/engine/dist/browser/index.global.js.map +1 -1
  9. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  10. package/packages/engine/dist/esm/index.js.map +1 -1
  11. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  12. package/packages/game/dist/browser/index.global.js +3 -3
  13. package/packages/game/dist/browser/index.global.js.map +1 -1
  14. package/packages/game/dist/cjs/index.cjs +2108 -1193
  15. package/packages/game/dist/cjs/index.cjs.map +1 -1
  16. package/packages/game/dist/esm/index.js +1879 -957
  17. package/packages/game/dist/esm/index.js.map +1 -1
  18. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  19. package/packages/game/dist/types/combat/weapons/animation.d.ts +3 -2
  20. package/packages/game/dist/types/combat/weapons/animation.d.ts.map +1 -1
  21. package/packages/game/dist/types/combat/weapons/bfg.d.ts +4 -0
  22. package/packages/game/dist/types/combat/weapons/bfg.d.ts.map +1 -0
  23. package/packages/game/dist/types/combat/weapons/blaster.d.ts +4 -0
  24. package/packages/game/dist/types/combat/weapons/blaster.d.ts.map +1 -0
  25. package/packages/game/dist/types/combat/weapons/chaingun.d.ts.map +1 -1
  26. package/packages/game/dist/types/combat/weapons/firing.d.ts +10 -0
  27. package/packages/game/dist/types/combat/weapons/firing.d.ts.map +1 -1
  28. package/packages/game/dist/types/combat/weapons/frames.d.ts +43 -0
  29. package/packages/game/dist/types/combat/weapons/frames.d.ts.map +1 -1
  30. package/packages/game/dist/types/combat/weapons/grenadelauncher.d.ts +4 -0
  31. package/packages/game/dist/types/combat/weapons/grenadelauncher.d.ts.map +1 -0
  32. package/packages/game/dist/types/combat/weapons/hyperblaster.d.ts +4 -0
  33. package/packages/game/dist/types/combat/weapons/hyperblaster.d.ts.map +1 -0
  34. package/packages/game/dist/types/combat/weapons/machinegun.d.ts +4 -0
  35. package/packages/game/dist/types/combat/weapons/machinegun.d.ts.map +1 -0
  36. package/packages/game/dist/types/combat/weapons/railgun.d.ts +4 -0
  37. package/packages/game/dist/types/combat/weapons/railgun.d.ts.map +1 -0
  38. package/packages/game/dist/types/combat/weapons/rocket.d.ts +4 -0
  39. package/packages/game/dist/types/combat/weapons/rocket.d.ts.map +1 -0
  40. package/packages/game/dist/types/combat/weapons/shotgun.d.ts +4 -0
  41. package/packages/game/dist/types/combat/weapons/shotgun.d.ts.map +1 -0
  42. package/packages/game/dist/types/combat/weapons/supershotgun.d.ts +4 -0
  43. package/packages/game/dist/types/combat/weapons/supershotgun.d.ts.map +1 -0
  44. package/packages/game/dist/types/entities/entity.d.ts +17 -0
  45. package/packages/game/dist/types/entities/entity.d.ts.map +1 -1
  46. package/packages/game/dist/types/entities/system.d.ts +2 -1
  47. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  48. package/packages/game/dist/types/entities/targets.d.ts.map +1 -1
  49. package/packages/game/dist/types/index.d.ts.map +1 -1
  50. package/packages/game/dist/types/inventory/items.d.ts.map +1 -1
  51. package/packages/shared/dist/browser/index.global.js +1 -1
  52. package/packages/shared/dist/browser/index.global.js.map +1 -1
  53. package/packages/shared/dist/cjs/index.cjs +26 -0
  54. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  55. package/packages/shared/dist/esm/index.js +25 -0
  56. package/packages/shared/dist/esm/index.js.map +1 -1
  57. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  58. package/packages/shared/dist/types/protocol/index.d.ts +1 -0
  59. package/packages/shared/dist/types/protocol/index.d.ts.map +1 -1
  60. package/packages/shared/dist/types/protocol/renderFx.d.ts +22 -0
  61. package/packages/shared/dist/types/protocol/renderFx.d.ts.map +1 -0
  62. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -1,12 +1,14 @@
1
- // ../shared/dist/esm/index.js
2
1
  var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __esm = (fn, res) => function __init() {
4
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
5
+ };
3
6
  var __export = (target, all) => {
4
7
  for (var name in all)
5
8
  __defProp(target, name, { get: all[name], enumerable: true });
6
9
  };
7
- var ZERO_VEC3 = { x: 0, y: 0, z: 0 };
8
- var STOP_EPSILON = 0.1;
9
- var DEG_TO_RAD = Math.PI / 180;
10
+
11
+ // ../shared/dist/esm/index.js
10
12
  function copyVec3(a) {
11
13
  return { x: a.x, y: a.y, z: a.z };
12
14
  }
@@ -153,11 +155,6 @@ function rotatePointAroundVector(dir, point, degrees) {
153
155
  z: rot[2][0] * point.x + rot[2][1] * point.y + rot[2][2] * point.z
154
156
  };
155
157
  }
156
- var PITCH = 0;
157
- var YAW = 1;
158
- var ROLL = 2;
159
- var DEG2RAD_FACTOR = Math.PI / 180;
160
- var RAD2DEG_FACTOR = 180 / Math.PI;
161
158
  function axisComponent(vec, axis) {
162
159
  switch (axis) {
163
160
  case PITCH:
@@ -243,247 +240,9 @@ function vectorToAngles(vec) {
243
240
  }
244
241
  return { x: -pitch, y: yaw, z: 0 };
245
242
  }
246
- var STATE_SIZE = 624;
247
- var MIDDLE_WORD = 397;
248
- var MATRIX_A = 2567483615;
249
- var UPPER_MASK = 2147483648;
250
- var LOWER_MASK = 2147483647;
251
- var TWO_POW_32 = 4294967296;
252
- var MersenneTwister19937 = class {
253
- constructor(seed = 5489) {
254
- this.state = new Uint32Array(STATE_SIZE);
255
- this.index = STATE_SIZE;
256
- this.seed(seed);
257
- }
258
- seed(seed) {
259
- this.state[0] = seed >>> 0;
260
- for (let i = 1; i < STATE_SIZE; i++) {
261
- const prev = this.state[i - 1] ^ this.state[i - 1] >>> 30;
262
- const next = Math.imul(prev >>> 0, 1812433253) + i;
263
- this.state[i] = next >>> 0;
264
- }
265
- this.index = STATE_SIZE;
266
- }
267
- nextUint32() {
268
- if (this.index >= STATE_SIZE) {
269
- this.twist();
270
- }
271
- let y = this.state[this.index++];
272
- y ^= y >>> 11;
273
- y ^= y << 7 & 2636928640;
274
- y ^= y << 15 & 4022730752;
275
- y ^= y >>> 18;
276
- return y >>> 0;
277
- }
278
- twist() {
279
- for (let i = 0; i < STATE_SIZE; i++) {
280
- const y = this.state[i] & UPPER_MASK | this.state[(i + 1) % STATE_SIZE] & LOWER_MASK;
281
- let next = this.state[(i + MIDDLE_WORD) % STATE_SIZE] ^ y >>> 1;
282
- if ((y & 1) !== 0) {
283
- next ^= MATRIX_A;
284
- }
285
- this.state[i] = next >>> 0;
286
- }
287
- this.index = 0;
288
- }
289
- getState() {
290
- return {
291
- index: this.index,
292
- state: Array.from(this.state)
293
- };
294
- }
295
- setState(snapshot) {
296
- if (snapshot.state.length !== STATE_SIZE) {
297
- throw new Error(`Expected ${STATE_SIZE} MT state values, received ${snapshot.state.length}`);
298
- }
299
- this.index = snapshot.index;
300
- this.state = Uint32Array.from(snapshot.state, (value) => value >>> 0);
301
- }
302
- };
303
- var RandomGenerator = class {
304
- constructor(options = {}) {
305
- this.mt = new MersenneTwister19937(options.seed);
306
- }
307
- seed(seed) {
308
- this.mt.seed(seed);
309
- }
310
- /** Uniform float in [0, 1). */
311
- frandom() {
312
- return this.mt.nextUint32() / TWO_POW_32;
313
- }
314
- /** Uniform float in [min, max). */
315
- frandomRange(minInclusive, maxExclusive) {
316
- return minInclusive + (maxExclusive - minInclusive) * this.frandom();
317
- }
318
- /** Uniform float in [0, max). */
319
- frandomMax(maxExclusive) {
320
- return this.frandomRange(0, maxExclusive);
321
- }
322
- /** Uniform float in [-1, 1). */
323
- crandom() {
324
- return this.frandomRange(-1, 1);
325
- }
326
- /** Uniform float in (-1, 1). */
327
- crandomOpen() {
328
- const epsilon = Number.EPSILON;
329
- return this.frandomRange(-1 + epsilon, 1);
330
- }
331
- /** Raw uint32 sample. */
332
- irandomUint32() {
333
- return this.mt.nextUint32();
334
- }
335
- /** Uniform integer in [min, max). */
336
- irandomRange(minInclusive, maxExclusive) {
337
- if (maxExclusive - minInclusive <= 1) {
338
- return minInclusive;
339
- }
340
- const span = maxExclusive - minInclusive;
341
- const limit = TWO_POW_32 - TWO_POW_32 % span;
342
- let sample;
343
- do {
344
- sample = this.mt.nextUint32();
345
- } while (sample >= limit);
346
- return minInclusive + sample % span;
347
- }
348
- /** Uniform integer in [0, max). */
349
- irandom(maxExclusive) {
350
- if (maxExclusive <= 0) {
351
- return 0;
352
- }
353
- return this.irandomRange(0, maxExclusive);
354
- }
355
- /** Uniform time in milliseconds [min, max). */
356
- randomTimeRange(minMs, maxMs) {
357
- if (maxMs <= minMs) {
358
- return minMs;
359
- }
360
- return this.irandomRange(minMs, maxMs);
361
- }
362
- /** Uniform time in milliseconds [0, max). */
363
- randomTime(maxMs) {
364
- return this.irandom(maxMs);
365
- }
366
- randomIndex(container) {
367
- return this.irandom(container.length);
368
- }
369
- getState() {
370
- return { mt: this.mt.getState() };
371
- }
372
- setState(snapshot) {
373
- this.mt.setState(snapshot.mt);
374
- }
375
- };
376
243
  function createRandomGenerator(options) {
377
244
  return new RandomGenerator(options);
378
245
  }
379
- var CONTENTS_SOLID = 1 << 0;
380
- var CONTENTS_WINDOW = 1 << 1;
381
- var CONTENTS_AUX = 1 << 2;
382
- var CONTENTS_LAVA = 1 << 3;
383
- var CONTENTS_SLIME = 1 << 4;
384
- var CONTENTS_WATER = 1 << 5;
385
- var CONTENTS_MIST = 1 << 6;
386
- var CONTENTS_NO_WATERJUMP = 1 << 13;
387
- var CONTENTS_PROJECTILECLIP = 1 << 14;
388
- var CONTENTS_AREAPORTAL = 1 << 15;
389
- var CONTENTS_PLAYERCLIP = 1 << 16;
390
- var CONTENTS_MONSTERCLIP = 1 << 17;
391
- var CONTENTS_CURRENT_0 = 1 << 18;
392
- var CONTENTS_CURRENT_90 = 1 << 19;
393
- var CONTENTS_CURRENT_180 = 1 << 20;
394
- var CONTENTS_CURRENT_270 = 1 << 21;
395
- var CONTENTS_CURRENT_UP = 1 << 22;
396
- var CONTENTS_CURRENT_DOWN = 1 << 23;
397
- var CONTENTS_ORIGIN = 1 << 24;
398
- var CONTENTS_MONSTER = 1 << 25;
399
- var CONTENTS_DEADMONSTER = 1 << 26;
400
- var CONTENTS_DETAIL = 1 << 27;
401
- var CONTENTS_TRANSLUCENT = 1 << 28;
402
- var CONTENTS_LADDER = 1 << 29;
403
- var CONTENTS_PLAYER = 1 << 30;
404
- var CONTENTS_PROJECTILE = 1 << 31;
405
- var SURF_LIGHT = 1 << 0;
406
- var SURF_SLICK = 1 << 1;
407
- var SURF_SKY = 1 << 2;
408
- var SURF_WARP = 1 << 3;
409
- var SURF_TRANS33 = 1 << 4;
410
- var SURF_TRANS66 = 1 << 5;
411
- var SURF_FLOWING = 1 << 6;
412
- var SURF_NODRAW = 1 << 7;
413
- var SURF_ALPHATEST = 1 << 25;
414
- var SURF_N64_UV = 1 << 28;
415
- var SURF_N64_SCROLL_X = 1 << 29;
416
- var SURF_N64_SCROLL_Y = 1 << 30;
417
- var SURF_N64_SCROLL_FLIP = 1 << 31;
418
- var MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
419
- var MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
420
- var MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
421
- var MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
422
- var MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
423
- var MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
424
- var MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
425
- var MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
426
- var MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
427
- var MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
428
- var MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
429
- var MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
430
- var MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
431
- var MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;
432
- var CvarFlags = /* @__PURE__ */ ((CvarFlags2) => {
433
- CvarFlags2[CvarFlags2["None"] = 0] = "None";
434
- CvarFlags2[CvarFlags2["Archive"] = 1] = "Archive";
435
- CvarFlags2[CvarFlags2["UserInfo"] = 2] = "UserInfo";
436
- CvarFlags2[CvarFlags2["ServerInfo"] = 4] = "ServerInfo";
437
- CvarFlags2[CvarFlags2["Latch"] = 8] = "Latch";
438
- CvarFlags2[CvarFlags2["Cheat"] = 16] = "Cheat";
439
- return CvarFlags2;
440
- })(CvarFlags || {});
441
- var MAX_CLIENTS = 256;
442
- var MAX_LIGHTSTYLES = 256;
443
- var MAX_MODELS = 8192;
444
- var MAX_SOUNDS = 2048;
445
- var MAX_IMAGES = 512;
446
- var MAX_ITEMS = 256;
447
- var MAX_GENERAL = MAX_CLIENTS * 2;
448
- var MAX_SHADOW_LIGHTS = 256;
449
- var MAX_WHEEL_ITEMS = 32;
450
- var ConfigStringIndex = ((ConfigStringIndex2) => {
451
- ConfigStringIndex2[ConfigStringIndex2["Name"] = 0] = "Name";
452
- ConfigStringIndex2[ConfigStringIndex2["CdTrack"] = 1] = "CdTrack";
453
- ConfigStringIndex2[ConfigStringIndex2["Sky"] = 2] = "Sky";
454
- ConfigStringIndex2[ConfigStringIndex2["SkyAxis"] = 3] = "SkyAxis";
455
- ConfigStringIndex2[ConfigStringIndex2["SkyRotate"] = 4] = "SkyRotate";
456
- ConfigStringIndex2[ConfigStringIndex2["StatusBar"] = 5] = "StatusBar";
457
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_N64_PHYSICS"] = 56] = "CONFIG_N64_PHYSICS";
458
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_CTF_TEAMS"] = 57] = "CONFIG_CTF_TEAMS";
459
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_COOP_RESPAWN_STRING"] = 58] = "CONFIG_COOP_RESPAWN_STRING";
460
- ConfigStringIndex2[ConfigStringIndex2["AirAccel"] = 59] = "AirAccel";
461
- ConfigStringIndex2[ConfigStringIndex2["MaxClients"] = 60] = "MaxClients";
462
- ConfigStringIndex2[ConfigStringIndex2["MapChecksum"] = 61] = "MapChecksum";
463
- ConfigStringIndex2[ConfigStringIndex2["Models"] = 62] = "Models";
464
- ConfigStringIndex2[ConfigStringIndex2["Sounds"] = 62 + MAX_MODELS] = "Sounds";
465
- ConfigStringIndex2[ConfigStringIndex2["Images"] = ConfigStringIndex2.Sounds + MAX_SOUNDS] = "Images";
466
- ConfigStringIndex2[ConfigStringIndex2["Lights"] = ConfigStringIndex2.Images + MAX_IMAGES] = "Lights";
467
- ConfigStringIndex2[ConfigStringIndex2["ShadowLights"] = ConfigStringIndex2.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
468
- ConfigStringIndex2[ConfigStringIndex2["Items"] = ConfigStringIndex2.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
469
- ConfigStringIndex2[ConfigStringIndex2["PlayerSkins"] = ConfigStringIndex2.Items + MAX_ITEMS] = "PlayerSkins";
470
- ConfigStringIndex2[ConfigStringIndex2["General"] = ConfigStringIndex2.PlayerSkins + MAX_CLIENTS] = "General";
471
- ConfigStringIndex2[ConfigStringIndex2["WheelWeapons"] = ConfigStringIndex2.General + MAX_GENERAL] = "WheelWeapons";
472
- ConfigStringIndex2[ConfigStringIndex2["WheelAmmo"] = ConfigStringIndex2.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
473
- ConfigStringIndex2[ConfigStringIndex2["WheelPowerups"] = ConfigStringIndex2.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
474
- ConfigStringIndex2[ConfigStringIndex2["CdLoopCount"] = ConfigStringIndex2.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
475
- ConfigStringIndex2[ConfigStringIndex2["GameStyle"] = ConfigStringIndex2.CdLoopCount + 1] = "GameStyle";
476
- ConfigStringIndex2[ConfigStringIndex2["MaxConfigStrings"] = ConfigStringIndex2.GameStyle + 1] = "MaxConfigStrings";
477
- return ConfigStringIndex2;
478
- })(ConfigStringIndex || {});
479
- var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
480
- var replay_exports = {};
481
- __export(replay_exports, {
482
- addReplayFrame: () => addReplayFrame,
483
- createReplaySession: () => createReplaySession,
484
- deserializeReplay: () => deserializeReplay,
485
- serializeReplay: () => serializeReplay
486
- });
487
246
  function serializeReplay(session) {
488
247
  return JSON.stringify(session, null, 2);
489
248
  }
@@ -512,13 +271,6 @@ function addReplayFrame(session, cmd, serverFrame, startTime) {
512
271
  timestamp: Date.now() - startTime
513
272
  });
514
273
  }
515
- var WaterLevel = /* @__PURE__ */ ((WaterLevel4) => {
516
- WaterLevel4[WaterLevel4["None"] = 0] = "None";
517
- WaterLevel4[WaterLevel4["Feet"] = 1] = "Feet";
518
- WaterLevel4[WaterLevel4["Waist"] = 2] = "Waist";
519
- WaterLevel4[WaterLevel4["Under"] = 3] = "Under";
520
- return WaterLevel4;
521
- })(WaterLevel || {});
522
274
  function applyPmoveFriction(params) {
523
275
  const {
524
276
  velocity,
@@ -617,111 +369,6 @@ function buildWaterWish(params) {
617
369
  wishspeed
618
370
  };
619
371
  }
620
- var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
621
- var ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
622
- ServerCommand22[ServerCommand22["bad"] = 0] = "bad";
623
- ServerCommand22[ServerCommand22["muzzleflash"] = 1] = "muzzleflash";
624
- ServerCommand22[ServerCommand22["muzzleflash2"] = 2] = "muzzleflash2";
625
- ServerCommand22[ServerCommand22["temp_entity"] = 3] = "temp_entity";
626
- ServerCommand22[ServerCommand22["layout"] = 4] = "layout";
627
- ServerCommand22[ServerCommand22["inventory"] = 5] = "inventory";
628
- ServerCommand22[ServerCommand22["nop"] = 6] = "nop";
629
- ServerCommand22[ServerCommand22["disconnect"] = 7] = "disconnect";
630
- ServerCommand22[ServerCommand22["reconnect"] = 8] = "reconnect";
631
- ServerCommand22[ServerCommand22["sound"] = 9] = "sound";
632
- ServerCommand22[ServerCommand22["print"] = 10] = "print";
633
- ServerCommand22[ServerCommand22["stufftext"] = 11] = "stufftext";
634
- ServerCommand22[ServerCommand22["serverdata"] = 12] = "serverdata";
635
- ServerCommand22[ServerCommand22["configstring"] = 13] = "configstring";
636
- ServerCommand22[ServerCommand22["spawnbaseline"] = 14] = "spawnbaseline";
637
- ServerCommand22[ServerCommand22["centerprint"] = 15] = "centerprint";
638
- ServerCommand22[ServerCommand22["download"] = 16] = "download";
639
- ServerCommand22[ServerCommand22["playerinfo"] = 17] = "playerinfo";
640
- ServerCommand22[ServerCommand22["packetentities"] = 18] = "packetentities";
641
- ServerCommand22[ServerCommand22["deltapacketentities"] = 19] = "deltapacketentities";
642
- ServerCommand22[ServerCommand22["frame"] = 20] = "frame";
643
- ServerCommand22[ServerCommand22["splitclient"] = 21] = "splitclient";
644
- ServerCommand22[ServerCommand22["configblast"] = 22] = "configblast";
645
- ServerCommand22[ServerCommand22["spawnbaselineblast"] = 23] = "spawnbaselineblast";
646
- ServerCommand22[ServerCommand22["level_restart"] = 24] = "level_restart";
647
- ServerCommand22[ServerCommand22["damage"] = 25] = "damage";
648
- ServerCommand22[ServerCommand22["locprint"] = 26] = "locprint";
649
- ServerCommand22[ServerCommand22["fog"] = 27] = "fog";
650
- ServerCommand22[ServerCommand22["waitingforplayers"] = 28] = "waitingforplayers";
651
- ServerCommand22[ServerCommand22["bot_chat"] = 29] = "bot_chat";
652
- ServerCommand22[ServerCommand22["poi"] = 30] = "poi";
653
- ServerCommand22[ServerCommand22["help_path"] = 31] = "help_path";
654
- ServerCommand22[ServerCommand22["muzzleflash3"] = 32] = "muzzleflash3";
655
- ServerCommand22[ServerCommand22["achievement"] = 33] = "achievement";
656
- return ServerCommand22;
657
- })(ServerCommand || {});
658
- var TempEntity = /* @__PURE__ */ ((TempEntity2) => {
659
- TempEntity2[TempEntity2["GUNSHOT"] = 0] = "GUNSHOT";
660
- TempEntity2[TempEntity2["BLOOD"] = 1] = "BLOOD";
661
- TempEntity2[TempEntity2["BLASTER"] = 2] = "BLASTER";
662
- TempEntity2[TempEntity2["RAILTRAIL"] = 3] = "RAILTRAIL";
663
- TempEntity2[TempEntity2["SHOTGUN"] = 4] = "SHOTGUN";
664
- TempEntity2[TempEntity2["EXPLOSION1"] = 5] = "EXPLOSION1";
665
- TempEntity2[TempEntity2["EXPLOSION2"] = 6] = "EXPLOSION2";
666
- TempEntity2[TempEntity2["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
667
- TempEntity2[TempEntity2["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
668
- TempEntity2[TempEntity2["SPARKS"] = 9] = "SPARKS";
669
- TempEntity2[TempEntity2["SPLASH"] = 10] = "SPLASH";
670
- TempEntity2[TempEntity2["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
671
- TempEntity2[TempEntity2["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
672
- TempEntity2[TempEntity2["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
673
- TempEntity2[TempEntity2["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
674
- TempEntity2[TempEntity2["LASER_SPARKS"] = 15] = "LASER_SPARKS";
675
- TempEntity2[TempEntity2["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
676
- TempEntity2[TempEntity2["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
677
- TempEntity2[TempEntity2["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
678
- TempEntity2[TempEntity2["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
679
- TempEntity2[TempEntity2["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
680
- TempEntity2[TempEntity2["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
681
- TempEntity2[TempEntity2["BOSSTPORT"] = 22] = "BOSSTPORT";
682
- TempEntity2[TempEntity2["BFG_LASER"] = 23] = "BFG_LASER";
683
- TempEntity2[TempEntity2["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
684
- TempEntity2[TempEntity2["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
685
- TempEntity2[TempEntity2["GREENBLOOD"] = 26] = "GREENBLOOD";
686
- TempEntity2[TempEntity2["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
687
- TempEntity2[TempEntity2["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
688
- TempEntity2[TempEntity2["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
689
- TempEntity2[TempEntity2["BLASTER2"] = 30] = "BLASTER2";
690
- TempEntity2[TempEntity2["RAILTRAIL2"] = 31] = "RAILTRAIL2";
691
- TempEntity2[TempEntity2["FLAME"] = 32] = "FLAME";
692
- TempEntity2[TempEntity2["LIGHTNING"] = 33] = "LIGHTNING";
693
- TempEntity2[TempEntity2["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
694
- TempEntity2[TempEntity2["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
695
- TempEntity2[TempEntity2["FLASHLIGHT"] = 36] = "FLASHLIGHT";
696
- TempEntity2[TempEntity2["FORCEWALL"] = 37] = "FORCEWALL";
697
- TempEntity2[TempEntity2["HEATBEAM"] = 38] = "HEATBEAM";
698
- TempEntity2[TempEntity2["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
699
- TempEntity2[TempEntity2["STEAM"] = 40] = "STEAM";
700
- TempEntity2[TempEntity2["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
701
- TempEntity2[TempEntity2["MOREBLOOD"] = 42] = "MOREBLOOD";
702
- TempEntity2[TempEntity2["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
703
- TempEntity2[TempEntity2["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
704
- TempEntity2[TempEntity2["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
705
- TempEntity2[TempEntity2["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
706
- TempEntity2[TempEntity2["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
707
- TempEntity2[TempEntity2["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
708
- TempEntity2[TempEntity2["DBALL_GOAL"] = 49] = "DBALL_GOAL";
709
- TempEntity2[TempEntity2["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
710
- TempEntity2[TempEntity2["NUKEBLAST"] = 51] = "NUKEBLAST";
711
- TempEntity2[TempEntity2["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
712
- TempEntity2[TempEntity2["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
713
- TempEntity2[TempEntity2["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
714
- TempEntity2[TempEntity2["FLECHETTE"] = 55] = "FLECHETTE";
715
- TempEntity2[TempEntity2["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
716
- TempEntity2[TempEntity2["BFG_ZAP"] = 57] = "BFG_ZAP";
717
- TempEntity2[TempEntity2["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
718
- TempEntity2[TempEntity2["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
719
- TempEntity2[TempEntity2["POWER_SPLASH"] = 60] = "POWER_SPLASH";
720
- TempEntity2[TempEntity2["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
721
- TempEntity2[TempEntity2["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
722
- TempEntity2[TempEntity2["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
723
- return TempEntity2;
724
- })(TempEntity || {});
725
372
  function toSigned16(val) {
726
373
  return val << 16 >> 16;
727
374
  }
@@ -767,191 +414,6 @@ function setCompressedInteger(stats, startIndex, id, count, bitsPerValue) {
767
414
  const valueToWrite = base & ~mask | count << bitShift & mask;
768
415
  writeUint16LE(stats, startIndex, byteOffset, valueToWrite & 65535);
769
416
  }
770
- var PowerupId = /* @__PURE__ */ ((PowerupId22) => {
771
- PowerupId22["QuadDamage"] = "quad";
772
- PowerupId22["Invulnerability"] = "invulnerability";
773
- PowerupId22["EnviroSuit"] = "enviro_suit";
774
- PowerupId22["Rebreather"] = "rebreather";
775
- PowerupId22["Silencer"] = "silencer";
776
- PowerupId22["PowerScreen"] = "power_screen";
777
- PowerupId22["PowerShield"] = "power_shield";
778
- PowerupId22["QuadFire"] = "quad_fire";
779
- PowerupId22["Invisibility"] = "invisibility";
780
- PowerupId22["Bandolier"] = "bandolier";
781
- PowerupId22["AmmoPack"] = "ammo_pack";
782
- PowerupId22["IRGoggles"] = "ir_goggles";
783
- PowerupId22["DoubleDamage"] = "double_damage";
784
- PowerupId22["SphereVengeance"] = "sphere_vengeance";
785
- PowerupId22["SphereHunter"] = "sphere_hunter";
786
- PowerupId22["SphereDefender"] = "sphere_defender";
787
- PowerupId22["Doppelganger"] = "doppelganger";
788
- PowerupId22["TagToken"] = "tag_token";
789
- PowerupId22["TechResistance"] = "tech_resistance";
790
- PowerupId22["TechStrength"] = "tech_strength";
791
- PowerupId22["TechHaste"] = "tech_haste";
792
- PowerupId22["TechRegeneration"] = "tech_regeneration";
793
- PowerupId22["Flashlight"] = "flashlight";
794
- PowerupId22["Compass"] = "compass";
795
- return PowerupId22;
796
- })(PowerupId || {});
797
- var PlayerStat = /* @__PURE__ */ ((PlayerStat2) => {
798
- PlayerStat2[PlayerStat2["STAT_HEALTH_ICON"] = 0] = "STAT_HEALTH_ICON";
799
- PlayerStat2[PlayerStat2["STAT_HEALTH"] = 1] = "STAT_HEALTH";
800
- PlayerStat2[PlayerStat2["STAT_AMMO_ICON"] = 2] = "STAT_AMMO_ICON";
801
- PlayerStat2[PlayerStat2["STAT_AMMO"] = 3] = "STAT_AMMO";
802
- PlayerStat2[PlayerStat2["STAT_ARMOR_ICON"] = 4] = "STAT_ARMOR_ICON";
803
- PlayerStat2[PlayerStat2["STAT_ARMOR"] = 5] = "STAT_ARMOR";
804
- PlayerStat2[PlayerStat2["STAT_SELECTED_ICON"] = 6] = "STAT_SELECTED_ICON";
805
- PlayerStat2[PlayerStat2["STAT_PICKUP_ICON"] = 7] = "STAT_PICKUP_ICON";
806
- PlayerStat2[PlayerStat2["STAT_PICKUP_STRING"] = 8] = "STAT_PICKUP_STRING";
807
- PlayerStat2[PlayerStat2["STAT_TIMER_ICON"] = 9] = "STAT_TIMER_ICON";
808
- PlayerStat2[PlayerStat2["STAT_TIMER"] = 10] = "STAT_TIMER";
809
- PlayerStat2[PlayerStat2["STAT_HELPICON"] = 11] = "STAT_HELPICON";
810
- PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM"] = 12] = "STAT_SELECTED_ITEM";
811
- PlayerStat2[PlayerStat2["STAT_LAYOUTS"] = 13] = "STAT_LAYOUTS";
812
- PlayerStat2[PlayerStat2["STAT_FRAGS"] = 14] = "STAT_FRAGS";
813
- PlayerStat2[PlayerStat2["STAT_FLASHES"] = 15] = "STAT_FLASHES";
814
- PlayerStat2[PlayerStat2["STAT_CHASE"] = 16] = "STAT_CHASE";
815
- PlayerStat2[PlayerStat2["STAT_SPECTATOR"] = 17] = "STAT_SPECTATOR";
816
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_PIC"] = 18] = "STAT_CTF_TEAM1_PIC";
817
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_CAPS"] = 19] = "STAT_CTF_TEAM1_CAPS";
818
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_PIC"] = 20] = "STAT_CTF_TEAM2_PIC";
819
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_CAPS"] = 21] = "STAT_CTF_TEAM2_CAPS";
820
- PlayerStat2[PlayerStat2["STAT_CTF_FLAG_PIC"] = 22] = "STAT_CTF_FLAG_PIC";
821
- PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM1_PIC"] = 23] = "STAT_CTF_JOINED_TEAM1_PIC";
822
- PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM2_PIC"] = 24] = "STAT_CTF_JOINED_TEAM2_PIC";
823
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_HEADER"] = 25] = "STAT_CTF_TEAM1_HEADER";
824
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_HEADER"] = 26] = "STAT_CTF_TEAM2_HEADER";
825
- PlayerStat2[PlayerStat2["STAT_CTF_TECH"] = 27] = "STAT_CTF_TECH";
826
- PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW"] = 28] = "STAT_CTF_ID_VIEW";
827
- PlayerStat2[PlayerStat2["STAT_CTF_MATCH"] = 29] = "STAT_CTF_MATCH";
828
- PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW_COLOR"] = 30] = "STAT_CTF_ID_VIEW_COLOR";
829
- PlayerStat2[PlayerStat2["STAT_CTF_TEAMINFO"] = 31] = "STAT_CTF_TEAMINFO";
830
- PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_1"] = 32] = "STAT_WEAPONS_OWNED_1";
831
- PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_2"] = 33] = "STAT_WEAPONS_OWNED_2";
832
- PlayerStat2[PlayerStat2["STAT_AMMO_INFO_START"] = 34] = "STAT_AMMO_INFO_START";
833
- PlayerStat2[PlayerStat2["STAT_POWERUP_INFO_START"] = 41] = "STAT_POWERUP_INFO_START";
834
- PlayerStat2[PlayerStat2["STAT_KEY_A"] = 44] = "STAT_KEY_A";
835
- PlayerStat2[PlayerStat2["STAT_KEY_B"] = 45] = "STAT_KEY_B";
836
- PlayerStat2[PlayerStat2["STAT_KEY_C"] = 46] = "STAT_KEY_C";
837
- PlayerStat2[PlayerStat2["STAT_ACTIVE_WHEEL_WEAPON"] = 47] = "STAT_ACTIVE_WHEEL_WEAPON";
838
- PlayerStat2[PlayerStat2["STAT_COOP_RESPAWN"] = 48] = "STAT_COOP_RESPAWN";
839
- PlayerStat2[PlayerStat2["STAT_LIVES"] = 49] = "STAT_LIVES";
840
- PlayerStat2[PlayerStat2["STAT_HIT_MARKER"] = 50] = "STAT_HIT_MARKER";
841
- PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM_NAME"] = 51] = "STAT_SELECTED_ITEM_NAME";
842
- PlayerStat2[PlayerStat2["STAT_HEALTH_BARS"] = 52] = "STAT_HEALTH_BARS";
843
- PlayerStat2[PlayerStat2["STAT_ACTIVE_WEAPON"] = 53] = "STAT_ACTIVE_WEAPON";
844
- PlayerStat2[PlayerStat2["STAT_LAST"] = 54] = "STAT_LAST";
845
- return PlayerStat2;
846
- })(PlayerStat || {});
847
- var AMMO_MAX = 12;
848
- var NUM_BITS_FOR_AMMO = 9;
849
- var NUM_AMMO_STATS = Math.ceil(AMMO_MAX * NUM_BITS_FOR_AMMO / 16);
850
- var POWERUP_MAX = 23;
851
- var NUM_BITS_FOR_POWERUP = 2;
852
- var NUM_POWERUP_STATS = Math.ceil(POWERUP_MAX * NUM_BITS_FOR_POWERUP / 16);
853
- var POWERUP_STAT_MAP = {
854
- [
855
- "power_screen"
856
- /* PowerScreen */
857
- ]: 0,
858
- [
859
- "power_shield"
860
- /* PowerShield */
861
- ]: 1,
862
- // 2 is POWERUP_AM_BOMB (not in PowerupId?)
863
- [
864
- "quad"
865
- /* QuadDamage */
866
- ]: 3,
867
- [
868
- "quad_fire"
869
- /* QuadFire */
870
- ]: 4,
871
- [
872
- "invulnerability"
873
- /* Invulnerability */
874
- ]: 5,
875
- [
876
- "invisibility"
877
- /* Invisibility */
878
- ]: 6,
879
- [
880
- "silencer"
881
- /* Silencer */
882
- ]: 7,
883
- [
884
- "rebreather"
885
- /* Rebreather */
886
- ]: 8,
887
- [
888
- "enviro_suit"
889
- /* EnviroSuit */
890
- ]: 9,
891
- [
892
- "bandolier"
893
- /* Bandolier */
894
- ]: 10,
895
- // Placeholder/Map mismatch handling?
896
- [
897
- "ammo_pack"
898
- /* AmmoPack */
899
- ]: 10,
900
- // Original reused indices or had gaps?
901
- [
902
- "ir_goggles"
903
- /* IRGoggles */
904
- ]: 11,
905
- [
906
- "double_damage"
907
- /* DoubleDamage */
908
- ]: 12,
909
- [
910
- "sphere_vengeance"
911
- /* SphereVengeance */
912
- ]: 13,
913
- [
914
- "sphere_hunter"
915
- /* SphereHunter */
916
- ]: 14,
917
- [
918
- "sphere_defender"
919
- /* SphereDefender */
920
- ]: 15,
921
- [
922
- "doppelganger"
923
- /* Doppelganger */
924
- ]: 16,
925
- [
926
- "flashlight"
927
- /* Flashlight */
928
- ]: 17,
929
- [
930
- "compass"
931
- /* Compass */
932
- ]: 18,
933
- [
934
- "tech_resistance"
935
- /* TechResistance */
936
- ]: 19,
937
- [
938
- "tech_strength"
939
- /* TechStrength */
940
- ]: 20,
941
- [
942
- "tech_haste"
943
- /* TechHaste */
944
- ]: 21,
945
- [
946
- "tech_regeneration"
947
- /* TechRegeneration */
948
- ]: 22,
949
- // Add missing mappings to avoid runtime lookups failing for new types
950
- [
951
- "tag_token"
952
- /* TagToken */
953
- ]: -1
954
- };
955
417
  function G_SetAmmoStat(stats, ammoId, count) {
956
418
  if (ammoId < 0 || ammoId >= AMMO_MAX) return;
957
419
  let val = count;
@@ -972,228 +434,800 @@ function G_SetPowerupStat(stats, powerupId, val) {
972
434
  if (safeVal < 0) safeVal = 0;
973
435
  setCompressedInteger(stats, 41, index, safeVal, NUM_BITS_FOR_POWERUP);
974
436
  }
975
- var entityFlags_exports = {};
976
- __export(entityFlags_exports, {
977
- U_ANGLE1: () => U_ANGLE1,
978
- U_ANGLE2: () => U_ANGLE2,
979
- U_ANGLE3: () => U_ANGLE3,
980
- U_EFFECTS: () => U_EFFECTS,
981
- U_EVENT: () => U_EVENT,
982
- U_FRAME: () => U_FRAME,
983
- U_MODEL: () => U_MODEL,
984
- U_MODEL2: () => U_MODEL2,
985
- U_MODEL3: () => U_MODEL3,
986
- U_MODEL4: () => U_MODEL4,
987
- U_MOREBITS: () => U_MOREBITS,
988
- U_NUMBER: () => U_NUMBER,
989
- U_ORIGIN1: () => U_ORIGIN1,
990
- U_ORIGIN2: () => U_ORIGIN2,
991
- U_ORIGIN3: () => U_ORIGIN3,
992
- U_REMOVE: () => U_REMOVE,
993
- U_RENDERFX: () => U_RENDERFX,
994
- U_SKIN: () => U_SKIN,
995
- U_SOLID: () => U_SOLID,
996
- U_SOUND: () => U_SOUND
437
+ var __defProp2, __export2, ZERO_VEC3, STOP_EPSILON, DEG_TO_RAD, PITCH, YAW, ROLL, DEG2RAD_FACTOR, RAD2DEG_FACTOR, STATE_SIZE, MIDDLE_WORD, MATRIX_A, UPPER_MASK, LOWER_MASK, TWO_POW_32, MersenneTwister19937, RandomGenerator, CONTENTS_SOLID, CONTENTS_WINDOW, CONTENTS_AUX, CONTENTS_LAVA, CONTENTS_SLIME, CONTENTS_WATER, CONTENTS_MIST, CONTENTS_NO_WATERJUMP, CONTENTS_PROJECTILECLIP, CONTENTS_AREAPORTAL, CONTENTS_PLAYERCLIP, CONTENTS_MONSTERCLIP, CONTENTS_CURRENT_0, CONTENTS_CURRENT_90, CONTENTS_CURRENT_180, CONTENTS_CURRENT_270, CONTENTS_CURRENT_UP, CONTENTS_CURRENT_DOWN, CONTENTS_ORIGIN, CONTENTS_MONSTER, CONTENTS_DEADMONSTER, CONTENTS_DETAIL, CONTENTS_TRANSLUCENT, CONTENTS_LADDER, CONTENTS_PLAYER, CONTENTS_PROJECTILE, SURF_LIGHT, SURF_SLICK, SURF_SKY, SURF_WARP, SURF_TRANS33, SURF_TRANS66, SURF_FLOWING, SURF_NODRAW, SURF_ALPHATEST, SURF_N64_UV, SURF_N64_SCROLL_X, SURF_N64_SCROLL_Y, SURF_N64_SCROLL_FLIP, MASK_SOLID, MASK_PLAYERSOLID, MASK_DEADSOLID, MASK_MONSTERSOLID, MASK_WATER, MASK_OPAQUE, MASK_SHOT, MASK_CURRENT, MASK_BLOCK_SIGHT, MASK_NAV_SOLID, MASK_LADDER_NAV_SOLID, MASK_WALK_NAV_SOLID, MASK_PROJECTILE, MAX_CHECKCOUNT, CvarFlags, MAX_CLIENTS, MAX_LIGHTSTYLES, MAX_MODELS, MAX_SOUNDS, MAX_IMAGES, MAX_ITEMS, MAX_GENERAL, MAX_SHADOW_LIGHTS, MAX_WHEEL_ITEMS, ConfigStringIndex, MAX_CONFIGSTRINGS, replay_exports, WaterLevel, WATERJUMP_CLEAR, ServerCommand, TempEntity, MZ_BLASTER, MZ_MACHINEGUN, MZ_SHOTGUN, MZ_CHAINGUN1, MZ_RAILGUN, MZ_ROCKET, MZ_GRENADE, MZ_SSHOTGUN, MZ_BFG, MZ_HYPERBLASTER, PowerupId, PlayerStat, AMMO_MAX, NUM_BITS_FOR_AMMO, NUM_AMMO_STATS, POWERUP_MAX, NUM_BITS_FOR_POWERUP, NUM_POWERUP_STATS, POWERUP_STAT_MAP, RenderFx, entityFlags_exports, U_NUMBER, U_MODEL, U_SOUND, U_ORIGIN1, U_ORIGIN2, U_ORIGIN3, U_ANGLE1, U_ANGLE2, U_ANGLE3, U_FRAME, U_SKIN, U_EFFECTS, U_RENDERFX, U_SOLID, U_EVENT, U_MOREBITS, U_MODEL2, U_MODEL3, U_MODEL4, U_REMOVE, FRAMETIME, MASK_WATER2, WaterLevel3, categorizePosition2, checkWater, applyPmove, WeaponId, AmmoType, AMMO_TYPE_COUNT, AmmoItemId, WEAPON_WHEEL_ORDER;
438
+ var init_esm = __esm({
439
+ "../shared/dist/esm/index.js"() {
440
+ "use strict";
441
+ __defProp2 = Object.defineProperty;
442
+ __export2 = (target, all) => {
443
+ for (var name in all)
444
+ __defProp2(target, name, { get: all[name], enumerable: true });
445
+ };
446
+ ZERO_VEC3 = { x: 0, y: 0, z: 0 };
447
+ STOP_EPSILON = 0.1;
448
+ DEG_TO_RAD = Math.PI / 180;
449
+ PITCH = 0;
450
+ YAW = 1;
451
+ ROLL = 2;
452
+ DEG2RAD_FACTOR = Math.PI / 180;
453
+ RAD2DEG_FACTOR = 180 / Math.PI;
454
+ STATE_SIZE = 624;
455
+ MIDDLE_WORD = 397;
456
+ MATRIX_A = 2567483615;
457
+ UPPER_MASK = 2147483648;
458
+ LOWER_MASK = 2147483647;
459
+ TWO_POW_32 = 4294967296;
460
+ MersenneTwister19937 = class {
461
+ constructor(seed = 5489) {
462
+ this.state = new Uint32Array(STATE_SIZE);
463
+ this.index = STATE_SIZE;
464
+ this.seed(seed);
465
+ }
466
+ seed(seed) {
467
+ this.state[0] = seed >>> 0;
468
+ for (let i = 1; i < STATE_SIZE; i++) {
469
+ const prev = this.state[i - 1] ^ this.state[i - 1] >>> 30;
470
+ const next = Math.imul(prev >>> 0, 1812433253) + i;
471
+ this.state[i] = next >>> 0;
472
+ }
473
+ this.index = STATE_SIZE;
474
+ }
475
+ nextUint32() {
476
+ if (this.index >= STATE_SIZE) {
477
+ this.twist();
478
+ }
479
+ let y = this.state[this.index++];
480
+ y ^= y >>> 11;
481
+ y ^= y << 7 & 2636928640;
482
+ y ^= y << 15 & 4022730752;
483
+ y ^= y >>> 18;
484
+ return y >>> 0;
485
+ }
486
+ twist() {
487
+ for (let i = 0; i < STATE_SIZE; i++) {
488
+ const y = this.state[i] & UPPER_MASK | this.state[(i + 1) % STATE_SIZE] & LOWER_MASK;
489
+ let next = this.state[(i + MIDDLE_WORD) % STATE_SIZE] ^ y >>> 1;
490
+ if ((y & 1) !== 0) {
491
+ next ^= MATRIX_A;
492
+ }
493
+ this.state[i] = next >>> 0;
494
+ }
495
+ this.index = 0;
496
+ }
497
+ getState() {
498
+ return {
499
+ index: this.index,
500
+ state: Array.from(this.state)
501
+ };
502
+ }
503
+ setState(snapshot) {
504
+ if (snapshot.state.length !== STATE_SIZE) {
505
+ throw new Error(`Expected ${STATE_SIZE} MT state values, received ${snapshot.state.length}`);
506
+ }
507
+ this.index = snapshot.index;
508
+ this.state = Uint32Array.from(snapshot.state, (value) => value >>> 0);
509
+ }
510
+ };
511
+ RandomGenerator = class {
512
+ constructor(options = {}) {
513
+ this.mt = new MersenneTwister19937(options.seed);
514
+ }
515
+ seed(seed) {
516
+ this.mt.seed(seed);
517
+ }
518
+ /** Uniform float in [0, 1). */
519
+ frandom() {
520
+ return this.mt.nextUint32() / TWO_POW_32;
521
+ }
522
+ /** Uniform float in [min, max). */
523
+ frandomRange(minInclusive, maxExclusive) {
524
+ return minInclusive + (maxExclusive - minInclusive) * this.frandom();
525
+ }
526
+ /** Uniform float in [0, max). */
527
+ frandomMax(maxExclusive) {
528
+ return this.frandomRange(0, maxExclusive);
529
+ }
530
+ /** Uniform float in [-1, 1). */
531
+ crandom() {
532
+ return this.frandomRange(-1, 1);
533
+ }
534
+ /** Uniform float in (-1, 1). */
535
+ crandomOpen() {
536
+ const epsilon = Number.EPSILON;
537
+ return this.frandomRange(-1 + epsilon, 1);
538
+ }
539
+ /** Raw uint32 sample. */
540
+ irandomUint32() {
541
+ return this.mt.nextUint32();
542
+ }
543
+ /** Uniform integer in [min, max). */
544
+ irandomRange(minInclusive, maxExclusive) {
545
+ if (maxExclusive - minInclusive <= 1) {
546
+ return minInclusive;
547
+ }
548
+ const span = maxExclusive - minInclusive;
549
+ const limit = TWO_POW_32 - TWO_POW_32 % span;
550
+ let sample;
551
+ do {
552
+ sample = this.mt.nextUint32();
553
+ } while (sample >= limit);
554
+ return minInclusive + sample % span;
555
+ }
556
+ /** Uniform integer in [0, max). */
557
+ irandom(maxExclusive) {
558
+ if (maxExclusive <= 0) {
559
+ return 0;
560
+ }
561
+ return this.irandomRange(0, maxExclusive);
562
+ }
563
+ /** Uniform time in milliseconds [min, max). */
564
+ randomTimeRange(minMs, maxMs) {
565
+ if (maxMs <= minMs) {
566
+ return minMs;
567
+ }
568
+ return this.irandomRange(minMs, maxMs);
569
+ }
570
+ /** Uniform time in milliseconds [0, max). */
571
+ randomTime(maxMs) {
572
+ return this.irandom(maxMs);
573
+ }
574
+ randomIndex(container) {
575
+ return this.irandom(container.length);
576
+ }
577
+ getState() {
578
+ return { mt: this.mt.getState() };
579
+ }
580
+ setState(snapshot) {
581
+ this.mt.setState(snapshot.mt);
582
+ }
583
+ };
584
+ CONTENTS_SOLID = 1 << 0;
585
+ CONTENTS_WINDOW = 1 << 1;
586
+ CONTENTS_AUX = 1 << 2;
587
+ CONTENTS_LAVA = 1 << 3;
588
+ CONTENTS_SLIME = 1 << 4;
589
+ CONTENTS_WATER = 1 << 5;
590
+ CONTENTS_MIST = 1 << 6;
591
+ CONTENTS_NO_WATERJUMP = 1 << 13;
592
+ CONTENTS_PROJECTILECLIP = 1 << 14;
593
+ CONTENTS_AREAPORTAL = 1 << 15;
594
+ CONTENTS_PLAYERCLIP = 1 << 16;
595
+ CONTENTS_MONSTERCLIP = 1 << 17;
596
+ CONTENTS_CURRENT_0 = 1 << 18;
597
+ CONTENTS_CURRENT_90 = 1 << 19;
598
+ CONTENTS_CURRENT_180 = 1 << 20;
599
+ CONTENTS_CURRENT_270 = 1 << 21;
600
+ CONTENTS_CURRENT_UP = 1 << 22;
601
+ CONTENTS_CURRENT_DOWN = 1 << 23;
602
+ CONTENTS_ORIGIN = 1 << 24;
603
+ CONTENTS_MONSTER = 1 << 25;
604
+ CONTENTS_DEADMONSTER = 1 << 26;
605
+ CONTENTS_DETAIL = 1 << 27;
606
+ CONTENTS_TRANSLUCENT = 1 << 28;
607
+ CONTENTS_LADDER = 1 << 29;
608
+ CONTENTS_PLAYER = 1 << 30;
609
+ CONTENTS_PROJECTILE = 1 << 31;
610
+ SURF_LIGHT = 1 << 0;
611
+ SURF_SLICK = 1 << 1;
612
+ SURF_SKY = 1 << 2;
613
+ SURF_WARP = 1 << 3;
614
+ SURF_TRANS33 = 1 << 4;
615
+ SURF_TRANS66 = 1 << 5;
616
+ SURF_FLOWING = 1 << 6;
617
+ SURF_NODRAW = 1 << 7;
618
+ SURF_ALPHATEST = 1 << 25;
619
+ SURF_N64_UV = 1 << 28;
620
+ SURF_N64_SCROLL_X = 1 << 29;
621
+ SURF_N64_SCROLL_Y = 1 << 30;
622
+ SURF_N64_SCROLL_FLIP = 1 << 31;
623
+ MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
624
+ MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
625
+ MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
626
+ MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
627
+ MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
628
+ MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
629
+ MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
630
+ MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
631
+ MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
632
+ MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
633
+ MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
634
+ MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
635
+ MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
636
+ MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;
637
+ CvarFlags = /* @__PURE__ */ ((CvarFlags2) => {
638
+ CvarFlags2[CvarFlags2["None"] = 0] = "None";
639
+ CvarFlags2[CvarFlags2["Archive"] = 1] = "Archive";
640
+ CvarFlags2[CvarFlags2["UserInfo"] = 2] = "UserInfo";
641
+ CvarFlags2[CvarFlags2["ServerInfo"] = 4] = "ServerInfo";
642
+ CvarFlags2[CvarFlags2["Latch"] = 8] = "Latch";
643
+ CvarFlags2[CvarFlags2["Cheat"] = 16] = "Cheat";
644
+ return CvarFlags2;
645
+ })(CvarFlags || {});
646
+ MAX_CLIENTS = 256;
647
+ MAX_LIGHTSTYLES = 256;
648
+ MAX_MODELS = 8192;
649
+ MAX_SOUNDS = 2048;
650
+ MAX_IMAGES = 512;
651
+ MAX_ITEMS = 256;
652
+ MAX_GENERAL = MAX_CLIENTS * 2;
653
+ MAX_SHADOW_LIGHTS = 256;
654
+ MAX_WHEEL_ITEMS = 32;
655
+ ConfigStringIndex = ((ConfigStringIndex2) => {
656
+ ConfigStringIndex2[ConfigStringIndex2["Name"] = 0] = "Name";
657
+ ConfigStringIndex2[ConfigStringIndex2["CdTrack"] = 1] = "CdTrack";
658
+ ConfigStringIndex2[ConfigStringIndex2["Sky"] = 2] = "Sky";
659
+ ConfigStringIndex2[ConfigStringIndex2["SkyAxis"] = 3] = "SkyAxis";
660
+ ConfigStringIndex2[ConfigStringIndex2["SkyRotate"] = 4] = "SkyRotate";
661
+ ConfigStringIndex2[ConfigStringIndex2["StatusBar"] = 5] = "StatusBar";
662
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_N64_PHYSICS"] = 56] = "CONFIG_N64_PHYSICS";
663
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_CTF_TEAMS"] = 57] = "CONFIG_CTF_TEAMS";
664
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_COOP_RESPAWN_STRING"] = 58] = "CONFIG_COOP_RESPAWN_STRING";
665
+ ConfigStringIndex2[ConfigStringIndex2["AirAccel"] = 59] = "AirAccel";
666
+ ConfigStringIndex2[ConfigStringIndex2["MaxClients"] = 60] = "MaxClients";
667
+ ConfigStringIndex2[ConfigStringIndex2["MapChecksum"] = 61] = "MapChecksum";
668
+ ConfigStringIndex2[ConfigStringIndex2["Models"] = 62] = "Models";
669
+ ConfigStringIndex2[ConfigStringIndex2["Sounds"] = 62 + MAX_MODELS] = "Sounds";
670
+ ConfigStringIndex2[ConfigStringIndex2["Images"] = ConfigStringIndex2.Sounds + MAX_SOUNDS] = "Images";
671
+ ConfigStringIndex2[ConfigStringIndex2["Lights"] = ConfigStringIndex2.Images + MAX_IMAGES] = "Lights";
672
+ ConfigStringIndex2[ConfigStringIndex2["ShadowLights"] = ConfigStringIndex2.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
673
+ ConfigStringIndex2[ConfigStringIndex2["Items"] = ConfigStringIndex2.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
674
+ ConfigStringIndex2[ConfigStringIndex2["PlayerSkins"] = ConfigStringIndex2.Items + MAX_ITEMS] = "PlayerSkins";
675
+ ConfigStringIndex2[ConfigStringIndex2["General"] = ConfigStringIndex2.PlayerSkins + MAX_CLIENTS] = "General";
676
+ ConfigStringIndex2[ConfigStringIndex2["WheelWeapons"] = ConfigStringIndex2.General + MAX_GENERAL] = "WheelWeapons";
677
+ ConfigStringIndex2[ConfigStringIndex2["WheelAmmo"] = ConfigStringIndex2.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
678
+ ConfigStringIndex2[ConfigStringIndex2["WheelPowerups"] = ConfigStringIndex2.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
679
+ ConfigStringIndex2[ConfigStringIndex2["CdLoopCount"] = ConfigStringIndex2.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
680
+ ConfigStringIndex2[ConfigStringIndex2["GameStyle"] = ConfigStringIndex2.CdLoopCount + 1] = "GameStyle";
681
+ ConfigStringIndex2[ConfigStringIndex2["MaxConfigStrings"] = ConfigStringIndex2.GameStyle + 1] = "MaxConfigStrings";
682
+ return ConfigStringIndex2;
683
+ })(ConfigStringIndex || {});
684
+ MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
685
+ replay_exports = {};
686
+ __export2(replay_exports, {
687
+ addReplayFrame: () => addReplayFrame,
688
+ createReplaySession: () => createReplaySession,
689
+ deserializeReplay: () => deserializeReplay,
690
+ serializeReplay: () => serializeReplay
691
+ });
692
+ WaterLevel = /* @__PURE__ */ ((WaterLevel4) => {
693
+ WaterLevel4[WaterLevel4["None"] = 0] = "None";
694
+ WaterLevel4[WaterLevel4["Feet"] = 1] = "Feet";
695
+ WaterLevel4[WaterLevel4["Waist"] = 2] = "Waist";
696
+ WaterLevel4[WaterLevel4["Under"] = 3] = "Under";
697
+ return WaterLevel4;
698
+ })(WaterLevel || {});
699
+ WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
700
+ ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
701
+ ServerCommand22[ServerCommand22["bad"] = 0] = "bad";
702
+ ServerCommand22[ServerCommand22["muzzleflash"] = 1] = "muzzleflash";
703
+ ServerCommand22[ServerCommand22["muzzleflash2"] = 2] = "muzzleflash2";
704
+ ServerCommand22[ServerCommand22["temp_entity"] = 3] = "temp_entity";
705
+ ServerCommand22[ServerCommand22["layout"] = 4] = "layout";
706
+ ServerCommand22[ServerCommand22["inventory"] = 5] = "inventory";
707
+ ServerCommand22[ServerCommand22["nop"] = 6] = "nop";
708
+ ServerCommand22[ServerCommand22["disconnect"] = 7] = "disconnect";
709
+ ServerCommand22[ServerCommand22["reconnect"] = 8] = "reconnect";
710
+ ServerCommand22[ServerCommand22["sound"] = 9] = "sound";
711
+ ServerCommand22[ServerCommand22["print"] = 10] = "print";
712
+ ServerCommand22[ServerCommand22["stufftext"] = 11] = "stufftext";
713
+ ServerCommand22[ServerCommand22["serverdata"] = 12] = "serverdata";
714
+ ServerCommand22[ServerCommand22["configstring"] = 13] = "configstring";
715
+ ServerCommand22[ServerCommand22["spawnbaseline"] = 14] = "spawnbaseline";
716
+ ServerCommand22[ServerCommand22["centerprint"] = 15] = "centerprint";
717
+ ServerCommand22[ServerCommand22["download"] = 16] = "download";
718
+ ServerCommand22[ServerCommand22["playerinfo"] = 17] = "playerinfo";
719
+ ServerCommand22[ServerCommand22["packetentities"] = 18] = "packetentities";
720
+ ServerCommand22[ServerCommand22["deltapacketentities"] = 19] = "deltapacketentities";
721
+ ServerCommand22[ServerCommand22["frame"] = 20] = "frame";
722
+ ServerCommand22[ServerCommand22["splitclient"] = 21] = "splitclient";
723
+ ServerCommand22[ServerCommand22["configblast"] = 22] = "configblast";
724
+ ServerCommand22[ServerCommand22["spawnbaselineblast"] = 23] = "spawnbaselineblast";
725
+ ServerCommand22[ServerCommand22["level_restart"] = 24] = "level_restart";
726
+ ServerCommand22[ServerCommand22["damage"] = 25] = "damage";
727
+ ServerCommand22[ServerCommand22["locprint"] = 26] = "locprint";
728
+ ServerCommand22[ServerCommand22["fog"] = 27] = "fog";
729
+ ServerCommand22[ServerCommand22["waitingforplayers"] = 28] = "waitingforplayers";
730
+ ServerCommand22[ServerCommand22["bot_chat"] = 29] = "bot_chat";
731
+ ServerCommand22[ServerCommand22["poi"] = 30] = "poi";
732
+ ServerCommand22[ServerCommand22["help_path"] = 31] = "help_path";
733
+ ServerCommand22[ServerCommand22["muzzleflash3"] = 32] = "muzzleflash3";
734
+ ServerCommand22[ServerCommand22["achievement"] = 33] = "achievement";
735
+ return ServerCommand22;
736
+ })(ServerCommand || {});
737
+ TempEntity = /* @__PURE__ */ ((TempEntity2) => {
738
+ TempEntity2[TempEntity2["GUNSHOT"] = 0] = "GUNSHOT";
739
+ TempEntity2[TempEntity2["BLOOD"] = 1] = "BLOOD";
740
+ TempEntity2[TempEntity2["BLASTER"] = 2] = "BLASTER";
741
+ TempEntity2[TempEntity2["RAILTRAIL"] = 3] = "RAILTRAIL";
742
+ TempEntity2[TempEntity2["SHOTGUN"] = 4] = "SHOTGUN";
743
+ TempEntity2[TempEntity2["EXPLOSION1"] = 5] = "EXPLOSION1";
744
+ TempEntity2[TempEntity2["EXPLOSION2"] = 6] = "EXPLOSION2";
745
+ TempEntity2[TempEntity2["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
746
+ TempEntity2[TempEntity2["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
747
+ TempEntity2[TempEntity2["SPARKS"] = 9] = "SPARKS";
748
+ TempEntity2[TempEntity2["SPLASH"] = 10] = "SPLASH";
749
+ TempEntity2[TempEntity2["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
750
+ TempEntity2[TempEntity2["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
751
+ TempEntity2[TempEntity2["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
752
+ TempEntity2[TempEntity2["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
753
+ TempEntity2[TempEntity2["LASER_SPARKS"] = 15] = "LASER_SPARKS";
754
+ TempEntity2[TempEntity2["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
755
+ TempEntity2[TempEntity2["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
756
+ TempEntity2[TempEntity2["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
757
+ TempEntity2[TempEntity2["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
758
+ TempEntity2[TempEntity2["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
759
+ TempEntity2[TempEntity2["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
760
+ TempEntity2[TempEntity2["BOSSTPORT"] = 22] = "BOSSTPORT";
761
+ TempEntity2[TempEntity2["BFG_LASER"] = 23] = "BFG_LASER";
762
+ TempEntity2[TempEntity2["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
763
+ TempEntity2[TempEntity2["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
764
+ TempEntity2[TempEntity2["GREENBLOOD"] = 26] = "GREENBLOOD";
765
+ TempEntity2[TempEntity2["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
766
+ TempEntity2[TempEntity2["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
767
+ TempEntity2[TempEntity2["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
768
+ TempEntity2[TempEntity2["BLASTER2"] = 30] = "BLASTER2";
769
+ TempEntity2[TempEntity2["RAILTRAIL2"] = 31] = "RAILTRAIL2";
770
+ TempEntity2[TempEntity2["FLAME"] = 32] = "FLAME";
771
+ TempEntity2[TempEntity2["LIGHTNING"] = 33] = "LIGHTNING";
772
+ TempEntity2[TempEntity2["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
773
+ TempEntity2[TempEntity2["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
774
+ TempEntity2[TempEntity2["FLASHLIGHT"] = 36] = "FLASHLIGHT";
775
+ TempEntity2[TempEntity2["FORCEWALL"] = 37] = "FORCEWALL";
776
+ TempEntity2[TempEntity2["HEATBEAM"] = 38] = "HEATBEAM";
777
+ TempEntity2[TempEntity2["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
778
+ TempEntity2[TempEntity2["STEAM"] = 40] = "STEAM";
779
+ TempEntity2[TempEntity2["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
780
+ TempEntity2[TempEntity2["MOREBLOOD"] = 42] = "MOREBLOOD";
781
+ TempEntity2[TempEntity2["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
782
+ TempEntity2[TempEntity2["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
783
+ TempEntity2[TempEntity2["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
784
+ TempEntity2[TempEntity2["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
785
+ TempEntity2[TempEntity2["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
786
+ TempEntity2[TempEntity2["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
787
+ TempEntity2[TempEntity2["DBALL_GOAL"] = 49] = "DBALL_GOAL";
788
+ TempEntity2[TempEntity2["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
789
+ TempEntity2[TempEntity2["NUKEBLAST"] = 51] = "NUKEBLAST";
790
+ TempEntity2[TempEntity2["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
791
+ TempEntity2[TempEntity2["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
792
+ TempEntity2[TempEntity2["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
793
+ TempEntity2[TempEntity2["FLECHETTE"] = 55] = "FLECHETTE";
794
+ TempEntity2[TempEntity2["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
795
+ TempEntity2[TempEntity2["BFG_ZAP"] = 57] = "BFG_ZAP";
796
+ TempEntity2[TempEntity2["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
797
+ TempEntity2[TempEntity2["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
798
+ TempEntity2[TempEntity2["POWER_SPLASH"] = 60] = "POWER_SPLASH";
799
+ TempEntity2[TempEntity2["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
800
+ TempEntity2[TempEntity2["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
801
+ TempEntity2[TempEntity2["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
802
+ return TempEntity2;
803
+ })(TempEntity || {});
804
+ MZ_BLASTER = 0;
805
+ MZ_MACHINEGUN = 1;
806
+ MZ_SHOTGUN = 2;
807
+ MZ_CHAINGUN1 = 3;
808
+ MZ_RAILGUN = 6;
809
+ MZ_ROCKET = 7;
810
+ MZ_GRENADE = 8;
811
+ MZ_SSHOTGUN = 11;
812
+ MZ_BFG = 12;
813
+ MZ_HYPERBLASTER = 13;
814
+ PowerupId = /* @__PURE__ */ ((PowerupId22) => {
815
+ PowerupId22["QuadDamage"] = "quad";
816
+ PowerupId22["Invulnerability"] = "invulnerability";
817
+ PowerupId22["EnviroSuit"] = "enviro_suit";
818
+ PowerupId22["Rebreather"] = "rebreather";
819
+ PowerupId22["Silencer"] = "silencer";
820
+ PowerupId22["PowerScreen"] = "power_screen";
821
+ PowerupId22["PowerShield"] = "power_shield";
822
+ PowerupId22["QuadFire"] = "quad_fire";
823
+ PowerupId22["Invisibility"] = "invisibility";
824
+ PowerupId22["Bandolier"] = "bandolier";
825
+ PowerupId22["AmmoPack"] = "ammo_pack";
826
+ PowerupId22["IRGoggles"] = "ir_goggles";
827
+ PowerupId22["DoubleDamage"] = "double_damage";
828
+ PowerupId22["SphereVengeance"] = "sphere_vengeance";
829
+ PowerupId22["SphereHunter"] = "sphere_hunter";
830
+ PowerupId22["SphereDefender"] = "sphere_defender";
831
+ PowerupId22["Doppelganger"] = "doppelganger";
832
+ PowerupId22["TagToken"] = "tag_token";
833
+ PowerupId22["TechResistance"] = "tech_resistance";
834
+ PowerupId22["TechStrength"] = "tech_strength";
835
+ PowerupId22["TechHaste"] = "tech_haste";
836
+ PowerupId22["TechRegeneration"] = "tech_regeneration";
837
+ PowerupId22["Flashlight"] = "flashlight";
838
+ PowerupId22["Compass"] = "compass";
839
+ return PowerupId22;
840
+ })(PowerupId || {});
841
+ PlayerStat = /* @__PURE__ */ ((PlayerStat2) => {
842
+ PlayerStat2[PlayerStat2["STAT_HEALTH_ICON"] = 0] = "STAT_HEALTH_ICON";
843
+ PlayerStat2[PlayerStat2["STAT_HEALTH"] = 1] = "STAT_HEALTH";
844
+ PlayerStat2[PlayerStat2["STAT_AMMO_ICON"] = 2] = "STAT_AMMO_ICON";
845
+ PlayerStat2[PlayerStat2["STAT_AMMO"] = 3] = "STAT_AMMO";
846
+ PlayerStat2[PlayerStat2["STAT_ARMOR_ICON"] = 4] = "STAT_ARMOR_ICON";
847
+ PlayerStat2[PlayerStat2["STAT_ARMOR"] = 5] = "STAT_ARMOR";
848
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ICON"] = 6] = "STAT_SELECTED_ICON";
849
+ PlayerStat2[PlayerStat2["STAT_PICKUP_ICON"] = 7] = "STAT_PICKUP_ICON";
850
+ PlayerStat2[PlayerStat2["STAT_PICKUP_STRING"] = 8] = "STAT_PICKUP_STRING";
851
+ PlayerStat2[PlayerStat2["STAT_TIMER_ICON"] = 9] = "STAT_TIMER_ICON";
852
+ PlayerStat2[PlayerStat2["STAT_TIMER"] = 10] = "STAT_TIMER";
853
+ PlayerStat2[PlayerStat2["STAT_HELPICON"] = 11] = "STAT_HELPICON";
854
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM"] = 12] = "STAT_SELECTED_ITEM";
855
+ PlayerStat2[PlayerStat2["STAT_LAYOUTS"] = 13] = "STAT_LAYOUTS";
856
+ PlayerStat2[PlayerStat2["STAT_FRAGS"] = 14] = "STAT_FRAGS";
857
+ PlayerStat2[PlayerStat2["STAT_FLASHES"] = 15] = "STAT_FLASHES";
858
+ PlayerStat2[PlayerStat2["STAT_CHASE"] = 16] = "STAT_CHASE";
859
+ PlayerStat2[PlayerStat2["STAT_SPECTATOR"] = 17] = "STAT_SPECTATOR";
860
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_PIC"] = 18] = "STAT_CTF_TEAM1_PIC";
861
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_CAPS"] = 19] = "STAT_CTF_TEAM1_CAPS";
862
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_PIC"] = 20] = "STAT_CTF_TEAM2_PIC";
863
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_CAPS"] = 21] = "STAT_CTF_TEAM2_CAPS";
864
+ PlayerStat2[PlayerStat2["STAT_CTF_FLAG_PIC"] = 22] = "STAT_CTF_FLAG_PIC";
865
+ PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM1_PIC"] = 23] = "STAT_CTF_JOINED_TEAM1_PIC";
866
+ PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM2_PIC"] = 24] = "STAT_CTF_JOINED_TEAM2_PIC";
867
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_HEADER"] = 25] = "STAT_CTF_TEAM1_HEADER";
868
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_HEADER"] = 26] = "STAT_CTF_TEAM2_HEADER";
869
+ PlayerStat2[PlayerStat2["STAT_CTF_TECH"] = 27] = "STAT_CTF_TECH";
870
+ PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW"] = 28] = "STAT_CTF_ID_VIEW";
871
+ PlayerStat2[PlayerStat2["STAT_CTF_MATCH"] = 29] = "STAT_CTF_MATCH";
872
+ PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW_COLOR"] = 30] = "STAT_CTF_ID_VIEW_COLOR";
873
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAMINFO"] = 31] = "STAT_CTF_TEAMINFO";
874
+ PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_1"] = 32] = "STAT_WEAPONS_OWNED_1";
875
+ PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_2"] = 33] = "STAT_WEAPONS_OWNED_2";
876
+ PlayerStat2[PlayerStat2["STAT_AMMO_INFO_START"] = 34] = "STAT_AMMO_INFO_START";
877
+ PlayerStat2[PlayerStat2["STAT_POWERUP_INFO_START"] = 41] = "STAT_POWERUP_INFO_START";
878
+ PlayerStat2[PlayerStat2["STAT_KEY_A"] = 44] = "STAT_KEY_A";
879
+ PlayerStat2[PlayerStat2["STAT_KEY_B"] = 45] = "STAT_KEY_B";
880
+ PlayerStat2[PlayerStat2["STAT_KEY_C"] = 46] = "STAT_KEY_C";
881
+ PlayerStat2[PlayerStat2["STAT_ACTIVE_WHEEL_WEAPON"] = 47] = "STAT_ACTIVE_WHEEL_WEAPON";
882
+ PlayerStat2[PlayerStat2["STAT_COOP_RESPAWN"] = 48] = "STAT_COOP_RESPAWN";
883
+ PlayerStat2[PlayerStat2["STAT_LIVES"] = 49] = "STAT_LIVES";
884
+ PlayerStat2[PlayerStat2["STAT_HIT_MARKER"] = 50] = "STAT_HIT_MARKER";
885
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM_NAME"] = 51] = "STAT_SELECTED_ITEM_NAME";
886
+ PlayerStat2[PlayerStat2["STAT_HEALTH_BARS"] = 52] = "STAT_HEALTH_BARS";
887
+ PlayerStat2[PlayerStat2["STAT_ACTIVE_WEAPON"] = 53] = "STAT_ACTIVE_WEAPON";
888
+ PlayerStat2[PlayerStat2["STAT_LAST"] = 54] = "STAT_LAST";
889
+ return PlayerStat2;
890
+ })(PlayerStat || {});
891
+ AMMO_MAX = 12;
892
+ NUM_BITS_FOR_AMMO = 9;
893
+ NUM_AMMO_STATS = Math.ceil(AMMO_MAX * NUM_BITS_FOR_AMMO / 16);
894
+ POWERUP_MAX = 23;
895
+ NUM_BITS_FOR_POWERUP = 2;
896
+ NUM_POWERUP_STATS = Math.ceil(POWERUP_MAX * NUM_BITS_FOR_POWERUP / 16);
897
+ POWERUP_STAT_MAP = {
898
+ [
899
+ "power_screen"
900
+ /* PowerScreen */
901
+ ]: 0,
902
+ [
903
+ "power_shield"
904
+ /* PowerShield */
905
+ ]: 1,
906
+ // 2 is POWERUP_AM_BOMB (not in PowerupId?)
907
+ [
908
+ "quad"
909
+ /* QuadDamage */
910
+ ]: 3,
911
+ [
912
+ "quad_fire"
913
+ /* QuadFire */
914
+ ]: 4,
915
+ [
916
+ "invulnerability"
917
+ /* Invulnerability */
918
+ ]: 5,
919
+ [
920
+ "invisibility"
921
+ /* Invisibility */
922
+ ]: 6,
923
+ [
924
+ "silencer"
925
+ /* Silencer */
926
+ ]: 7,
927
+ [
928
+ "rebreather"
929
+ /* Rebreather */
930
+ ]: 8,
931
+ [
932
+ "enviro_suit"
933
+ /* EnviroSuit */
934
+ ]: 9,
935
+ [
936
+ "bandolier"
937
+ /* Bandolier */
938
+ ]: 10,
939
+ // Placeholder/Map mismatch handling?
940
+ [
941
+ "ammo_pack"
942
+ /* AmmoPack */
943
+ ]: 10,
944
+ // Original reused indices or had gaps?
945
+ [
946
+ "ir_goggles"
947
+ /* IRGoggles */
948
+ ]: 11,
949
+ [
950
+ "double_damage"
951
+ /* DoubleDamage */
952
+ ]: 12,
953
+ [
954
+ "sphere_vengeance"
955
+ /* SphereVengeance */
956
+ ]: 13,
957
+ [
958
+ "sphere_hunter"
959
+ /* SphereHunter */
960
+ ]: 14,
961
+ [
962
+ "sphere_defender"
963
+ /* SphereDefender */
964
+ ]: 15,
965
+ [
966
+ "doppelganger"
967
+ /* Doppelganger */
968
+ ]: 16,
969
+ [
970
+ "flashlight"
971
+ /* Flashlight */
972
+ ]: 17,
973
+ [
974
+ "compass"
975
+ /* Compass */
976
+ ]: 18,
977
+ [
978
+ "tech_resistance"
979
+ /* TechResistance */
980
+ ]: 19,
981
+ [
982
+ "tech_strength"
983
+ /* TechStrength */
984
+ ]: 20,
985
+ [
986
+ "tech_haste"
987
+ /* TechHaste */
988
+ ]: 21,
989
+ [
990
+ "tech_regeneration"
991
+ /* TechRegeneration */
992
+ ]: 22,
993
+ // Add missing mappings to avoid runtime lookups failing for new types
994
+ [
995
+ "tag_token"
996
+ /* TagToken */
997
+ ]: -1
998
+ };
999
+ RenderFx = /* @__PURE__ */ ((RenderFx2) => {
1000
+ RenderFx2[RenderFx2["MinLight"] = 1] = "MinLight";
1001
+ RenderFx2[RenderFx2["ViewerModel"] = 2] = "ViewerModel";
1002
+ RenderFx2[RenderFx2["WeaponModel"] = 4] = "WeaponModel";
1003
+ RenderFx2[RenderFx2["FullBright"] = 8] = "FullBright";
1004
+ RenderFx2[RenderFx2["DepthHack"] = 16] = "DepthHack";
1005
+ RenderFx2[RenderFx2["Translucent"] = 32] = "Translucent";
1006
+ RenderFx2[RenderFx2["FrameLerp"] = 64] = "FrameLerp";
1007
+ RenderFx2[RenderFx2["Beam"] = 128] = "Beam";
1008
+ RenderFx2[RenderFx2["CustomLight"] = 256] = "CustomLight";
1009
+ RenderFx2[RenderFx2["Glow"] = 512] = "Glow";
1010
+ RenderFx2[RenderFx2["ShellRed"] = 1024] = "ShellRed";
1011
+ RenderFx2[RenderFx2["ShellGreen"] = 2048] = "ShellGreen";
1012
+ RenderFx2[RenderFx2["ShellBlue"] = 4096] = "ShellBlue";
1013
+ RenderFx2[RenderFx2["IrVisible"] = 32768] = "IrVisible";
1014
+ RenderFx2[RenderFx2["ShellDouble"] = 65536] = "ShellDouble";
1015
+ RenderFx2[RenderFx2["ShellHalfDam"] = 131072] = "ShellHalfDam";
1016
+ RenderFx2[RenderFx2["MinLightPlus"] = 262144] = "MinLightPlus";
1017
+ RenderFx2[RenderFx2["ExtraLight"] = 524288] = "ExtraLight";
1018
+ RenderFx2[RenderFx2["BeamLightning"] = 1048576] = "BeamLightning";
1019
+ return RenderFx2;
1020
+ })(RenderFx || {});
1021
+ entityFlags_exports = {};
1022
+ __export2(entityFlags_exports, {
1023
+ U_ANGLE1: () => U_ANGLE1,
1024
+ U_ANGLE2: () => U_ANGLE2,
1025
+ U_ANGLE3: () => U_ANGLE3,
1026
+ U_EFFECTS: () => U_EFFECTS,
1027
+ U_EVENT: () => U_EVENT,
1028
+ U_FRAME: () => U_FRAME,
1029
+ U_MODEL: () => U_MODEL,
1030
+ U_MODEL2: () => U_MODEL2,
1031
+ U_MODEL3: () => U_MODEL3,
1032
+ U_MODEL4: () => U_MODEL4,
1033
+ U_MOREBITS: () => U_MOREBITS,
1034
+ U_NUMBER: () => U_NUMBER,
1035
+ U_ORIGIN1: () => U_ORIGIN1,
1036
+ U_ORIGIN2: () => U_ORIGIN2,
1037
+ U_ORIGIN3: () => U_ORIGIN3,
1038
+ U_REMOVE: () => U_REMOVE,
1039
+ U_RENDERFX: () => U_RENDERFX,
1040
+ U_SKIN: () => U_SKIN,
1041
+ U_SOLID: () => U_SOLID,
1042
+ U_SOUND: () => U_SOUND
1043
+ });
1044
+ U_NUMBER = 1 << 0;
1045
+ U_MODEL = 1 << 1;
1046
+ U_SOUND = 1 << 2;
1047
+ U_ORIGIN1 = 1 << 3;
1048
+ U_ORIGIN2 = 1 << 4;
1049
+ U_ORIGIN3 = 1 << 5;
1050
+ U_ANGLE1 = 1 << 6;
1051
+ U_ANGLE2 = 1 << 7;
1052
+ U_ANGLE3 = 1 << 8;
1053
+ U_FRAME = 1 << 9;
1054
+ U_SKIN = 1 << 10;
1055
+ U_EFFECTS = 1 << 11;
1056
+ U_RENDERFX = 1 << 12;
1057
+ U_SOLID = 1 << 13;
1058
+ U_EVENT = 1 << 14;
1059
+ U_MOREBITS = 1 << 15;
1060
+ U_MODEL2 = 1 << 0;
1061
+ U_MODEL3 = 1 << 1;
1062
+ U_MODEL4 = 1 << 2;
1063
+ U_REMOVE = 32768;
1064
+ FRAMETIME = 0.025;
1065
+ MASK_WATER2 = 33554432;
1066
+ WaterLevel3 = {
1067
+ None: 0,
1068
+ Feet: 1,
1069
+ Waist: 2,
1070
+ Under: 3
1071
+ };
1072
+ categorizePosition2 = (state, trace) => {
1073
+ const point = { ...state.origin };
1074
+ point.z -= 0.25;
1075
+ const traceResult = trace(state.origin, point);
1076
+ return {
1077
+ ...state,
1078
+ onGround: traceResult.fraction < 1
1079
+ };
1080
+ };
1081
+ checkWater = (state, pointContents2) => {
1082
+ const point = { ...state.origin };
1083
+ const { mins, maxs } = state;
1084
+ point.z = state.origin.z + mins.z + 1;
1085
+ const contents = pointContents2(point);
1086
+ if (!(contents & MASK_WATER2)) {
1087
+ return { ...state, waterLevel: WaterLevel3.None };
1088
+ }
1089
+ let waterLevel = WaterLevel3.Feet;
1090
+ const waist = state.origin.z + (mins.z + maxs.z) * 0.5;
1091
+ point.z = waist;
1092
+ const waistContents = pointContents2(point);
1093
+ if (waistContents & MASK_WATER2) {
1094
+ waterLevel = WaterLevel3.Waist;
1095
+ const head = state.origin.z + 22;
1096
+ point.z = head;
1097
+ const headContents = pointContents2(point);
1098
+ if (headContents & MASK_WATER2) {
1099
+ waterLevel = WaterLevel3.Under;
1100
+ }
1101
+ }
1102
+ return { ...state, waterLevel };
1103
+ };
1104
+ applyPmove = (state, cmd, trace, pointContents2) => {
1105
+ let newState = { ...state };
1106
+ newState = categorizePosition2(newState, trace);
1107
+ newState = checkWater(newState, pointContents2);
1108
+ const { origin, velocity, onGround, waterLevel, viewAngles } = newState;
1109
+ const adjustedAngles = waterLevel >= 2 ? viewAngles : {
1110
+ // For ground/air movement, reduce pitch influence (rerelease/p_move.cpp:1689)
1111
+ x: viewAngles.x > 180 ? (viewAngles.x - 360) / 3 : viewAngles.x / 3,
1112
+ y: viewAngles.y,
1113
+ z: viewAngles.z
1114
+ };
1115
+ const { forward, right } = angleVectors(adjustedAngles);
1116
+ const frictionedVelocity = applyPmoveFriction({
1117
+ velocity,
1118
+ frametime: FRAMETIME,
1119
+ onGround,
1120
+ groundIsSlick: false,
1121
+ onLadder: false,
1122
+ waterlevel: waterLevel,
1123
+ pmFriction: 6,
1124
+ pmStopSpeed: 100,
1125
+ pmWaterFriction: 1
1126
+ });
1127
+ const wish = waterLevel >= 2 ? buildWaterWish({
1128
+ forward,
1129
+ right,
1130
+ cmd,
1131
+ maxSpeed: 320
1132
+ }) : buildAirGroundWish({
1133
+ forward,
1134
+ right,
1135
+ cmd,
1136
+ maxSpeed: 320
1137
+ });
1138
+ const finalVelocity = applyPmoveAccelerate({
1139
+ velocity: frictionedVelocity,
1140
+ wishdir: wish.wishdir,
1141
+ wishspeed: wish.wishspeed,
1142
+ // Water movement uses ground acceleration (10), not air acceleration (1)
1143
+ accel: onGround || waterLevel >= 2 ? 10 : 1,
1144
+ frametime: FRAMETIME
1145
+ });
1146
+ const traceResult = trace(origin, {
1147
+ x: origin.x + finalVelocity.x * FRAMETIME,
1148
+ y: origin.y + finalVelocity.y * FRAMETIME,
1149
+ z: origin.z + finalVelocity.z * FRAMETIME
1150
+ });
1151
+ return {
1152
+ ...newState,
1153
+ origin: traceResult.endpos,
1154
+ velocity: finalVelocity
1155
+ };
1156
+ };
1157
+ WeaponId = /* @__PURE__ */ ((WeaponId22) => {
1158
+ WeaponId22["Blaster"] = "blaster";
1159
+ WeaponId22["Shotgun"] = "shotgun";
1160
+ WeaponId22["SuperShotgun"] = "supershotgun";
1161
+ WeaponId22["Machinegun"] = "machinegun";
1162
+ WeaponId22["Chaingun"] = "chaingun";
1163
+ WeaponId22["HandGrenade"] = "grenades";
1164
+ WeaponId22["GrenadeLauncher"] = "grenadelauncher";
1165
+ WeaponId22["RocketLauncher"] = "rocketlauncher";
1166
+ WeaponId22["HyperBlaster"] = "hyperblaster";
1167
+ WeaponId22["Railgun"] = "railgun";
1168
+ WeaponId22["BFG10K"] = "bfg10k";
1169
+ WeaponId22["Grapple"] = "grapple";
1170
+ WeaponId22["ChainFist"] = "chainfist";
1171
+ WeaponId22["EtfRifle"] = "etf_rifle";
1172
+ WeaponId22["ProxLauncher"] = "prox_launcher";
1173
+ WeaponId22["IonRipper"] = "ionripper";
1174
+ WeaponId22["PlasmaBeam"] = "plasmabeam";
1175
+ WeaponId22["Phalanx"] = "phalanx";
1176
+ WeaponId22["Disruptor"] = "disruptor";
1177
+ WeaponId22["Trap"] = "trap";
1178
+ return WeaponId22;
1179
+ })(WeaponId || {});
1180
+ AmmoType = /* @__PURE__ */ ((AmmoType22) => {
1181
+ AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
1182
+ AmmoType22[AmmoType22["Shells"] = 1] = "Shells";
1183
+ AmmoType22[AmmoType22["Rockets"] = 2] = "Rockets";
1184
+ AmmoType22[AmmoType22["Grenades"] = 3] = "Grenades";
1185
+ AmmoType22[AmmoType22["Cells"] = 4] = "Cells";
1186
+ AmmoType22[AmmoType22["Slugs"] = 5] = "Slugs";
1187
+ AmmoType22[AmmoType22["MagSlugs"] = 6] = "MagSlugs";
1188
+ AmmoType22[AmmoType22["Trap"] = 7] = "Trap";
1189
+ AmmoType22[AmmoType22["Flechettes"] = 8] = "Flechettes";
1190
+ AmmoType22[AmmoType22["Tesla"] = 9] = "Tesla";
1191
+ AmmoType22[AmmoType22["Disruptor"] = 10] = "Disruptor";
1192
+ AmmoType22[AmmoType22["Prox"] = 11] = "Prox";
1193
+ AmmoType22[AmmoType22["Nuke"] = 12] = "Nuke";
1194
+ AmmoType22[AmmoType22["Rounds"] = 13] = "Rounds";
1195
+ return AmmoType22;
1196
+ })(AmmoType || {});
1197
+ AMMO_TYPE_COUNT = Object.keys(AmmoType).length / 2;
1198
+ AmmoItemId = /* @__PURE__ */ ((AmmoItemId22) => {
1199
+ AmmoItemId22["Shells"] = "ammo_shells";
1200
+ AmmoItemId22["Bullets"] = "ammo_bullets";
1201
+ AmmoItemId22["Rockets"] = "ammo_rockets";
1202
+ AmmoItemId22["Grenades"] = "ammo_grenades";
1203
+ AmmoItemId22["Cells"] = "ammo_cells";
1204
+ AmmoItemId22["Slugs"] = "ammo_slugs";
1205
+ AmmoItemId22["MagSlugs"] = "ammo_magslug";
1206
+ AmmoItemId22["Flechettes"] = "ammo_flechettes";
1207
+ AmmoItemId22["Disruptor"] = "ammo_disruptor";
1208
+ AmmoItemId22["Tesla"] = "ammo_tesla";
1209
+ AmmoItemId22["Trap"] = "ammo_trap";
1210
+ AmmoItemId22["Prox"] = "ammo_prox";
1211
+ return AmmoItemId22;
1212
+ })(AmmoItemId || {});
1213
+ WEAPON_WHEEL_ORDER = [
1214
+ "blaster",
1215
+ "shotgun",
1216
+ "supershotgun",
1217
+ "machinegun",
1218
+ "chaingun",
1219
+ "grenadelauncher",
1220
+ "rocketlauncher",
1221
+ "grenades",
1222
+ "hyperblaster",
1223
+ "railgun",
1224
+ "bfg10k"
1225
+ /* BFG10K */
1226
+ ];
1227
+ }
997
1228
  });
998
- var U_NUMBER = 1 << 0;
999
- var U_MODEL = 1 << 1;
1000
- var U_SOUND = 1 << 2;
1001
- var U_ORIGIN1 = 1 << 3;
1002
- var U_ORIGIN2 = 1 << 4;
1003
- var U_ORIGIN3 = 1 << 5;
1004
- var U_ANGLE1 = 1 << 6;
1005
- var U_ANGLE2 = 1 << 7;
1006
- var U_ANGLE3 = 1 << 8;
1007
- var U_FRAME = 1 << 9;
1008
- var U_SKIN = 1 << 10;
1009
- var U_EFFECTS = 1 << 11;
1010
- var U_RENDERFX = 1 << 12;
1011
- var U_SOLID = 1 << 13;
1012
- var U_EVENT = 1 << 14;
1013
- var U_MOREBITS = 1 << 15;
1014
- var U_MODEL2 = 1 << 0;
1015
- var U_MODEL3 = 1 << 1;
1016
- var U_MODEL4 = 1 << 2;
1017
- var U_REMOVE = 32768;
1018
- var FRAMETIME = 0.025;
1019
- var MASK_WATER2 = 33554432;
1020
- var WaterLevel3 = {
1021
- None: 0,
1022
- Feet: 1,
1023
- Waist: 2,
1024
- Under: 3
1025
- };
1026
- var categorizePosition2 = (state, trace) => {
1027
- const point = { ...state.origin };
1028
- point.z -= 0.25;
1029
- const traceResult = trace(state.origin, point);
1030
- return {
1031
- ...state,
1032
- onGround: traceResult.fraction < 1
1033
- };
1034
- };
1035
- var checkWater = (state, pointContents2) => {
1036
- const point = { ...state.origin };
1037
- const { mins, maxs } = state;
1038
- point.z = state.origin.z + mins.z + 1;
1039
- const contents = pointContents2(point);
1040
- if (!(contents & MASK_WATER2)) {
1041
- return { ...state, waterLevel: WaterLevel3.None };
1042
- }
1043
- let waterLevel = WaterLevel3.Feet;
1044
- const waist = state.origin.z + (mins.z + maxs.z) * 0.5;
1045
- point.z = waist;
1046
- const waistContents = pointContents2(point);
1047
- if (waistContents & MASK_WATER2) {
1048
- waterLevel = WaterLevel3.Waist;
1049
- const head = state.origin.z + 22;
1050
- point.z = head;
1051
- const headContents = pointContents2(point);
1052
- if (headContents & MASK_WATER2) {
1053
- waterLevel = WaterLevel3.Under;
1054
- }
1055
- }
1056
- return { ...state, waterLevel };
1057
- };
1058
- var applyPmove = (state, cmd, trace, pointContents2) => {
1059
- let newState = { ...state };
1060
- newState = categorizePosition2(newState, trace);
1061
- newState = checkWater(newState, pointContents2);
1062
- const { origin, velocity, onGround, waterLevel, viewAngles } = newState;
1063
- const adjustedAngles = waterLevel >= 2 ? viewAngles : {
1064
- // For ground/air movement, reduce pitch influence (rerelease/p_move.cpp:1689)
1065
- x: viewAngles.x > 180 ? (viewAngles.x - 360) / 3 : viewAngles.x / 3,
1066
- y: viewAngles.y,
1067
- z: viewAngles.z
1068
- };
1069
- const { forward, right } = angleVectors(adjustedAngles);
1070
- const frictionedVelocity = applyPmoveFriction({
1071
- velocity,
1072
- frametime: FRAMETIME,
1073
- onGround,
1074
- groundIsSlick: false,
1075
- onLadder: false,
1076
- waterlevel: waterLevel,
1077
- pmFriction: 6,
1078
- pmStopSpeed: 100,
1079
- pmWaterFriction: 1
1080
- });
1081
- const wish = waterLevel >= 2 ? buildWaterWish({
1082
- forward,
1083
- right,
1084
- cmd,
1085
- maxSpeed: 320
1086
- }) : buildAirGroundWish({
1087
- forward,
1088
- right,
1089
- cmd,
1090
- maxSpeed: 320
1091
- });
1092
- const finalVelocity = applyPmoveAccelerate({
1093
- velocity: frictionedVelocity,
1094
- wishdir: wish.wishdir,
1095
- wishspeed: wish.wishspeed,
1096
- // Water movement uses ground acceleration (10), not air acceleration (1)
1097
- accel: onGround || waterLevel >= 2 ? 10 : 1,
1098
- frametime: FRAMETIME
1099
- });
1100
- const traceResult = trace(origin, {
1101
- x: origin.x + finalVelocity.x * FRAMETIME,
1102
- y: origin.y + finalVelocity.y * FRAMETIME,
1103
- z: origin.z + finalVelocity.z * FRAMETIME
1104
- });
1105
- return {
1106
- ...newState,
1107
- origin: traceResult.endpos,
1108
- velocity: finalVelocity
1109
- };
1110
- };
1111
- var WeaponId = /* @__PURE__ */ ((WeaponId22) => {
1112
- WeaponId22["Blaster"] = "blaster";
1113
- WeaponId22["Shotgun"] = "shotgun";
1114
- WeaponId22["SuperShotgun"] = "supershotgun";
1115
- WeaponId22["Machinegun"] = "machinegun";
1116
- WeaponId22["Chaingun"] = "chaingun";
1117
- WeaponId22["HandGrenade"] = "grenades";
1118
- WeaponId22["GrenadeLauncher"] = "grenadelauncher";
1119
- WeaponId22["RocketLauncher"] = "rocketlauncher";
1120
- WeaponId22["HyperBlaster"] = "hyperblaster";
1121
- WeaponId22["Railgun"] = "railgun";
1122
- WeaponId22["BFG10K"] = "bfg10k";
1123
- WeaponId22["Grapple"] = "grapple";
1124
- WeaponId22["ChainFist"] = "chainfist";
1125
- WeaponId22["EtfRifle"] = "etf_rifle";
1126
- WeaponId22["ProxLauncher"] = "prox_launcher";
1127
- WeaponId22["IonRipper"] = "ionripper";
1128
- WeaponId22["PlasmaBeam"] = "plasmabeam";
1129
- WeaponId22["Phalanx"] = "phalanx";
1130
- WeaponId22["Disruptor"] = "disruptor";
1131
- WeaponId22["Trap"] = "trap";
1132
- return WeaponId22;
1133
- })(WeaponId || {});
1134
- var AmmoType = /* @__PURE__ */ ((AmmoType22) => {
1135
- AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
1136
- AmmoType22[AmmoType22["Shells"] = 1] = "Shells";
1137
- AmmoType22[AmmoType22["Rockets"] = 2] = "Rockets";
1138
- AmmoType22[AmmoType22["Grenades"] = 3] = "Grenades";
1139
- AmmoType22[AmmoType22["Cells"] = 4] = "Cells";
1140
- AmmoType22[AmmoType22["Slugs"] = 5] = "Slugs";
1141
- AmmoType22[AmmoType22["MagSlugs"] = 6] = "MagSlugs";
1142
- AmmoType22[AmmoType22["Trap"] = 7] = "Trap";
1143
- AmmoType22[AmmoType22["Flechettes"] = 8] = "Flechettes";
1144
- AmmoType22[AmmoType22["Tesla"] = 9] = "Tesla";
1145
- AmmoType22[AmmoType22["Disruptor"] = 10] = "Disruptor";
1146
- AmmoType22[AmmoType22["Prox"] = 11] = "Prox";
1147
- AmmoType22[AmmoType22["Nuke"] = 12] = "Nuke";
1148
- AmmoType22[AmmoType22["Rounds"] = 13] = "Rounds";
1149
- return AmmoType22;
1150
- })(AmmoType || {});
1151
- var AMMO_TYPE_COUNT = Object.keys(AmmoType).length / 2;
1152
- var AmmoItemId = /* @__PURE__ */ ((AmmoItemId22) => {
1153
- AmmoItemId22["Shells"] = "ammo_shells";
1154
- AmmoItemId22["Bullets"] = "ammo_bullets";
1155
- AmmoItemId22["Rockets"] = "ammo_rockets";
1156
- AmmoItemId22["Grenades"] = "ammo_grenades";
1157
- AmmoItemId22["Cells"] = "ammo_cells";
1158
- AmmoItemId22["Slugs"] = "ammo_slugs";
1159
- AmmoItemId22["MagSlugs"] = "ammo_magslug";
1160
- AmmoItemId22["Flechettes"] = "ammo_flechettes";
1161
- AmmoItemId22["Disruptor"] = "ammo_disruptor";
1162
- AmmoItemId22["Tesla"] = "ammo_tesla";
1163
- AmmoItemId22["Trap"] = "ammo_trap";
1164
- AmmoItemId22["Prox"] = "ammo_prox";
1165
- return AmmoItemId22;
1166
- })(AmmoItemId || {});
1167
- var WEAPON_WHEEL_ORDER = [
1168
- "blaster",
1169
- "shotgun",
1170
- "supershotgun",
1171
- "machinegun",
1172
- "chaingun",
1173
- "grenadelauncher",
1174
- "rocketlauncher",
1175
- "grenades",
1176
- "hyperblaster",
1177
- "railgun",
1178
- "bfg10k"
1179
- /* BFG10K */
1180
- ];
1181
1229
 
1182
1230
  // src/inventory/ammo.ts
1183
- var AMMO_ITEM_DEFINITIONS = {
1184
- [AmmoItemId.Shells]: { id: AmmoItemId.Shells, ammoType: AmmoType.Shells, quantity: 10, weaponAmmo: false },
1185
- [AmmoItemId.Bullets]: { id: AmmoItemId.Bullets, ammoType: AmmoType.Bullets, quantity: 50, weaponAmmo: false },
1186
- [AmmoItemId.Rockets]: { id: AmmoItemId.Rockets, ammoType: AmmoType.Rockets, quantity: 5, weaponAmmo: false },
1187
- [AmmoItemId.Grenades]: { id: AmmoItemId.Grenades, ammoType: AmmoType.Grenades, quantity: 5, weaponAmmo: true },
1188
- [AmmoItemId.Cells]: { id: AmmoItemId.Cells, ammoType: AmmoType.Cells, quantity: 50, weaponAmmo: false },
1189
- [AmmoItemId.Slugs]: { id: AmmoItemId.Slugs, ammoType: AmmoType.Slugs, quantity: 10, weaponAmmo: false },
1190
- [AmmoItemId.MagSlugs]: { id: AmmoItemId.MagSlugs, ammoType: AmmoType.MagSlugs, quantity: 10, weaponAmmo: false },
1191
- [AmmoItemId.Flechettes]: { id: AmmoItemId.Flechettes, ammoType: AmmoType.Flechettes, quantity: 50, weaponAmmo: false },
1192
- [AmmoItemId.Disruptor]: { id: AmmoItemId.Disruptor, ammoType: AmmoType.Disruptor, quantity: 15, weaponAmmo: false },
1193
- [AmmoItemId.Tesla]: { id: AmmoItemId.Tesla, ammoType: AmmoType.Tesla, quantity: 5, weaponAmmo: false },
1194
- [AmmoItemId.Trap]: { id: AmmoItemId.Trap, ammoType: AmmoType.Trap, quantity: 5, weaponAmmo: false },
1195
- [AmmoItemId.Prox]: { id: AmmoItemId.Prox, ammoType: AmmoType.Prox, quantity: 5, weaponAmmo: false }
1196
- };
1197
1231
  function getAmmoItemDefinition(id) {
1198
1232
  return AMMO_ITEM_DEFINITIONS[id];
1199
1233
  }
@@ -1247,54 +1281,55 @@ function pickupAmmo(inventory, itemId, options = {}) {
1247
1281
  const amount = options.countOverride ?? def.quantity;
1248
1282
  return addAmmo(inventory, def.ammoType, amount);
1249
1283
  }
1284
+ var AMMO_ITEM_DEFINITIONS;
1285
+ var init_ammo = __esm({
1286
+ "src/inventory/ammo.ts"() {
1287
+ "use strict";
1288
+ init_esm();
1289
+ AMMO_ITEM_DEFINITIONS = {
1290
+ [AmmoItemId.Shells]: { id: AmmoItemId.Shells, ammoType: AmmoType.Shells, quantity: 10, weaponAmmo: false },
1291
+ [AmmoItemId.Bullets]: { id: AmmoItemId.Bullets, ammoType: AmmoType.Bullets, quantity: 50, weaponAmmo: false },
1292
+ [AmmoItemId.Rockets]: { id: AmmoItemId.Rockets, ammoType: AmmoType.Rockets, quantity: 5, weaponAmmo: false },
1293
+ [AmmoItemId.Grenades]: { id: AmmoItemId.Grenades, ammoType: AmmoType.Grenades, quantity: 5, weaponAmmo: true },
1294
+ [AmmoItemId.Cells]: { id: AmmoItemId.Cells, ammoType: AmmoType.Cells, quantity: 50, weaponAmmo: false },
1295
+ [AmmoItemId.Slugs]: { id: AmmoItemId.Slugs, ammoType: AmmoType.Slugs, quantity: 10, weaponAmmo: false },
1296
+ [AmmoItemId.MagSlugs]: { id: AmmoItemId.MagSlugs, ammoType: AmmoType.MagSlugs, quantity: 10, weaponAmmo: false },
1297
+ [AmmoItemId.Flechettes]: { id: AmmoItemId.Flechettes, ammoType: AmmoType.Flechettes, quantity: 50, weaponAmmo: false },
1298
+ [AmmoItemId.Disruptor]: { id: AmmoItemId.Disruptor, ammoType: AmmoType.Disruptor, quantity: 15, weaponAmmo: false },
1299
+ [AmmoItemId.Tesla]: { id: AmmoItemId.Tesla, ammoType: AmmoType.Tesla, quantity: 5, weaponAmmo: false },
1300
+ [AmmoItemId.Trap]: { id: AmmoItemId.Trap, ammoType: AmmoType.Trap, quantity: 5, weaponAmmo: false },
1301
+ [AmmoItemId.Prox]: { id: AmmoItemId.Prox, ammoType: AmmoType.Prox, quantity: 5, weaponAmmo: false }
1302
+ };
1303
+ }
1304
+ });
1250
1305
 
1251
1306
  // src/combat/damageFlags.ts
1252
- var DamageFlags = /* @__PURE__ */ ((DamageFlags2) => {
1253
- DamageFlags2[DamageFlags2["NONE"] = 0] = "NONE";
1254
- DamageFlags2[DamageFlags2["RADIUS"] = 1] = "RADIUS";
1255
- DamageFlags2[DamageFlags2["NO_ARMOR"] = 2] = "NO_ARMOR";
1256
- DamageFlags2[DamageFlags2["ENERGY"] = 4] = "ENERGY";
1257
- DamageFlags2[DamageFlags2["NO_KNOCKBACK"] = 8] = "NO_KNOCKBACK";
1258
- DamageFlags2[DamageFlags2["BULLET"] = 16] = "BULLET";
1259
- DamageFlags2[DamageFlags2["NO_PROTECTION"] = 32] = "NO_PROTECTION";
1260
- DamageFlags2[DamageFlags2["DESTROY_ARMOR"] = 64] = "DESTROY_ARMOR";
1261
- DamageFlags2[DamageFlags2["NO_REG_ARMOR"] = 128] = "NO_REG_ARMOR";
1262
- DamageFlags2[DamageFlags2["NO_POWER_ARMOR"] = 256] = "NO_POWER_ARMOR";
1263
- DamageFlags2[DamageFlags2["NO_INDICATOR"] = 512] = "NO_INDICATOR";
1264
- DamageFlags2[DamageFlags2["NO_DAMAGE_EFFECTS"] = 1024] = "NO_DAMAGE_EFFECTS";
1265
- return DamageFlags2;
1266
- })(DamageFlags || {});
1267
1307
  function hasAnyDamageFlag(flags, mask) {
1268
1308
  return (flags & mask) !== 0;
1269
1309
  }
1310
+ var DamageFlags;
1311
+ var init_damageFlags = __esm({
1312
+ "src/combat/damageFlags.ts"() {
1313
+ "use strict";
1314
+ DamageFlags = /* @__PURE__ */ ((DamageFlags2) => {
1315
+ DamageFlags2[DamageFlags2["NONE"] = 0] = "NONE";
1316
+ DamageFlags2[DamageFlags2["RADIUS"] = 1] = "RADIUS";
1317
+ DamageFlags2[DamageFlags2["NO_ARMOR"] = 2] = "NO_ARMOR";
1318
+ DamageFlags2[DamageFlags2["ENERGY"] = 4] = "ENERGY";
1319
+ DamageFlags2[DamageFlags2["NO_KNOCKBACK"] = 8] = "NO_KNOCKBACK";
1320
+ DamageFlags2[DamageFlags2["BULLET"] = 16] = "BULLET";
1321
+ DamageFlags2[DamageFlags2["NO_PROTECTION"] = 32] = "NO_PROTECTION";
1322
+ DamageFlags2[DamageFlags2["DESTROY_ARMOR"] = 64] = "DESTROY_ARMOR";
1323
+ DamageFlags2[DamageFlags2["NO_REG_ARMOR"] = 128] = "NO_REG_ARMOR";
1324
+ DamageFlags2[DamageFlags2["NO_POWER_ARMOR"] = 256] = "NO_POWER_ARMOR";
1325
+ DamageFlags2[DamageFlags2["NO_INDICATOR"] = 512] = "NO_INDICATOR";
1326
+ DamageFlags2[DamageFlags2["NO_DAMAGE_EFFECTS"] = 1024] = "NO_DAMAGE_EFFECTS";
1327
+ return DamageFlags2;
1328
+ })(DamageFlags || {});
1329
+ }
1330
+ });
1270
1331
 
1271
1332
  // src/combat/armor.ts
1272
- var ArmorType = /* @__PURE__ */ ((ArmorType2) => {
1273
- ArmorType2["BODY"] = "body";
1274
- ArmorType2["COMBAT"] = "combat";
1275
- ArmorType2["JACKET"] = "jacket";
1276
- return ArmorType2;
1277
- })(ArmorType || {});
1278
- var ARMOR_INFO = {
1279
- ["jacket" /* JACKET */]: {
1280
- baseCount: 25,
1281
- maxCount: 50,
1282
- normalProtection: 0.3,
1283
- energyProtection: 0
1284
- },
1285
- ["combat" /* COMBAT */]: {
1286
- baseCount: 50,
1287
- maxCount: 100,
1288
- normalProtection: 0.6,
1289
- energyProtection: 0.3
1290
- },
1291
- ["body" /* BODY */]: {
1292
- baseCount: 100,
1293
- maxCount: 200,
1294
- normalProtection: 0.8,
1295
- energyProtection: 0.6
1296
- }
1297
- };
1298
1333
  function applyRegularArmor(damage, flags, state) {
1299
1334
  if (damage <= 0 || hasAnyDamageFlag(flags, 2 /* NO_ARMOR */ | 128 /* NO_REG_ARMOR */) || !state.armorType || state.armorCount <= 0) {
1300
1335
  return { saved: 0, remainingArmor: state.armorCount };
@@ -1358,28 +1393,42 @@ function applyPowerArmor(damage, flags, hitPoint, _hitNormal, state, options = {
1358
1393
  const remainingCells = Math.max(0, state.cellCount - cellsSpent);
1359
1394
  return { saved, remainingCells };
1360
1395
  }
1396
+ var ArmorType, ARMOR_INFO;
1397
+ var init_armor = __esm({
1398
+ "src/combat/armor.ts"() {
1399
+ "use strict";
1400
+ init_esm();
1401
+ init_damageFlags();
1402
+ ArmorType = /* @__PURE__ */ ((ArmorType2) => {
1403
+ ArmorType2["BODY"] = "body";
1404
+ ArmorType2["COMBAT"] = "combat";
1405
+ ArmorType2["JACKET"] = "jacket";
1406
+ return ArmorType2;
1407
+ })(ArmorType || {});
1408
+ ARMOR_INFO = {
1409
+ ["jacket" /* JACKET */]: {
1410
+ baseCount: 25,
1411
+ maxCount: 50,
1412
+ normalProtection: 0.3,
1413
+ energyProtection: 0
1414
+ },
1415
+ ["combat" /* COMBAT */]: {
1416
+ baseCount: 50,
1417
+ maxCount: 100,
1418
+ normalProtection: 0.6,
1419
+ energyProtection: 0.3
1420
+ },
1421
+ ["body" /* BODY */]: {
1422
+ baseCount: 100,
1423
+ maxCount: 200,
1424
+ normalProtection: 0.8,
1425
+ energyProtection: 0.6
1426
+ }
1427
+ };
1428
+ }
1429
+ });
1361
1430
 
1362
1431
  // src/inventory/playerInventory.ts
1363
- var KeyId = /* @__PURE__ */ ((KeyId2) => {
1364
- KeyId2["Blue"] = "key_blue";
1365
- KeyId2["Red"] = "key_red";
1366
- KeyId2["Green"] = "key_green";
1367
- KeyId2["Yellow"] = "key_yellow";
1368
- KeyId2["DataCD"] = "key_data_cd";
1369
- KeyId2["PowerCube"] = "key_power_cube";
1370
- KeyId2["ExplosiveCharges"] = "key_explosive_charges";
1371
- KeyId2["PowerCore"] = "key_power_core";
1372
- KeyId2["Pyramid"] = "key_pyramid";
1373
- KeyId2["DataSpinner"] = "key_data_spinner";
1374
- KeyId2["Pass"] = "key_pass";
1375
- KeyId2["CommanderHead"] = "key_commander_head";
1376
- KeyId2["Airstrike"] = "key_airstrike";
1377
- KeyId2["NukeContainer"] = "key_nuke_container";
1378
- KeyId2["Nuke"] = "key_nuke";
1379
- KeyId2["RedFlag"] = "key_red_flag";
1380
- KeyId2["BlueFlag"] = "key_blue_flag";
1381
- return KeyId2;
1382
- })(KeyId || {});
1383
1432
  function createPlayerInventory(init = {}) {
1384
1433
  const ammoCaps = init.ammoCaps;
1385
1434
  const inv = {
@@ -1652,8 +1701,144 @@ function deserializePlayerInventory(serialized, options = {}) {
1652
1701
  items: new Set(serialized.items)
1653
1702
  };
1654
1703
  }
1704
+ var KeyId;
1705
+ var init_playerInventory = __esm({
1706
+ "src/inventory/playerInventory.ts"() {
1707
+ "use strict";
1708
+ init_ammo();
1709
+ init_esm();
1710
+ init_armor();
1711
+ KeyId = /* @__PURE__ */ ((KeyId2) => {
1712
+ KeyId2["Blue"] = "key_blue";
1713
+ KeyId2["Red"] = "key_red";
1714
+ KeyId2["Green"] = "key_green";
1715
+ KeyId2["Yellow"] = "key_yellow";
1716
+ KeyId2["DataCD"] = "key_data_cd";
1717
+ KeyId2["PowerCube"] = "key_power_cube";
1718
+ KeyId2["ExplosiveCharges"] = "key_explosive_charges";
1719
+ KeyId2["PowerCore"] = "key_power_core";
1720
+ KeyId2["Pyramid"] = "key_pyramid";
1721
+ KeyId2["DataSpinner"] = "key_data_spinner";
1722
+ KeyId2["Pass"] = "key_pass";
1723
+ KeyId2["CommanderHead"] = "key_commander_head";
1724
+ KeyId2["Airstrike"] = "key_airstrike";
1725
+ KeyId2["NukeContainer"] = "key_nuke_container";
1726
+ KeyId2["Nuke"] = "key_nuke";
1727
+ KeyId2["RedFlag"] = "key_red_flag";
1728
+ KeyId2["BlueFlag"] = "key_blue_flag";
1729
+ return KeyId2;
1730
+ })(KeyId || {});
1731
+ }
1732
+ });
1733
+
1734
+ // src/combat/weapons/state.ts
1735
+ function createPlayerWeaponStates() {
1736
+ return {
1737
+ states: /* @__PURE__ */ new Map()
1738
+ };
1739
+ }
1740
+ function getWeaponState(playerStates, weaponId) {
1741
+ let state = playerStates.states.get(weaponId);
1742
+ if (!state) {
1743
+ state = { lastFireTime: 0 };
1744
+ playerStates.states.set(weaponId, state);
1745
+ }
1746
+ return state;
1747
+ }
1748
+ var WeaponStateEnum;
1749
+ var init_state = __esm({
1750
+ "src/combat/weapons/state.ts"() {
1751
+ "use strict";
1752
+ WeaponStateEnum = /* @__PURE__ */ ((WeaponStateEnum2) => {
1753
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_READY"] = 0] = "WEAPON_READY";
1754
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_ACTIVATING"] = 1] = "WEAPON_ACTIVATING";
1755
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_DROPPING"] = 2] = "WEAPON_DROPPING";
1756
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_FIRING"] = 3] = "WEAPON_FIRING";
1757
+ return WeaponStateEnum2;
1758
+ })(WeaponStateEnum || {});
1759
+ }
1760
+ });
1761
+
1762
+ // src/combat/weapons/switching.ts
1763
+ var switching_exports = {};
1764
+ __export(switching_exports, {
1765
+ ChangeWeapon: () => ChangeWeapon,
1766
+ NoAmmoWeaponChange: () => NoAmmoWeaponChange,
1767
+ setInstantSwitch: () => setInstantSwitch,
1768
+ switchToBestWeapon: () => switchToBestWeapon
1769
+ });
1770
+ function setInstantSwitch(enabled) {
1771
+ instantSwitch = enabled;
1772
+ }
1773
+ function ChangeWeapon(ent, weaponId) {
1774
+ if (!ent.client) return;
1775
+ const client = ent.client;
1776
+ if (client.weaponstate === 2 /* WEAPON_DROPPING */) {
1777
+ return;
1778
+ }
1779
+ if (weaponId) {
1780
+ selectWeapon(client.inventory, weaponId);
1781
+ client.weaponstate = 1 /* WEAPON_ACTIVATING */;
1782
+ client.gun_frame = 0;
1783
+ if (instantSwitch) {
1784
+ client.weaponstate = 0 /* WEAPON_READY */;
1785
+ client.weapon_think_time = 0;
1786
+ return;
1787
+ }
1788
+ client.weapon_think_time = 0;
1789
+ }
1790
+ }
1791
+ function NoAmmoWeaponChange(ent) {
1792
+ if (!ent.client) return;
1793
+ switchToBestWeapon(ent);
1794
+ }
1795
+ function switchToBestWeapon(player) {
1796
+ if (!player.client) {
1797
+ return;
1798
+ }
1799
+ const inventory = player.client.inventory;
1800
+ let bestWeapon = null;
1801
+ if (inventory.ownedWeapons.has(WeaponId.BFG10K) && inventory.ammo.counts[AmmoType.Cells] >= 50) {
1802
+ bestWeapon = WeaponId.BFG10K;
1803
+ } else if (inventory.ownedWeapons.has(WeaponId.RocketLauncher) && inventory.ammo.counts[AmmoType.Rockets] >= 1) {
1804
+ bestWeapon = WeaponId.RocketLauncher;
1805
+ } else if (inventory.ownedWeapons.has(WeaponId.Railgun) && inventory.ammo.counts[AmmoType.Slugs] >= 1) {
1806
+ bestWeapon = WeaponId.Railgun;
1807
+ } else if (inventory.ownedWeapons.has(WeaponId.Chaingun) && inventory.ammo.counts[AmmoType.Bullets] >= 1) {
1808
+ bestWeapon = WeaponId.Chaingun;
1809
+ } else if (inventory.ownedWeapons.has(WeaponId.SuperShotgun) && inventory.ammo.counts[AmmoType.Shells] >= 2) {
1810
+ bestWeapon = WeaponId.SuperShotgun;
1811
+ } else if (inventory.ownedWeapons.has(WeaponId.Machinegun) && inventory.ammo.counts[AmmoType.Bullets] >= 1) {
1812
+ bestWeapon = WeaponId.Machinegun;
1813
+ } else if (inventory.ownedWeapons.has(WeaponId.Shotgun) && inventory.ammo.counts[AmmoType.Shells] >= 1) {
1814
+ bestWeapon = WeaponId.Shotgun;
1815
+ } else {
1816
+ bestWeapon = WeaponId.Blaster;
1817
+ }
1818
+ if (bestWeapon && bestWeapon !== inventory.currentWeapon) {
1819
+ selectWeapon(inventory, bestWeapon);
1820
+ player.client.weaponstate = 1 /* WEAPON_ACTIVATING */;
1821
+ player.client.gun_frame = 0;
1822
+ if (instantSwitch) {
1823
+ player.client.weaponstate = 0 /* WEAPON_READY */;
1824
+ }
1825
+ player.client.weapon_think_time = 0;
1826
+ }
1827
+ }
1828
+ var instantSwitch;
1829
+ var init_switching = __esm({
1830
+ "src/combat/weapons/switching.ts"() {
1831
+ "use strict";
1832
+ init_playerInventory();
1833
+ init_ammo();
1834
+ instantSwitch = false;
1835
+ }
1836
+ });
1655
1837
 
1656
1838
  // src/entities/entity.ts
1839
+ init_esm();
1840
+ init_playerInventory();
1841
+ init_ammo();
1657
1842
  var MoveType = /* @__PURE__ */ ((MoveType3) => {
1658
1843
  MoveType3[MoveType3["None"] = 0] = "None";
1659
1844
  MoveType3[MoveType3["Noclip"] = 1] = "Noclip";
@@ -2039,6 +2224,16 @@ var ENTITY_FIELD_METADATA = [
2039
2224
  // Added
2040
2225
  ];
2041
2226
 
2227
+ // src/entities/system.ts
2228
+ init_esm();
2229
+
2230
+ // src/physics/movement.ts
2231
+ init_esm();
2232
+
2233
+ // src/ai/movement.ts
2234
+ init_esm();
2235
+ init_esm();
2236
+
2042
2237
  // src/ai/constants.ts
2043
2238
  var RANGE_MELEE = 20;
2044
2239
  var RANGE_NEAR = 440;
@@ -2081,6 +2276,8 @@ var TraceMask = /* @__PURE__ */ ((TraceMask2) => {
2081
2276
  })(TraceMask || {});
2082
2277
 
2083
2278
  // src/ai/perception.ts
2279
+ init_esm();
2280
+ init_esm();
2084
2281
  var RangeCategory = /* @__PURE__ */ ((RangeCategory4) => {
2085
2282
  RangeCategory4["Melee"] = "melee";
2086
2283
  RangeCategory4["Near"] = "near";
@@ -2141,6 +2338,7 @@ function visible(self, other, trace, options) {
2141
2338
  }
2142
2339
 
2143
2340
  // src/ai/targeting.ts
2341
+ init_esm();
2144
2342
  function setIdealYawTowards(self, other) {
2145
2343
  const delta = {
2146
2344
  x: other.origin.x - self.origin.x,
@@ -2799,6 +2997,7 @@ function runPush(pusher, system, imports, frametime) {
2799
2997
  }
2800
2998
 
2801
2999
  // src/physics/fluid.ts
3000
+ init_esm();
2802
3001
  function checkWater2(ent, system, imports) {
2803
3002
  const origin = ent.origin;
2804
3003
  const mins = ent.mins;
@@ -3101,6 +3300,7 @@ var ThinkScheduler = class {
3101
3300
  };
3102
3301
 
3103
3302
  // src/entities/system.ts
3303
+ init_esm();
3104
3304
  function computeBounds(entity) {
3105
3305
  return {
3106
3306
  min: {
@@ -3233,6 +3433,9 @@ var EntitySystem = class {
3233
3433
  get pointcontents() {
3234
3434
  return this.imports.pointcontents;
3235
3435
  }
3436
+ get game() {
3437
+ return this._game;
3438
+ }
3236
3439
  get world() {
3237
3440
  return this.pool.world;
3238
3441
  }
@@ -3753,6 +3956,15 @@ function damageModName(mod) {
3753
3956
  return `MOD_${DamageMod[mod]}`;
3754
3957
  }
3755
3958
 
3959
+ // src/entities/misc.ts
3960
+ init_esm();
3961
+
3962
+ // src/combat/damage.ts
3963
+ init_esm();
3964
+ init_armor();
3965
+ init_damageFlags();
3966
+ init_esm();
3967
+
3756
3968
  // src/imports.ts
3757
3969
  var MulticastType = /* @__PURE__ */ ((MulticastType2) => {
3758
3970
  MulticastType2[MulticastType2["All"] = 0] = "All";
@@ -4006,7 +4218,11 @@ function registerMiscSpawns(registry) {
4006
4218
  registry.register("func_object", func_object);
4007
4219
  }
4008
4220
 
4221
+ // src/entities/targets.ts
4222
+ init_esm();
4223
+
4009
4224
  // src/entities/utils.ts
4225
+ init_esm();
4010
4226
  var VEC_UP = { x: 0, y: -1, z: 0 };
4011
4227
  var MOVEDIR_UP = { x: 0, y: 0, z: 1 };
4012
4228
  var VEC_DOWN = { x: 0, y: -2, z: 0 };
@@ -4028,6 +4244,7 @@ function setMovedir(angles) {
4028
4244
  }
4029
4245
 
4030
4246
  // src/entities/projectiles.ts
4247
+ init_esm();
4031
4248
  function createRocket(sys, owner, start, dir, damage, radiusDamage, speed, flashtype = 0) {
4032
4249
  const rocket = sys.spawn();
4033
4250
  rocket.classname = "rocket";
@@ -4483,6 +4700,7 @@ function useTargetSpawner(self, other, activator, context, registry) {
4483
4700
  warn: context.warn,
4484
4701
  free: context.free
4485
4702
  };
4703
+ ent.monsterinfo.aiflags |= 1024 /* DoNotCount */;
4486
4704
  spawnFunc(ent, spawnContext);
4487
4705
  context.entities.finalizeSpawn(ent);
4488
4706
  context.entities.linkentity(ent);
@@ -4490,6 +4708,7 @@ function useTargetSpawner(self, other, activator, context, registry) {
4490
4708
  if (self.speed) {
4491
4709
  ent.velocity = { ...self.movedir };
4492
4710
  }
4711
+ ent.renderfx |= RenderFx.IrVisible;
4493
4712
  }
4494
4713
  var SPAWNFLAG_BLASTER_NOTRAIL = 1;
4495
4714
  var SPAWNFLAG_BLASTER_NOEFFECTS = 2;
@@ -4875,6 +5094,7 @@ function registerTargetSpawns(registry) {
4875
5094
  }
4876
5095
 
4877
5096
  // src/entities/triggers.ts
5097
+ init_esm();
4878
5098
  var FRAME_TIME_SECONDS = 1 / 40;
4879
5099
  var THINK_INTERVAL = 0.1;
4880
5100
  var HURT_INTERVAL = 0.1;
@@ -5427,41 +5647,699 @@ function registerTriggerSpawns(registry) {
5427
5647
  registerTriggerMonsterJump(registry);
5428
5648
  }
5429
5649
 
5430
- // src/combat/weapons/state.ts
5431
- var WeaponStateEnum = /* @__PURE__ */ ((WeaponStateEnum2) => {
5432
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_READY"] = 0] = "WEAPON_READY";
5433
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_ACTIVATING"] = 1] = "WEAPON_ACTIVATING";
5434
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_DROPPING"] = 2] = "WEAPON_DROPPING";
5435
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_FIRING"] = 3] = "WEAPON_FIRING";
5436
- return WeaponStateEnum2;
5437
- })(WeaponStateEnum || {});
5438
- function createPlayerWeaponStates() {
5439
- return {
5440
- states: /* @__PURE__ */ new Map()
5441
- };
5650
+ // src/inventory/items.ts
5651
+ init_ammo();
5652
+ init_playerInventory();
5653
+
5654
+ // src/combat/weapons/chaingun.ts
5655
+ init_state();
5656
+ init_playerInventory();
5657
+
5658
+ // src/buttons.ts
5659
+ var BUTTON_ATTACK = 1;
5660
+
5661
+ // src/combat/weapons/animation.ts
5662
+ init_playerInventory();
5663
+
5664
+ // src/combat/weapons/firing.ts
5665
+ init_state();
5666
+ init_playerInventory();
5667
+ init_ammo();
5668
+ init_esm();
5669
+
5670
+ // src/combat/weapons/projectSource.ts
5671
+ init_esm();
5672
+ var VIEW_HEIGHT = 22;
5673
+ function P_ProjectSource(game, ent, offset, forward, right, up) {
5674
+ const origin = copyVec3(ent.origin);
5675
+ const eye = { ...origin, z: origin.z + (ent.viewheight ?? VIEW_HEIGHT) };
5676
+ const f = scaleVec3(forward, offset.x);
5677
+ const r = scaleVec3(right, offset.y);
5678
+ const u = scaleVec3(up, offset.z);
5679
+ const point = addVec3(addVec3(addVec3(eye, f), r), u);
5680
+ const tr = game.trace(eye, null, null, point, ent, MASK_SOLID);
5681
+ if (tr.fraction < 1) {
5682
+ return { x: tr.endpos.x - forward.x, y: tr.endpos.y - forward.y, z: tr.endpos.z - forward.z };
5683
+ }
5684
+ return point;
5442
5685
  }
5443
- function getWeaponState(playerStates, weaponId) {
5444
- let state = playerStates.states.get(weaponId);
5445
- if (!state) {
5446
- state = { lastFireTime: 0 };
5447
- playerStates.states.set(weaponId, state);
5686
+
5687
+ // src/combat/weapons/frames.ts
5688
+ var FRAME_SHOTGUN_ACTIVATE_LAST = 7;
5689
+ var FRAME_SHOTGUN_FIRE_LAST = 18;
5690
+ var FRAME_SHOTGUN_IDLE_LAST = 36;
5691
+ var FRAME_SHOTGUN_DEACTIVATE_LAST = 39;
5692
+ var FRAME_SSHOTGUN_ACTIVATE_LAST = 5;
5693
+ var FRAME_SSHOTGUN_FIRE_LAST = 28;
5694
+ var FRAME_SSHOTGUN_IDLE_LAST = 52;
5695
+ var FRAME_SSHOTGUN_DEACTIVATE_LAST = 57;
5696
+ var FRAME_MACHINEGUN_ACTIVATE_LAST = 3;
5697
+ var FRAME_MACHINEGUN_FIRE_LAST = 23;
5698
+ var FRAME_MACHINEGUN_IDLE_LAST = 52;
5699
+ var FRAME_MACHINEGUN_DEACTIVATE_LAST = 61;
5700
+ var FRAME_CHAINGUN_FIRE_FRAME = 5;
5701
+ var FRAME_CHAINGUN_FIRE_LAST = 21;
5702
+ var FRAME_CHAINGUN_IDLE_LAST = 52;
5703
+ var FRAME_CHAINGUN_DEACTIVATE_LAST = 61;
5704
+ var FRAME_RAILGUN_ACTIVATE_LAST = 3;
5705
+ var FRAME_RAILGUN_FIRE_LAST = 18;
5706
+ var FRAME_RAILGUN_IDLE_LAST = 51;
5707
+ var FRAME_RAILGUN_DEACTIVATE_LAST = 56;
5708
+ var FRAME_ROCKET_ACTIVATE_LAST = 3;
5709
+ var FRAME_ROCKET_FIRE_LAST = 12;
5710
+ var FRAME_ROCKET_IDLE_LAST = 34;
5711
+ var FRAME_ROCKET_DEACTIVATE_LAST = 38;
5712
+ var FRAME_HYPERBLASTER_FIRE_FRAME = 6;
5713
+ var FRAME_HYPERBLASTER_FIRE_LAST = 9;
5714
+ var FRAME_HYPERBLASTER_IDLE_LAST = 28;
5715
+ var FRAME_HYPERBLASTER_DEACTIVATE_LAST = 32;
5716
+ var FRAME_BFG_ACTIVATE_LAST = 8;
5717
+ var FRAME_BFG_FIRE_LAST = 32;
5718
+ var FRAME_BFG_IDLE_LAST = 54;
5719
+ var FRAME_BFG_DEACTIVATE_LAST = 58;
5720
+ var FRAME_GRENADELAUNCHER_ACTIVATE_LAST = 5;
5721
+ var FRAME_GRENADELAUNCHER_FIRE_LAST = 16;
5722
+ var FRAME_GRENADELAUNCHER_IDLE_LAST = 36;
5723
+ var FRAME_GRENADELAUNCHER_DEACTIVATE_LAST = 39;
5724
+ var FRAME_BLASTER_ACTIVATE_LAST = 4;
5725
+ var FRAME_BLASTER_FIRE_LAST = 8;
5726
+ var FRAME_BLASTER_IDLE_LAST = 52;
5727
+ var FRAME_BLASTER_DEACTIVATE_LAST = 55;
5728
+
5729
+ // src/entities/player_anim.ts
5730
+ var FRAME_stand01 = 0;
5731
+ var FRAME_stand40 = 39;
5732
+ var FRAME_run1 = 40;
5733
+ var FRAME_run6 = 45;
5734
+ var FRAME_attack1 = 46;
5735
+ var FRAME_attack8 = 53;
5736
+ var FRAME_pain101 = 54;
5737
+ var FRAME_pain104 = 57;
5738
+ var FRAME_pain201 = 58;
5739
+ var FRAME_pain204 = 61;
5740
+ var FRAME_pain301 = 62;
5741
+ var FRAME_pain304 = 65;
5742
+ var FRAME_death101 = 66;
5743
+ var FRAME_death106 = 71;
5744
+ var FRAME_death201 = 72;
5745
+ var FRAME_death206 = 77;
5746
+ var FRAME_death301 = 78;
5747
+ var FRAME_death306 = 83;
5748
+ var FRAME_crattak1 = 109;
5749
+ var FRAME_crattak9 = 117;
5750
+ var ANIM_BASIC = 0;
5751
+ var ANIM_ATTACK = 1;
5752
+ var ANIM_PAIN = 2;
5753
+ var ANIM_DEATH = 3;
5754
+
5755
+ // src/combat/weapons/firing.ts
5756
+ var random2 = createRandomGenerator();
5757
+ function applyKick(player, pitch, yaw = 0, kickOrigin = 0) {
5758
+ if (player.client) {
5759
+ player.client.kick_angles = { x: pitch, y: yaw, z: 0 };
5760
+ player.client.kick_origin = { x: kickOrigin, y: 0, z: 0 };
5761
+ }
5762
+ }
5763
+ function setPlayerAttackAnim(player) {
5764
+ if (!player.client) return;
5765
+ const ducked = (player.client.pm_flags & 2) !== 0;
5766
+ player.client.anim_priority = ANIM_ATTACK;
5767
+ if (ducked) {
5768
+ player.frame = FRAME_crattak1 - 1;
5769
+ player.client.anim_end = FRAME_crattak9;
5770
+ } else {
5771
+ player.frame = FRAME_attack1 - 1;
5772
+ player.client.anim_end = FRAME_attack8;
5773
+ }
5774
+ }
5775
+ function fireHitscan(game, player, start, forward, damage, knockback, mod) {
5776
+ const end = { x: start.x + forward.x * 8192, y: start.y + forward.y * 8192, z: start.z + forward.z * 8192 };
5777
+ const trace = game.trace(
5778
+ start,
5779
+ null,
5780
+ null,
5781
+ end,
5782
+ player,
5783
+ 0
5784
+ );
5785
+ if (trace.ent && trace.ent.takedamage) {
5786
+ T_Damage(
5787
+ trace.ent,
5788
+ player,
5789
+ player,
5790
+ ZERO_VEC3,
5791
+ trace.endpos,
5792
+ trace.plane ? trace.plane.normal : ZERO_VEC3,
5793
+ damage,
5794
+ knockback,
5795
+ 16 /* BULLET */,
5796
+ mod,
5797
+ game.time,
5798
+ game.multicast
5799
+ );
5800
+ } else {
5801
+ if (trace.plane) {
5802
+ game.multicast(trace.endpos, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.GUNSHOT, trace.endpos, trace.plane.normal);
5803
+ }
5804
+ }
5805
+ }
5806
+ function fireMultiplePellets(game, player, start, forward, right, up, count, damage, knockback, hspread, vspread, mod) {
5807
+ for (let i = 0; i < count; i++) {
5808
+ const spread = addVec3(scaleVec3(right, random2.crandom() * hspread), scaleVec3(up, random2.crandom() * vspread));
5809
+ const dir = addVec3(forward, spread);
5810
+ const end = { x: start.x + dir.x * 8192, y: start.y + dir.y * 8192, z: start.z + dir.z * 8192 };
5811
+ const trace = game.trace(start, null, null, end, player, 0);
5812
+ if (trace.ent && trace.ent.takedamage) {
5813
+ T_Damage(
5814
+ trace.ent,
5815
+ player,
5816
+ player,
5817
+ ZERO_VEC3,
5818
+ trace.endpos,
5819
+ trace.plane ? trace.plane.normal : ZERO_VEC3,
5820
+ damage,
5821
+ knockback,
5822
+ 16 /* BULLET */,
5823
+ mod,
5824
+ game.time,
5825
+ game.multicast
5826
+ );
5827
+ } else if (trace.plane) {
5828
+ if (random2.frandom() > 0.9) {
5829
+ game.multicast(trace.endpos, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.GUNSHOT, trace.endpos, trace.plane.normal);
5830
+ }
5831
+ }
5832
+ }
5833
+ }
5834
+ function fireRailgun(game, player, start, forward, damage, knockback) {
5835
+ const originalStart = { ...start };
5836
+ let currentStart = { ...start };
5837
+ const end = { x: start.x + forward.x * 8192, y: start.y + forward.y * 8192, z: start.z + forward.z * 8192 };
5838
+ let ignore = player;
5839
+ let count = 0;
5840
+ let finalEnd = end;
5841
+ while (count < 16) {
5842
+ count++;
5843
+ const trace = game.trace(currentStart, null, null, end, ignore, 0);
5844
+ finalEnd = trace.endpos;
5845
+ if (trace.fraction >= 1) {
5846
+ break;
5847
+ }
5848
+ if (trace.ent && trace.ent.takedamage) {
5849
+ T_Damage(
5850
+ trace.ent,
5851
+ player,
5852
+ player,
5853
+ ZERO_VEC3,
5854
+ trace.endpos,
5855
+ trace.plane ? trace.plane.normal : ZERO_VEC3,
5856
+ damage,
5857
+ knockback,
5858
+ 4 /* ENERGY */,
5859
+ 11 /* RAILGUN */,
5860
+ game.time,
5861
+ game.multicast
5862
+ );
5863
+ }
5864
+ ignore = trace.ent;
5865
+ currentStart = trace.endpos;
5866
+ if (!trace.ent || trace.ent === game.entities.world) {
5867
+ break;
5868
+ }
5869
+ }
5870
+ game.multicast(originalStart, 2 /* Phs */, ServerCommand.temp_entity, TempEntity.RAILTRAIL, originalStart, finalEnd);
5871
+ }
5872
+ function fireShotgun(game, player) {
5873
+ if (!player.client) return;
5874
+ const inventory = player.client.inventory;
5875
+ if (inventory.ammo.counts[AmmoType.Shells] < 1) {
5876
+ return;
5877
+ }
5878
+ inventory.ammo.counts[AmmoType.Shells]--;
5879
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_SHOTGUN);
5880
+ applyKick(player, -2, 0, -2);
5881
+ setPlayerAttackAnim(player);
5882
+ const { forward, right, up } = angleVectors(player.angles);
5883
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
5884
+ fireMultiplePellets(game, player, source, forward, right, up, 12, 4, 1, 500, 500, 2 /* SHOTGUN */);
5885
+ }
5886
+ function fireSuperShotgun(game, player) {
5887
+ if (!player.client) return;
5888
+ const inventory = player.client.inventory;
5889
+ if (inventory.ammo.counts[AmmoType.Shells] < 2) {
5890
+ return;
5891
+ }
5892
+ inventory.ammo.counts[AmmoType.Shells] -= 2;
5893
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_SSHOTGUN);
5894
+ applyKick(player, -4, 0, -4);
5895
+ setPlayerAttackAnim(player);
5896
+ const { forward, right, up } = angleVectors(player.angles);
5897
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
5898
+ const { forward: forward1, right: right1, up: up1 } = angleVectors({ ...player.angles, y: player.angles.y - 5 });
5899
+ fireMultiplePellets(game, player, source, forward1, right1, up1, 10, 6, 1, 700, 700, 3 /* SSHOTGUN */);
5900
+ const { forward: forward2, right: right2, up: up2 } = angleVectors({ ...player.angles, y: player.angles.y + 5 });
5901
+ fireMultiplePellets(game, player, source, forward2, right2, up2, 10, 6, 1, 700, 700, 3 /* SSHOTGUN */);
5902
+ }
5903
+ function fireMachinegun(game, player) {
5904
+ if (!player.client) return;
5905
+ const inventory = player.client.inventory;
5906
+ if (inventory.ammo.counts[AmmoType.Bullets] < 1) {
5907
+ return;
5908
+ }
5909
+ inventory.ammo.counts[AmmoType.Bullets]--;
5910
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_MACHINEGUN);
5911
+ applyKick(player, -1, random2.crandom() * 0.5, 0);
5912
+ setPlayerAttackAnim(player);
5913
+ const { forward, right, up } = angleVectors(player.angles);
5914
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
5915
+ fireHitscan(game, player, source, forward, 8, 1, 4 /* MACHINEGUN */);
5916
+ }
5917
+ function fireChaingun(game, player) {
5918
+ if (!player.client) return;
5919
+ const inventory = player.client.inventory;
5920
+ const weaponState = getWeaponState(player.client.weaponStates, WeaponId.Chaingun);
5921
+ if (game.time - weaponState.lastFireTime > 200) {
5922
+ weaponState.spinupCount = 0;
5923
+ }
5924
+ const spinupCount = (weaponState.spinupCount || 0) + 1;
5925
+ weaponState.spinupCount = spinupCount;
5926
+ let shots;
5927
+ if (spinupCount <= 5) {
5928
+ shots = 1;
5929
+ if (spinupCount === 1) {
5930
+ game.sound(player, 0, "weapons/chngnu1a.wav", 1, 0, 0);
5931
+ }
5932
+ } else {
5933
+ if (spinupCount <= 10) {
5934
+ shots = 2;
5935
+ } else {
5936
+ shots = 3;
5937
+ }
5938
+ game.sound(player, 0, "weapons/chngnl1a.wav", 1, 0, 0);
5939
+ }
5940
+ if (inventory.ammo.counts[AmmoType.Bullets] < shots) {
5941
+ shots = inventory.ammo.counts[AmmoType.Bullets];
5942
+ }
5943
+ if (shots === 0) {
5944
+ return;
5945
+ }
5946
+ inventory.ammo.counts[AmmoType.Bullets] -= shots;
5947
+ const damage = game.deathmatch ? 6 : 8;
5948
+ const knockback = 1;
5949
+ applyKick(player, -0.5, random2.crandom() * (0.5 + shots * 0.15), 0);
5950
+ setPlayerAttackAnim(player);
5951
+ const { forward, right, up } = angleVectors(player.angles);
5952
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
5953
+ for (let i = 0; i < shots; i++) {
5954
+ const spread = addVec3(scaleVec3(right, random2.crandom() * 4), scaleVec3(up, random2.crandom() * 4));
5955
+ const dir = addVec3(forward, spread);
5956
+ fireHitscan(game, player, source, dir, damage, knockback, 5 /* CHAINGUN */);
5957
+ }
5958
+ const flash = MZ_CHAINGUN1 + shots - 1;
5959
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, flash);
5960
+ }
5961
+ function fireRailgunShot(game, player) {
5962
+ if (!player.client) return;
5963
+ const inventory = player.client.inventory;
5964
+ if (inventory.ammo.counts[AmmoType.Slugs] < 1) {
5965
+ return;
5966
+ }
5967
+ inventory.ammo.counts[AmmoType.Slugs]--;
5968
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_RAILGUN);
5969
+ applyKick(player, -3, 0, -3);
5970
+ setPlayerAttackAnim(player);
5971
+ const { forward, right, up } = angleVectors(player.angles);
5972
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
5973
+ const damage = game.deathmatch ? 100 : 125;
5974
+ const knockback = game.deathmatch ? 200 : 225;
5975
+ fireRailgun(game, player, source, forward, damage, knockback);
5976
+ }
5977
+ function fireHyperBlaster(game, player) {
5978
+ if (!player.client) return;
5979
+ const inventory = player.client.inventory;
5980
+ if (inventory.ammo.counts[AmmoType.Cells] < 1) {
5981
+ return;
5982
+ }
5983
+ inventory.ammo.counts[AmmoType.Cells]--;
5984
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_HYPERBLASTER);
5985
+ applyKick(player, -0.5, 0, 0);
5986
+ setPlayerAttackAnim(player);
5987
+ const { forward, right, up } = angleVectors(player.angles);
5988
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
5989
+ const damage = game.deathmatch ? 15 : 20;
5990
+ createBlasterBolt(game.entities, player, source, forward, damage, 1e3, 10 /* HYPERBLASTER */);
5991
+ }
5992
+ function fireBlaster(game, player) {
5993
+ if (!player.client) return;
5994
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_BLASTER);
5995
+ applyKick(player, -0.5, 0, 0);
5996
+ setPlayerAttackAnim(player);
5997
+ const { forward, right, up } = angleVectors(player.angles);
5998
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
5999
+ createBlasterBolt(game.entities, player, source, forward, 15, 1500, 1 /* BLASTER */);
6000
+ }
6001
+ function fireRocket(game, player) {
6002
+ if (!player.client) return;
6003
+ const inventory = player.client.inventory;
6004
+ if (inventory.ammo.counts[AmmoType.Rockets] < 1) {
6005
+ return;
6006
+ }
6007
+ inventory.ammo.counts[AmmoType.Rockets]--;
6008
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_ROCKET);
6009
+ applyKick(player, -2, 0, -2);
6010
+ setPlayerAttackAnim(player);
6011
+ const { forward, right, up } = angleVectors(player.angles);
6012
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6013
+ const damage = 100 + game.random.irandom(21);
6014
+ const radiusDamage = 120;
6015
+ createRocket(game.entities, player, source, forward, damage, radiusDamage, 650);
6016
+ }
6017
+ function fireGrenadeLauncher(game, player) {
6018
+ if (!player.client) return;
6019
+ const inventory = player.client.inventory;
6020
+ if (inventory.ammo.counts[AmmoType.Grenades] < 1) {
6021
+ return;
6022
+ }
6023
+ inventory.ammo.counts[AmmoType.Grenades]--;
6024
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_GRENADE);
6025
+ applyKick(player, -2, 0, -2);
6026
+ setPlayerAttackAnim(player);
6027
+ const { forward, right, up } = angleVectors(player.angles);
6028
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6029
+ createGrenade(game.entities, player, source, forward, 120, 600);
6030
+ }
6031
+ function fireBFG(game, player) {
6032
+ if (!player.client) return;
6033
+ const inventory = player.client.inventory;
6034
+ const gun_frame = player.client.gun_frame;
6035
+ const isPrimeFrame = gun_frame === 9 || gun_frame === 0 || gun_frame === void 0;
6036
+ const isFireFrame = gun_frame === 22 || gun_frame === 0 || gun_frame === void 0;
6037
+ if (isPrimeFrame) {
6038
+ if (inventory.ammo.counts[AmmoType.Cells] < 50) {
6039
+ return;
6040
+ }
6041
+ inventory.ammo.counts[AmmoType.Cells] -= 50;
6042
+ game.sound(player, 0, "weapons/bfg__f1y.wav", 1, 0, 0);
6043
+ }
6044
+ if (isFireFrame) {
6045
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_BFG);
6046
+ applyKick(player, -5, 0, -2);
6047
+ setPlayerAttackAnim(player);
6048
+ const { forward, right, up } = angleVectors(player.angles);
6049
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6050
+ const damage = game.deathmatch ? 200 : 500;
6051
+ createBfgBall(game.entities, player, source, forward, damage, 400, 200);
6052
+ } else if (gun_frame === void 0 || gun_frame === 0) {
5448
6053
  }
5449
- return state;
5450
6054
  }
5451
6055
 
5452
- // src/buttons.ts
5453
- var BUTTON_ATTACK = 1;
6056
+ // src/combat/weapons/animation.ts
6057
+ function Weapon_AnimationTime(ent) {
6058
+ let time = 0.1;
6059
+ if (ent.client?.inventory.powerups.has(PowerupId.TechHaste)) {
6060
+ time *= 0.5;
6061
+ }
6062
+ if (ent.client?.inventory.powerups.has(PowerupId.QuadFire)) {
6063
+ time *= 0.25;
6064
+ }
6065
+ return time;
6066
+ }
6067
+ function Weapon_Generic(ent, FRAME_ACTIVATE_LAST, FRAME_FIRE_LAST, FRAME_IDLE_LAST, FRAME_DEACTIVATE_LAST, pause_frames, fire_frames, fire, sys) {
6068
+ if (!ent.client) return;
6069
+ const client = ent.client;
6070
+ const time = sys.timeSeconds;
6071
+ if (client.weapon_think_time && client.weapon_think_time <= time) {
6072
+ client.weapon_think_time = 0;
6073
+ }
6074
+ if (client.weapon_think_time && client.weapon_think_time > time) {
6075
+ return;
6076
+ }
6077
+ if (client.weaponstate === 1 /* WEAPON_ACTIVATING */) {
6078
+ if (client.gun_frame < FRAME_ACTIVATE_LAST) {
6079
+ client.gun_frame++;
6080
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6081
+ return;
6082
+ }
6083
+ client.weaponstate = 0 /* WEAPON_READY */;
6084
+ client.gun_frame = FRAME_FIRE_LAST + 1;
6085
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6086
+ return;
6087
+ }
6088
+ if (client.weaponstate === 2 /* WEAPON_DROPPING */) {
6089
+ if (client.gun_frame < FRAME_DEACTIVATE_LAST) {
6090
+ client.gun_frame++;
6091
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6092
+ return;
6093
+ }
6094
+ Promise.resolve().then(() => (init_switching(), switching_exports)).then(({ ChangeWeapon: ChangeWeapon2 }) => {
6095
+ ChangeWeapon2(ent);
6096
+ });
6097
+ return;
6098
+ }
6099
+ if (client.weaponstate === 0 /* WEAPON_READY */) {
6100
+ if (client.buttons & 1) {
6101
+ client.weaponstate = 3 /* WEAPON_FIRING */;
6102
+ client.gun_frame = FRAME_ACTIVATE_LAST + 1;
6103
+ return;
6104
+ }
6105
+ if (client.gun_frame < FRAME_IDLE_LAST) {
6106
+ client.gun_frame++;
6107
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6108
+ if (pause_frames) {
6109
+ for (const frame of pause_frames) {
6110
+ if (client.gun_frame === frame) {
6111
+ if (random2.frandom() < 0.5) {
6112
+ return;
6113
+ }
6114
+ }
6115
+ }
6116
+ }
6117
+ return;
6118
+ }
6119
+ client.gun_frame = FRAME_FIRE_LAST + 1;
6120
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6121
+ return;
6122
+ }
6123
+ if (client.weaponstate === 3 /* WEAPON_FIRING */) {
6124
+ if (fire_frames) {
6125
+ for (const frame of fire_frames) {
6126
+ if (client.gun_frame === frame) {
6127
+ if (fire) fire(ent);
6128
+ break;
6129
+ }
6130
+ }
6131
+ }
6132
+ if (client.gun_frame < FRAME_FIRE_LAST) {
6133
+ client.gun_frame++;
6134
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6135
+ return;
6136
+ }
6137
+ client.weaponstate = 0 /* WEAPON_READY */;
6138
+ client.gun_frame = FRAME_FIRE_LAST + 1;
6139
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6140
+ return;
6141
+ }
6142
+ }
6143
+ function Weapon_Repeating(ent, FRAME_FIRE_FRAME, FRAME_FIRE_LAST, FRAME_IDLE_LAST, FRAME_PAUSE, FRAME_NOOP, fire, sys) {
6144
+ if (!ent.client) return;
6145
+ const client = ent.client;
6146
+ if (client.weaponstate === 3 /* WEAPON_FIRING */) {
6147
+ if (client.gun_frame === FRAME_FIRE_LAST || client.gun_frame === FRAME_IDLE_LAST) {
6148
+ client.gun_frame = FRAME_FIRE_FRAME;
6149
+ } else {
6150
+ client.gun_frame++;
6151
+ }
6152
+ if (fire) {
6153
+ fire(ent);
6154
+ }
6155
+ if (!(client.buttons & 1)) {
6156
+ client.gun_frame = FRAME_IDLE_LAST + 1;
6157
+ client.weaponstate = 0 /* WEAPON_READY */;
6158
+ }
6159
+ } else {
6160
+ Weapon_Generic(
6161
+ ent,
6162
+ FRAME_FIRE_FRAME - 1,
6163
+ FRAME_FIRE_LAST,
6164
+ FRAME_IDLE_LAST,
6165
+ FRAME_PAUSE,
6166
+ null,
6167
+ null,
6168
+ fire,
6169
+ sys
6170
+ );
6171
+ }
6172
+ }
5454
6173
 
5455
6174
  // src/combat/weapons/chaingun.ts
5456
6175
  function chaingunThink(player, sys) {
5457
- if (!player.client) {
5458
- return;
5459
- }
5460
6176
  const weaponState = getWeaponState(player.client.weaponStates, WeaponId.Chaingun);
5461
6177
  if (!(player.client.buttons & BUTTON_ATTACK) && weaponState.spinupCount && weaponState.spinupCount > 0) {
5462
6178
  sys.sound(player, 0, "weapons/chngnd1a.wav", 1, 0, 0);
5463
6179
  weaponState.spinupCount = 0;
5464
6180
  }
6181
+ Weapon_Repeating(
6182
+ player,
6183
+ FRAME_CHAINGUN_FIRE_FRAME,
6184
+ FRAME_CHAINGUN_FIRE_LAST,
6185
+ FRAME_CHAINGUN_IDLE_LAST,
6186
+ FRAME_CHAINGUN_DEACTIVATE_LAST,
6187
+ 0,
6188
+ // FRAME_NOOP
6189
+ (ent) => fireChaingun(sys.game, ent),
6190
+ sys
6191
+ );
6192
+ }
6193
+
6194
+ // src/combat/weapons/shotgun.ts
6195
+ var SHOTGUN_PAUSE_FRAMES = [22, 28, 34];
6196
+ var SHOTGUN_FIRE_FRAMES = [8];
6197
+ function shotgunThink(player, sys) {
6198
+ Weapon_Generic(
6199
+ player,
6200
+ FRAME_SHOTGUN_ACTIVATE_LAST,
6201
+ FRAME_SHOTGUN_FIRE_LAST,
6202
+ FRAME_SHOTGUN_IDLE_LAST,
6203
+ FRAME_SHOTGUN_DEACTIVATE_LAST,
6204
+ SHOTGUN_PAUSE_FRAMES,
6205
+ SHOTGUN_FIRE_FRAMES,
6206
+ (ent) => fireShotgun(sys.game, ent),
6207
+ sys
6208
+ );
6209
+ }
6210
+
6211
+ // src/combat/weapons/supershotgun.ts
6212
+ var SSHOTGUN_PAUSE_FRAMES = [29, 42, 57];
6213
+ var SSHOTGUN_FIRE_FRAMES = [22, 28];
6214
+ function superShotgunThink(player, sys) {
6215
+ Weapon_Generic(
6216
+ player,
6217
+ FRAME_SSHOTGUN_ACTIVATE_LAST,
6218
+ FRAME_SSHOTGUN_FIRE_LAST,
6219
+ FRAME_SSHOTGUN_IDLE_LAST,
6220
+ FRAME_SSHOTGUN_DEACTIVATE_LAST,
6221
+ SSHOTGUN_PAUSE_FRAMES,
6222
+ SSHOTGUN_FIRE_FRAMES,
6223
+ (ent) => fireSuperShotgun(sys.game, ent),
6224
+ sys
6225
+ );
6226
+ }
6227
+
6228
+ // src/combat/weapons/machinegun.ts
6229
+ var MACHINEGUN_PAUSE_FRAMES = [23, 45];
6230
+ var MACHINEGUN_FIRE_FRAMES = [4, 5, 30, 31];
6231
+ function machinegunThink(player, sys) {
6232
+ Weapon_Generic(
6233
+ player,
6234
+ FRAME_MACHINEGUN_ACTIVATE_LAST,
6235
+ FRAME_MACHINEGUN_FIRE_LAST,
6236
+ FRAME_MACHINEGUN_IDLE_LAST,
6237
+ FRAME_MACHINEGUN_DEACTIVATE_LAST,
6238
+ MACHINEGUN_PAUSE_FRAMES,
6239
+ MACHINEGUN_FIRE_FRAMES,
6240
+ (ent) => fireMachinegun(sys.game, ent),
6241
+ sys
6242
+ );
6243
+ }
6244
+
6245
+ // src/combat/weapons/rocket.ts
6246
+ var ROCKET_PAUSE_FRAMES = [25, 33];
6247
+ var ROCKET_FIRE_FRAMES = [4];
6248
+ function rocketLauncherThink(player, sys) {
6249
+ Weapon_Generic(
6250
+ player,
6251
+ FRAME_ROCKET_ACTIVATE_LAST,
6252
+ FRAME_ROCKET_FIRE_LAST,
6253
+ FRAME_ROCKET_IDLE_LAST,
6254
+ FRAME_ROCKET_DEACTIVATE_LAST,
6255
+ ROCKET_PAUSE_FRAMES,
6256
+ ROCKET_FIRE_FRAMES,
6257
+ (ent) => fireRocket(sys.game, ent),
6258
+ sys
6259
+ );
6260
+ }
6261
+
6262
+ // src/combat/weapons/hyperblaster.ts
6263
+ function hyperBlasterThink(player, sys) {
6264
+ Weapon_Repeating(
6265
+ player,
6266
+ FRAME_HYPERBLASTER_FIRE_FRAME,
6267
+ FRAME_HYPERBLASTER_FIRE_LAST,
6268
+ FRAME_HYPERBLASTER_IDLE_LAST,
6269
+ FRAME_HYPERBLASTER_DEACTIVATE_LAST,
6270
+ 0,
6271
+ // FRAME_NOOP
6272
+ (ent) => fireHyperBlaster(sys.game, ent),
6273
+ sys
6274
+ );
6275
+ }
6276
+
6277
+ // src/combat/weapons/railgun.ts
6278
+ var RAILGUN_PAUSE_FRAMES = [56];
6279
+ var RAILGUN_FIRE_FRAMES = [4];
6280
+ function railgunThink(player, sys) {
6281
+ Weapon_Generic(
6282
+ player,
6283
+ FRAME_RAILGUN_ACTIVATE_LAST,
6284
+ FRAME_RAILGUN_FIRE_LAST,
6285
+ FRAME_RAILGUN_IDLE_LAST,
6286
+ FRAME_RAILGUN_DEACTIVATE_LAST,
6287
+ RAILGUN_PAUSE_FRAMES,
6288
+ RAILGUN_FIRE_FRAMES,
6289
+ (ent) => fireRailgunShot(sys.game, ent),
6290
+ sys
6291
+ );
6292
+ }
6293
+
6294
+ // src/combat/weapons/bfg.ts
6295
+ var BFG_PAUSE_FRAMES = [39, 45, 50, 54];
6296
+ var BFG_FIRE_FRAMES = [9, 22];
6297
+ function bfgThink2(player, sys) {
6298
+ Weapon_Generic(
6299
+ player,
6300
+ FRAME_BFG_ACTIVATE_LAST,
6301
+ FRAME_BFG_FIRE_LAST,
6302
+ FRAME_BFG_IDLE_LAST,
6303
+ FRAME_BFG_DEACTIVATE_LAST,
6304
+ BFG_PAUSE_FRAMES,
6305
+ BFG_FIRE_FRAMES,
6306
+ (ent) => fireBFG(sys.game, ent),
6307
+ sys
6308
+ );
6309
+ }
6310
+
6311
+ // src/combat/weapons/grenadelauncher.ts
6312
+ var GRENADELAUNCHER_PAUSE_FRAMES = [34, 51, 59];
6313
+ var GRENADELAUNCHER_FIRE_FRAMES = [6];
6314
+ function grenadeLauncherThink(player, sys) {
6315
+ Weapon_Generic(
6316
+ player,
6317
+ FRAME_GRENADELAUNCHER_ACTIVATE_LAST,
6318
+ FRAME_GRENADELAUNCHER_FIRE_LAST,
6319
+ FRAME_GRENADELAUNCHER_IDLE_LAST,
6320
+ FRAME_GRENADELAUNCHER_DEACTIVATE_LAST,
6321
+ GRENADELAUNCHER_PAUSE_FRAMES,
6322
+ GRENADELAUNCHER_FIRE_FRAMES,
6323
+ (ent) => fireGrenadeLauncher(sys.game, ent),
6324
+ sys
6325
+ );
6326
+ }
6327
+
6328
+ // src/combat/weapons/blaster.ts
6329
+ var BLASTER_PAUSE_FRAMES = [19, 32];
6330
+ var BLASTER_FIRE_FRAMES = [5];
6331
+ function blasterThink(player, sys) {
6332
+ Weapon_Generic(
6333
+ player,
6334
+ FRAME_BLASTER_ACTIVATE_LAST,
6335
+ FRAME_BLASTER_FIRE_LAST,
6336
+ FRAME_BLASTER_IDLE_LAST,
6337
+ FRAME_BLASTER_DEACTIVATE_LAST,
6338
+ BLASTER_PAUSE_FRAMES,
6339
+ BLASTER_FIRE_FRAMES,
6340
+ (ent) => fireBlaster(sys.game, ent),
6341
+ sys
6342
+ );
5465
6343
  }
5466
6344
 
5467
6345
  // src/inventory/items.ts
@@ -5474,7 +6352,8 @@ var WEAPON_ITEMS = {
5474
6352
  ammoType: null,
5475
6353
  initialAmmo: 0,
5476
6354
  pickupAmmo: 0,
5477
- fireRate: 0.5
6355
+ fireRate: 0.5,
6356
+ think: blasterThink
5478
6357
  },
5479
6358
  "weapon_shotgun": {
5480
6359
  type: "weapon",
@@ -5484,7 +6363,8 @@ var WEAPON_ITEMS = {
5484
6363
  ammoType: AmmoType.Shells,
5485
6364
  initialAmmo: 10,
5486
6365
  pickupAmmo: 10,
5487
- fireRate: 1
6366
+ fireRate: 1,
6367
+ think: shotgunThink
5488
6368
  },
5489
6369
  "weapon_supershotgun": {
5490
6370
  type: "weapon",
@@ -5494,7 +6374,8 @@ var WEAPON_ITEMS = {
5494
6374
  ammoType: AmmoType.Shells,
5495
6375
  initialAmmo: 10,
5496
6376
  pickupAmmo: 10,
5497
- fireRate: 1
6377
+ fireRate: 1,
6378
+ think: superShotgunThink
5498
6379
  },
5499
6380
  "weapon_machinegun": {
5500
6381
  type: "weapon",
@@ -5505,7 +6386,7 @@ var WEAPON_ITEMS = {
5505
6386
  initialAmmo: 50,
5506
6387
  pickupAmmo: 50,
5507
6388
  fireRate: 0.1,
5508
- think: chaingunThink
6389
+ think: machinegunThink
5509
6390
  },
5510
6391
  "weapon_chaingun": {
5511
6392
  type: "weapon",
@@ -5515,7 +6396,8 @@ var WEAPON_ITEMS = {
5515
6396
  ammoType: AmmoType.Bullets,
5516
6397
  initialAmmo: 50,
5517
6398
  pickupAmmo: 50,
5518
- fireRate: 0.1
6399
+ fireRate: 0.1,
6400
+ think: chaingunThink
5519
6401
  },
5520
6402
  "weapon_grenades": {
5521
6403
  type: "weapon",
@@ -5535,7 +6417,8 @@ var WEAPON_ITEMS = {
5535
6417
  ammoType: AmmoType.Grenades,
5536
6418
  initialAmmo: 10,
5537
6419
  pickupAmmo: 10,
5538
- fireRate: 1
6420
+ fireRate: 1,
6421
+ think: grenadeLauncherThink
5539
6422
  },
5540
6423
  "weapon_rocketlauncher": {
5541
6424
  type: "weapon",
@@ -5545,7 +6428,8 @@ var WEAPON_ITEMS = {
5545
6428
  ammoType: AmmoType.Rockets,
5546
6429
  initialAmmo: 5,
5547
6430
  pickupAmmo: 5,
5548
- fireRate: 1
6431
+ fireRate: 1,
6432
+ think: rocketLauncherThink
5549
6433
  },
5550
6434
  "weapon_hyperblaster": {
5551
6435
  type: "weapon",
@@ -5555,7 +6439,8 @@ var WEAPON_ITEMS = {
5555
6439
  ammoType: AmmoType.Cells,
5556
6440
  initialAmmo: 50,
5557
6441
  pickupAmmo: 50,
5558
- fireRate: 0.1
6442
+ fireRate: 0.1,
6443
+ think: hyperBlasterThink
5559
6444
  },
5560
6445
  "weapon_railgun": {
5561
6446
  type: "weapon",
@@ -5565,7 +6450,8 @@ var WEAPON_ITEMS = {
5565
6450
  ammoType: AmmoType.Slugs,
5566
6451
  initialAmmo: 10,
5567
6452
  pickupAmmo: 10,
5568
- fireRate: 1.5
6453
+ fireRate: 1.5,
6454
+ think: railgunThink
5569
6455
  },
5570
6456
  "weapon_bfg": {
5571
6457
  type: "weapon",
@@ -5575,7 +6461,8 @@ var WEAPON_ITEMS = {
5575
6461
  ammoType: AmmoType.Cells,
5576
6462
  initialAmmo: 50,
5577
6463
  pickupAmmo: 50,
5578
- fireRate: 1
6464
+ fireRate: 1,
6465
+ think: bfgThink2
5579
6466
  },
5580
6467
  // Rogue Weapons
5581
6468
  "weapon_boomer": {
@@ -5630,7 +6517,6 @@ var WEAPON_ITEMS = {
5630
6517
  fireRate: 0.8
5631
6518
  // Guessing fire rate, refine if needed
5632
6519
  }
5633
- // ... add others as we implement them
5634
6520
  };
5635
6521
  var HEALTH_ITEMS = {
5636
6522
  "item_health_small": {
@@ -5890,6 +6776,7 @@ function createKeyPickupEntity(game, keyItem) {
5890
6776
  }
5891
6777
 
5892
6778
  // src/entities/items/ammo.ts
6779
+ init_ammo();
5893
6780
  function createAmmoPickupEntity(game, itemId) {
5894
6781
  const def = getAmmoItemDefinition(itemId);
5895
6782
  const respawn = (self) => {
@@ -5944,6 +6831,7 @@ function createPowerArmorPickupEntity(game, item) {
5944
6831
  }
5945
6832
 
5946
6833
  // src/entities/items.ts
6834
+ init_ammo();
5947
6835
  function registerItemSpawns(game, registry) {
5948
6836
  for (const weaponItem of Object.values(WEAPON_ITEMS)) {
5949
6837
  registry.register(weaponItem.id, (entity) => {
@@ -5982,37 +6870,41 @@ function registerItemSpawns(game, registry) {
5982
6870
  }
5983
6871
  }
5984
6872
 
6873
+ // src/entities/funcs.ts
6874
+ init_esm();
6875
+
5985
6876
  // src/entities/gibs.ts
5986
- var random2 = createRandomGenerator();
6877
+ init_esm();
6878
+ var random3 = createRandomGenerator();
5987
6879
  var GIB_METALLIC = 1;
5988
6880
  var GIB_DEBRIS = 2;
5989
6881
  function spawnGib(sys, origin, damage, model, type) {
5990
6882
  const gib = sys.spawn();
5991
6883
  gib.classname = "gib";
5992
6884
  gib.origin = {
5993
- x: origin.x + (random2.frandom() - 0.5) * 20,
5994
- y: origin.y + (random2.frandom() - 0.5) * 20,
5995
- z: origin.z + (random2.frandom() - 0.5) * 20
6885
+ x: origin.x + (random3.frandom() - 0.5) * 20,
6886
+ y: origin.y + (random3.frandom() - 0.5) * 20,
6887
+ z: origin.z + (random3.frandom() - 0.5) * 20
5996
6888
  };
5997
6889
  gib.velocity = {
5998
- x: (random2.frandom() - 0.5) * 300,
5999
- y: (random2.frandom() - 0.5) * 300,
6000
- z: 200 + random2.frandom() * 100
6890
+ x: (random3.frandom() - 0.5) * 300,
6891
+ y: (random3.frandom() - 0.5) * 300,
6892
+ z: 200 + random3.frandom() * 100
6001
6893
  };
6002
6894
  gib.movetype = 9 /* Bounce */;
6003
6895
  gib.solid = 0 /* Not */;
6004
6896
  gib.clipmask = 1;
6005
6897
  gib.avelocity = {
6006
- x: random2.crandom() * 600,
6007
- y: random2.crandom() * 600,
6008
- z: random2.crandom() * 600
6898
+ x: random3.crandom() * 600,
6899
+ y: random3.crandom() * 600,
6900
+ z: random3.crandom() * 600
6009
6901
  };
6010
6902
  const defaultModels = [
6011
6903
  "models/objects/gibs/bone/tris.md2",
6012
6904
  "models/objects/gibs/meat/tris.md2",
6013
6905
  "models/objects/gibs/sm_meat/tris.md2"
6014
6906
  ];
6015
- const modelName = model || defaultModels[Math.floor(random2.frandom() * defaultModels.length)];
6907
+ const modelName = model || defaultModels[Math.floor(random3.frandom() * defaultModels.length)];
6016
6908
  gib.modelindex = sys.modelIndex(modelName);
6017
6909
  gib.mins = { x: -2, y: -2, z: -2 };
6018
6910
  gib.maxs = { x: 2, y: 2, z: 2 };
@@ -6021,14 +6913,14 @@ function spawnGib(sys, origin, damage, model, type) {
6021
6913
  gib.think = (self) => {
6022
6914
  sys.free(self);
6023
6915
  };
6024
- sys.scheduleThink(gib, sys.timeSeconds + 10 + random2.frandom() * 10);
6916
+ sys.scheduleThink(gib, sys.timeSeconds + 10 + random3.frandom() * 10);
6025
6917
  sys.finalizeSpawn(gib);
6026
6918
  return gib;
6027
6919
  }
6028
6920
  function throwGibs(sys, origin, damageOrDefs) {
6029
6921
  if (typeof damageOrDefs === "number") {
6030
6922
  const damage = damageOrDefs;
6031
- const count = 4 + Math.floor(random2.frandom() * 4);
6923
+ const count = 4 + Math.floor(random3.frandom() * 4);
6032
6924
  for (let i = 0; i < count; i++) {
6033
6925
  spawnGib(sys, origin, damage);
6034
6926
  }
@@ -6875,6 +7767,9 @@ function registerLightSpawns(registry) {
6875
7767
  });
6876
7768
  }
6877
7769
 
7770
+ // src/entities/monsters/berserk.ts
7771
+ init_esm();
7772
+
6878
7773
  // src/ai/monster.ts
6879
7774
  function M_MoveFrame(self, context) {
6880
7775
  const move = self.monsterinfo.current_move;
@@ -6918,15 +7813,15 @@ function monster_think(self, context) {
6918
7813
  var MONSTER_TICK = 0.1;
6919
7814
  var MELEE_DISTANCE = 80;
6920
7815
  var SPAWNFLAG_BERSERK_NOJUMPING = 16;
6921
- var random3 = createRandomGenerator();
7816
+ var random4 = createRandomGenerator();
6922
7817
  function frandom() {
6923
- return random3.frandom();
7818
+ return random4.frandom();
6924
7819
  }
6925
7820
  function brandom() {
6926
- return random3.frandom() > 0.5;
7821
+ return random4.frandom() > 0.5;
6927
7822
  }
6928
7823
  function irandom(min, max) {
6929
- return Math.floor(random3.frandom() * (max - min + 1) + min);
7824
+ return Math.floor(random4.frandom() * (max - min + 1) + min);
6930
7825
  }
6931
7826
  function monster_ai_stand(self, dist, context) {
6932
7827
  ai_stand(self, MONSTER_TICK, context);
@@ -7422,6 +8317,7 @@ function registerBerserkSpawns(registry) {
7422
8317
  }
7423
8318
 
7424
8319
  // src/entities/monsters/attack.ts
8320
+ init_esm();
7425
8321
  function crandom() {
7426
8322
  return 2 * Math.random() - 1;
7427
8323
  }
@@ -7612,6 +8508,7 @@ function monster_fire_dabeam(self, damage, secondary, update_func, context) {
7612
8508
  }
7613
8509
 
7614
8510
  // src/entities/monsters/boss2.ts
8511
+ init_esm();
7615
8512
  var MONSTER_TICK2 = 0.1;
7616
8513
  var BOSS2_ROCKET_OFFSET_1 = { x: 0, y: 30, z: -15 };
7617
8514
  var BOSS2_ROCKET_OFFSET_2 = { x: 0, y: 15, z: 0 };
@@ -7799,9 +8696,10 @@ function registerBoss2Spawns(registry) {
7799
8696
  }
7800
8697
 
7801
8698
  // src/entities/monsters/brain.ts
8699
+ init_esm();
7802
8700
  var MONSTER_TICK3 = 0.1;
7803
8701
  var MELEE_DISTANCE2 = 80;
7804
- var random4 = Math.random;
8702
+ var random5 = Math.random;
7805
8703
  function monster_ai_stand3(self, dist, context) {
7806
8704
  ai_stand(self, MONSTER_TICK3, context);
7807
8705
  }
@@ -7854,7 +8752,7 @@ function brain_swing_right(self, context) {
7854
8752
  }
7855
8753
  function brain_hit_right(self, context) {
7856
8754
  const aim = { x: MELEE_DISTANCE2, y: self.maxs.x, z: 8 };
7857
- if (monster_fire_hit(self, aim, 15 + Math.floor(random4() * 5), 40, context)) {
8755
+ if (monster_fire_hit(self, aim, 15 + Math.floor(random5() * 5), 40, context)) {
7858
8756
  context.engine.sound?.(self, 0, "brain/melee3.wav", 1, 1, 0);
7859
8757
  } else {
7860
8758
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7865,7 +8763,7 @@ function brain_swing_left(self, context) {
7865
8763
  }
7866
8764
  function brain_hit_left(self, context) {
7867
8765
  const aim = { x: MELEE_DISTANCE2, y: self.mins.x, z: 8 };
7868
- if (monster_fire_hit(self, aim, 15 + Math.floor(random4() * 5), 40, context)) {
8766
+ if (monster_fire_hit(self, aim, 15 + Math.floor(random5() * 5), 40, context)) {
7869
8767
  context.engine.sound?.(self, 0, "brain/melee3.wav", 1, 1, 0);
7870
8768
  } else {
7871
8769
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7878,7 +8776,7 @@ function brain_chest_open(self, context) {
7878
8776
  }
7879
8777
  function brain_tentacle_attack(self, context) {
7880
8778
  const aim = { x: MELEE_DISTANCE2, y: 0, z: 8 };
7881
- if (monster_fire_hit(self, aim, 10 + Math.floor(random4() * 5), -600, context)) {
8779
+ if (monster_fire_hit(self, aim, 10 + Math.floor(random5() * 5), -600, context)) {
7882
8780
  self.count = 1;
7883
8781
  } else {
7884
8782
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7893,7 +8791,7 @@ function brain_chest_closed(self) {
7893
8791
  }
7894
8792
  }
7895
8793
  function brain_melee(self) {
7896
- if (random4() <= 0.5) {
8794
+ if (random5() <= 0.5) {
7897
8795
  self.monsterinfo.current_move = attack1_move;
7898
8796
  } else {
7899
8797
  self.monsterinfo.current_move = attack2_move;
@@ -7976,7 +8874,7 @@ function brain_laserbeam(self, context) {
7976
8874
  monster_fire_dabeam(self, 1, true, brain_left_eye_laser_update, context);
7977
8875
  }
7978
8876
  function brain_laserbeam_reattack(self) {
7979
- if (random4() < 0.5) {
8877
+ if (random5() < 0.5) {
7980
8878
  if (self.enemy && self.enemy.health > 0) {
7981
8879
  self.frame = 0;
7982
8880
  }
@@ -7985,7 +8883,7 @@ function brain_laserbeam_reattack(self) {
7985
8883
  function brain_attack(self, context) {
7986
8884
  const r = rangeTo(self, self.enemy);
7987
8885
  if (r <= RANGE_NEAR) {
7988
- if (random4() < 0.5) {
8886
+ if (random5() < 0.5) {
7989
8887
  self.monsterinfo.current_move = attack3_move;
7990
8888
  } else {
7991
8889
  self.monsterinfo.current_move = attack4_move;
@@ -8005,7 +8903,7 @@ function brain_duck_up(self) {
8005
8903
  self.monsterinfo.aiflags &= ~16;
8006
8904
  }
8007
8905
  function brain_dodge(self, attacker, eta) {
8008
- if (random4() > 0.25) return;
8906
+ if (random5() > 0.25) return;
8009
8907
  if (!self.enemy) self.enemy = attacker;
8010
8908
  self.monsterinfo.pausetime = self.timestamp + eta + 0.5;
8011
8909
  self.monsterinfo.current_move = duck_move;
@@ -8261,7 +9159,7 @@ function brain_pain(self, other, kick, damage, context) {
8261
9159
  return;
8262
9160
  }
8263
9161
  self.pain_debounce_time = self.timestamp + 3;
8264
- const r = random4();
9162
+ const r = random5();
8265
9163
  if (r < 0.33) {
8266
9164
  context.engine.sound?.(self, 0, "brain/brnpain1.wav", 1, 1, 0);
8267
9165
  self.monsterinfo.current_move = pain1_move;
@@ -8285,7 +9183,7 @@ function brain_die(self, inflictor, attacker, damage, point, context) {
8285
9183
  context.engine.sound?.(self, 0, "brain/brndeth1.wav", 1, 1, 0);
8286
9184
  self.deadflag = 2 /* Dead */;
8287
9185
  self.takedamage = true;
8288
- if (random4() <= 0.5) {
9186
+ if (random5() <= 0.5) {
8289
9187
  self.monsterinfo.current_move = death1_move;
8290
9188
  } else {
8291
9189
  self.monsterinfo.current_move = death2_move;
@@ -8322,7 +9220,7 @@ function SP_monster_brain(self, context) {
8322
9220
  context.entities.sound?.(s, 2, "brain/brnsght1.wav", 1, 1, 0);
8323
9221
  };
8324
9222
  self.monsterinfo.search = (s) => {
8325
- if (random4() < 0.5) {
9223
+ if (random5() < 0.5) {
8326
9224
  context.entities.sound?.(s, 2, "brain/brnidle2.wav", 1, 1, 0);
8327
9225
  } else {
8328
9226
  context.entities.sound?.(s, 2, "brain/brnsrch1.wav", 1, 1, 0);
@@ -8340,9 +9238,10 @@ function registerBrainSpawns(registry) {
8340
9238
  }
8341
9239
 
8342
9240
  // src/entities/monsters/chick.ts
9241
+ init_esm();
8343
9242
  var MONSTER_TICK4 = 0.1;
8344
9243
  var MELEE_DISTANCE3 = 80;
8345
- var random5 = Math.random;
9244
+ var random6 = Math.random;
8346
9245
  function monster_ai_stand4(self, dist, context) {
8347
9246
  ai_stand(self, MONSTER_TICK4, context);
8348
9247
  }
@@ -8390,12 +9289,12 @@ function chick_run(self) {
8390
9289
  function chick_fidget(self) {
8391
9290
  if (self.monsterinfo.aiflags & 4) return;
8392
9291
  if (self.enemy) return;
8393
- if (random5() <= 0.3) {
9292
+ if (random6() <= 0.3) {
8394
9293
  self.monsterinfo.current_move = fidget_move;
8395
9294
  }
8396
9295
  }
8397
9296
  function ChickMoan(self, context) {
8398
- if (random5() < 0.5) {
9297
+ if (random6() < 0.5) {
8399
9298
  context.engine.sound?.(self, 2, "chick/chkidle1.wav", 1, 0, 0);
8400
9299
  } else {
8401
9300
  context.engine.sound?.(self, 2, "chick/chkidle2.wav", 1, 0, 0);
@@ -8404,7 +9303,7 @@ function ChickMoan(self, context) {
8404
9303
  function chick_slash(self, context) {
8405
9304
  const aim = { x: MELEE_DISTANCE3, y: self.mins.x, z: 10 };
8406
9305
  context.engine.sound?.(self, 0, "chick/chkatck3.wav", 1, 1, 0);
8407
- monster_fire_hit(self, aim, 10 + Math.floor(random5() * 6), 100, context);
9306
+ monster_fire_hit(self, aim, 10 + Math.floor(random6() * 6), 100, context);
8408
9307
  }
8409
9308
  function chick_rocket(self, context) {
8410
9309
  const { forward, right } = angleVectors(self.angles);
@@ -8425,7 +9324,7 @@ function chick_rocket(self, context) {
8425
9324
  }
8426
9325
  let dir = subtractVec3(target, finalStart);
8427
9326
  if (!blindfire && self.enemy) {
8428
- if (random5() < 0.33 || finalStart.z < self.enemy.absmin.z) {
9327
+ if (random6() < 0.33 || finalStart.z < self.enemy.absmin.z) {
8429
9328
  const tempDir = { ...dir, z: dir.z + self.enemy.viewheight };
8430
9329
  dir = tempDir;
8431
9330
  } else {
@@ -8460,7 +9359,7 @@ function chick_rerocket(self) {
8460
9359
  return;
8461
9360
  }
8462
9361
  if (self.enemy && self.enemy.health > 0) {
8463
- if (random5() <= 0.6) {
9362
+ if (random6() <= 0.6) {
8464
9363
  self.monsterinfo.current_move = attack1_move2;
8465
9364
  return;
8466
9365
  }
@@ -8469,7 +9368,7 @@ function chick_rerocket(self) {
8469
9368
  }
8470
9369
  function chick_reslash(self) {
8471
9370
  if (self.enemy && self.enemy.health > 0) {
8472
- if (random5() <= 0.9) {
9371
+ if (random6() <= 0.9) {
8473
9372
  self.monsterinfo.current_move = slash_move;
8474
9373
  return;
8475
9374
  }
@@ -8547,7 +9446,7 @@ function chick_pain(self, other, kick, damage, context) {
8547
9446
  }
8548
9447
  if (self.timestamp < (self.pain_debounce_time || 0)) return;
8549
9448
  self.pain_debounce_time = self.timestamp + 3;
8550
- const r = random5();
9449
+ const r = random6();
8551
9450
  if (r < 0.33) context.engine.sound?.(self, 0, "chick/chkpain1.wav", 1, 1, 0);
8552
9451
  else if (r < 0.66) context.engine.sound?.(self, 0, "chick/chkpain2.wav", 1, 1, 0);
8553
9452
  else context.engine.sound?.(self, 0, "chick/chkpain3.wav", 1, 1, 0);
@@ -8576,7 +9475,7 @@ function chick_die(self, inflictor, attacker, damage, point, context) {
8576
9475
  if (self.deadflag === 2 /* Dead */) return;
8577
9476
  self.deadflag = 2 /* Dead */;
8578
9477
  self.takedamage = true;
8579
- if (random5() <= 0.5) {
9478
+ if (random6() <= 0.5) {
8580
9479
  self.monsterinfo.current_move = death1_move2;
8581
9480
  context.engine.sound?.(self, 0, "chick/chkdeth1.wav", 1, 1, 0);
8582
9481
  } else {
@@ -8696,7 +9595,7 @@ function registerChickSpawns(registry) {
8696
9595
  var MONSTER_TICK5 = 0.1;
8697
9596
  var MELEE_DISTANCE4 = 80;
8698
9597
  var FLIPPER_RUN_SPEED = 24;
8699
- var random6 = Math.random;
9598
+ var random7 = Math.random;
8700
9599
  function monster_ai_stand5(self, dist, context) {
8701
9600
  ai_stand(self, MONSTER_TICK5, context);
8702
9601
  }
@@ -8813,7 +9712,7 @@ function flipper_pain(self, other, kick, damage, context) {
8813
9712
  return;
8814
9713
  }
8815
9714
  self.pain_debounce_time = self.timestamp + 3;
8816
- if (random6() < 0.5) {
9715
+ if (random7() < 0.5) {
8817
9716
  context.engine.sound?.(self, 0, "flipper/flppain1.wav", 1, 1, 0);
8818
9717
  self.monsterinfo.current_move = pain1_move3;
8819
9718
  } else {
@@ -8921,6 +9820,7 @@ function registerFlipperSpawns(registry) {
8921
9820
  }
8922
9821
 
8923
9822
  // src/entities/monsters/floater.ts
9823
+ init_esm();
8924
9824
  var MONSTER_TICK6 = 0.1;
8925
9825
  function monster_ai_stand6(self, dist, context) {
8926
9826
  ai_stand(self, MONSTER_TICK6, context);
@@ -9078,6 +9978,7 @@ function registerFloaterSpawns(registry) {
9078
9978
  }
9079
9979
 
9080
9980
  // src/entities/monsters/flyer.ts
9981
+ init_esm();
9081
9982
  var MONSTER_TICK7 = 0.1;
9082
9983
  function monster_ai_stand7(self, dist, context) {
9083
9984
  ai_stand(self, MONSTER_TICK7, context);
@@ -9256,6 +10157,7 @@ function registerFlyerSpawns(registry) {
9256
10157
  }
9257
10158
 
9258
10159
  // src/entities/monsters/gladiator.ts
10160
+ init_esm();
9259
10161
  var MONSTER_TICK8 = 0.1;
9260
10162
  function monster_ai_stand8(self, dist, context) {
9261
10163
  ai_stand(self, MONSTER_TICK8, context);
@@ -9455,6 +10357,7 @@ function registerGladiatorSpawns(registry) {
9455
10357
  }
9456
10358
 
9457
10359
  // src/entities/monsters/gunner.ts
10360
+ init_esm();
9458
10361
  var MONSTER_TICK9 = 0.1;
9459
10362
  function monster_ai_stand9(self, dist, context) {
9460
10363
  ai_stand(self, MONSTER_TICK9, context);
@@ -9877,6 +10780,7 @@ function registerGunnerSpawns(registry) {
9877
10780
  }
9878
10781
 
9879
10782
  // src/entities/monsters/hover.ts
10783
+ init_esm();
9880
10784
  var MONSTER_TICK10 = 0.1;
9881
10785
  function monster_ai_stand10(self, dist, context) {
9882
10786
  ai_stand(self, MONSTER_TICK10, context);
@@ -10034,6 +10938,7 @@ function registerHoverSpawns(registry) {
10034
10938
  }
10035
10939
 
10036
10940
  // src/entities/monsters/icarus.ts
10941
+ init_esm();
10037
10942
  var MONSTER_TICK11 = 0.1;
10038
10943
  function monster_ai_stand11(self, dist, context) {
10039
10944
  ai_stand(self, MONSTER_TICK11, context);
@@ -10191,6 +11096,7 @@ function registerIcarusSpawns(registry) {
10191
11096
  }
10192
11097
 
10193
11098
  // src/entities/monsters/infantry.ts
11099
+ init_esm();
10194
11100
  var MONSTER_TICK12 = 0.1;
10195
11101
  function monster_ai_stand12(self, dist, context) {
10196
11102
  ai_stand(self, MONSTER_TICK12, context);
@@ -10391,6 +11297,7 @@ function registerInfantrySpawns(registry) {
10391
11297
  }
10392
11298
 
10393
11299
  // src/entities/monsters/makron.ts
11300
+ init_esm();
10394
11301
  var MONSTER_TICK13 = 0.1;
10395
11302
  var MAKRON_BFG_OFFSET = { x: 30, y: 28, z: 24 };
10396
11303
  var MAKRON_BLASTER_OFFSET_1 = { x: 26, y: 16, z: 24 };
@@ -10636,6 +11543,7 @@ function registerMakronSpawns(registry) {
10636
11543
  }
10637
11544
 
10638
11545
  // src/entities/monsters/jorg.ts
11546
+ init_esm();
10639
11547
  var MONSTER_TICK14 = 0.1;
10640
11548
  var JORG_MACHINEGUN_R1_OFFSET = { x: 40, y: -20, z: 20 };
10641
11549
  var JORG_MACHINEGUN_L1_OFFSET = { x: 40, y: 20, z: 20 };
@@ -10859,7 +11767,7 @@ var SPAWNFLAG_INSANE_STAND_GROUND = 16;
10859
11767
  var SPAWNFLAG_INSANE_ALWAYS_STAND = 32;
10860
11768
  var SPAWNFLAG_INSANE_QUIET = 64;
10861
11769
  var FRAME_stand1 = 0;
10862
- var FRAME_stand40 = 39;
11770
+ var FRAME_stand402 = 39;
10863
11771
  var FRAME_stand41 = 40;
10864
11772
  var FRAME_stand59 = 58;
10865
11773
  var FRAME_stand60 = 59;
@@ -11121,7 +12029,7 @@ var frames_uptodown = [
11121
12029
  ];
11122
12030
  insane_move_uptodown = {
11123
12031
  firstframe: FRAME_stand1,
11124
- lastframe: FRAME_stand40,
12032
+ lastframe: FRAME_stand402,
11125
12033
  frames: frames_uptodown,
11126
12034
  endfunc: insane_onground
11127
12035
  };
@@ -11486,7 +12394,7 @@ function SP_misc_insane(self, context) {
11486
12394
  return;
11487
12395
  }
11488
12396
  const frame = self2.frame;
11489
- if (frame >= FRAME_crawl1 && frame <= FRAME_crawl9 || frame >= FRAME_stand100 && frame <= FRAME_stand160 || frame >= FRAME_stand1 && frame <= FRAME_stand40) {
12397
+ if (frame >= FRAME_crawl1 && frame <= FRAME_crawl9 || frame >= FRAME_stand100 && frame <= FRAME_stand160 || frame >= FRAME_stand1 && frame <= FRAME_stand402) {
11490
12398
  self2.monsterinfo.current_move = insane_move_crawl_pain;
11491
12399
  } else {
11492
12400
  self2.monsterinfo.current_move = insane_move_stand_pain;
@@ -11545,6 +12453,8 @@ function registerInsaneSpawns(registry) {
11545
12453
  }
11546
12454
 
11547
12455
  // src/entities/monsters/actor.ts
12456
+ init_esm();
12457
+ init_esm();
11548
12458
  var MONSTER_TICK16 = 0.1;
11549
12459
  var MZ2_ACTOR_MACHINEGUN_1 = 0;
11550
12460
  var actor_names = [
@@ -11563,19 +12473,19 @@ var FRAME_walk01 = 40;
11563
12473
  var FRAME_walk08 = 47;
11564
12474
  var FRAME_run02 = 48;
11565
12475
  var FRAME_run07 = 53;
11566
- var FRAME_pain101 = 54;
12476
+ var FRAME_pain1012 = 54;
11567
12477
  var FRAME_pain103 = 56;
11568
- var FRAME_pain201 = 57;
12478
+ var FRAME_pain2012 = 57;
11569
12479
  var FRAME_pain203 = 59;
11570
- var FRAME_pain301 = 60;
12480
+ var FRAME_pain3012 = 60;
11571
12481
  var FRAME_pain303 = 62;
11572
12482
  var FRAME_flip01 = 63;
11573
12483
  var FRAME_flip14 = 76;
11574
12484
  var FRAME_taunt01 = 77;
11575
12485
  var FRAME_taunt17 = 93;
11576
- var FRAME_death101 = 94;
12486
+ var FRAME_death1012 = 94;
11577
12487
  var FRAME_death107 = 100;
11578
- var FRAME_death201 = 101;
12488
+ var FRAME_death2012 = 101;
11579
12489
  var FRAME_death213 = 113;
11580
12490
  var FRAME_attak01 = 114;
11581
12491
  var FRAME_attak04 = 117;
@@ -11825,7 +12735,7 @@ var frames_pain1 = [
11825
12735
  m2(ai_move, 1)
11826
12736
  ];
11827
12737
  actor_move_pain1 = {
11828
- firstframe: FRAME_pain101,
12738
+ firstframe: FRAME_pain1012,
11829
12739
  lastframe: FRAME_pain103,
11830
12740
  frames: frames_pain1,
11831
12741
  endfunc: actor_run
@@ -11836,7 +12746,7 @@ var frames_pain2 = [
11836
12746
  m2(ai_move)
11837
12747
  ];
11838
12748
  actor_move_pain2 = {
11839
- firstframe: FRAME_pain201,
12749
+ firstframe: FRAME_pain2012,
11840
12750
  lastframe: FRAME_pain203,
11841
12751
  frames: frames_pain2,
11842
12752
  endfunc: actor_run
@@ -11847,7 +12757,7 @@ var frames_pain3 = [
11847
12757
  m2(ai_move, 0)
11848
12758
  ];
11849
12759
  actor_move_pain3 = {
11850
- firstframe: FRAME_pain301,
12760
+ firstframe: FRAME_pain3012,
11851
12761
  lastframe: FRAME_pain303,
11852
12762
  frames: frames_pain3,
11853
12763
  endfunc: actor_run
@@ -11909,7 +12819,7 @@ var frames_death1 = [
11909
12819
  m2(ai_move, 1)
11910
12820
  ];
11911
12821
  actor_move_death1 = {
11912
- firstframe: FRAME_death101,
12822
+ firstframe: FRAME_death1012,
11913
12823
  lastframe: FRAME_death107,
11914
12824
  frames: frames_death1,
11915
12825
  endfunc: actor_dead
@@ -11930,7 +12840,7 @@ var frames_death2 = [
11930
12840
  m2(ai_move)
11931
12841
  ];
11932
12842
  actor_move_death2 = {
11933
- firstframe: FRAME_death201,
12843
+ firstframe: FRAME_death2012,
11934
12844
  lastframe: FRAME_death213,
11935
12845
  frames: frames_death2,
11936
12846
  endfunc: actor_dead
@@ -12085,6 +12995,8 @@ function registerActorSpawns(registry) {
12085
12995
  }
12086
12996
 
12087
12997
  // src/entities/monsters/medic.ts
12998
+ init_esm();
12999
+ init_esm();
12088
13000
  var MONSTER_TICK17 = 0.1;
12089
13001
  function monster_ai_stand15(self, dist, context) {
12090
13002
  if (self.classname === "monster_medic") {
@@ -12461,8 +13373,9 @@ function registerMedicSpawns(registry) {
12461
13373
  }
12462
13374
 
12463
13375
  // src/entities/monsters/mutant.ts
13376
+ init_esm();
12464
13377
  var MONSTER_TICK18 = 0.1;
12465
- var random7 = () => Math.random();
13378
+ var random8 = () => Math.random();
12466
13379
  function monster_ai_stand16(self, dist, context) {
12467
13380
  ai_stand(self, MONSTER_TICK18, context);
12468
13381
  }
@@ -12575,11 +13488,11 @@ function mutant_check_attack(self, context) {
12575
13488
  if (self.enemy && self.enemy.health > 0) {
12576
13489
  const diff = subtractVec3(self.enemy.origin, self.origin);
12577
13490
  const dist = lengthVec3(diff);
12578
- if (dist < 128 && random7() < 0.5) {
13491
+ if (dist < 128 && random8() < 0.5) {
12579
13492
  self.monsterinfo.current_move = attack_move7;
12580
13493
  return true;
12581
13494
  }
12582
- if (dist >= 128 && dist < 512 && random7() < 0.3) {
13495
+ if (dist >= 128 && dist < 512 && random8() < 0.3) {
12583
13496
  self.monsterinfo.current_move = jump_move2;
12584
13497
  return true;
12585
13498
  }
@@ -12592,10 +13505,10 @@ function mutant_pain_func(self, other, kick, damage, context) {
12592
13505
  }
12593
13506
  if (self.timestamp < (self.pain_finished_time || 0)) return;
12594
13507
  self.pain_finished_time = self.timestamp + 3;
12595
- if (random7() < 0.5) {
13508
+ if (random8() < 0.5) {
12596
13509
  context.engine.sound?.(self, 0, "mutant/mutpain1.wav", 1, 1, 0);
12597
13510
  self.monsterinfo.current_move = pain1_move6;
12598
- } else if (random7() < 0.5) {
13511
+ } else if (random8() < 0.5) {
12599
13512
  context.engine.sound?.(self, 0, "mutant/mutpain2.wav", 1, 1, 0);
12600
13513
  self.monsterinfo.current_move = pain2_move6;
12601
13514
  } else {
@@ -12850,8 +13763,9 @@ function registerMutantSpawns(registry) {
12850
13763
  }
12851
13764
 
12852
13765
  // src/entities/monsters/parasite.ts
13766
+ init_esm();
12853
13767
  var MONSTER_TICK19 = 0.1;
12854
- var random8 = () => Math.random();
13768
+ var random9 = () => Math.random();
12855
13769
  function monster_ai_stand17(self, dist, context) {
12856
13770
  ai_stand(self, MONSTER_TICK19, context);
12857
13771
  }
@@ -12896,7 +13810,7 @@ function parasite_do_fidget(self) {
12896
13810
  self.monsterinfo.current_move = fidget_move3;
12897
13811
  }
12898
13812
  function parasite_refidget(self) {
12899
- if (random8() <= 0.8) {
13813
+ if (random9() <= 0.8) {
12900
13814
  self.monsterinfo.current_move = fidget_move3;
12901
13815
  } else {
12902
13816
  self.monsterinfo.current_move = end_fidget_move;
@@ -13009,7 +13923,7 @@ function parasite_pain_func(self, other, kick, damage, context) {
13009
13923
  }
13010
13924
  if (self.timestamp < (self.pain_finished_time || 0)) return;
13011
13925
  self.pain_finished_time = self.timestamp + 3;
13012
- if (random8() < 0.5) {
13926
+ if (random9() < 0.5) {
13013
13927
  context.engine.sound?.(self, 0, "parasite/parpain1.wav", 1, 1, 0);
13014
13928
  } else {
13015
13929
  context.engine.sound?.(self, 0, "parasite/parpain2.wav", 1, 1, 0);
@@ -13246,6 +14160,7 @@ function registerParasiteSpawns(registry) {
13246
14160
  }
13247
14161
 
13248
14162
  // src/entities/monsters/soldier.ts
14163
+ init_esm();
13249
14164
  var MONSTER_TICK20 = 0.1;
13250
14165
  var SOLDIER_LIGHT = 1;
13251
14166
  var SOLDIER_SSG = 2;
@@ -13584,6 +14499,7 @@ function registerMonsterSpawns(registry) {
13584
14499
  }
13585
14500
 
13586
14501
  // src/entities/monsters/supertank.ts
14502
+ init_esm();
13587
14503
  var MONSTER_TICK21 = 0.1;
13588
14504
  var SUPERTANK_MACHINEGUN_OFFSET = { x: 30, y: 30, z: 40 };
13589
14505
  var SUPERTANK_ROCKET_OFFSET = { x: 30, y: -30, z: 40 };
@@ -13808,6 +14724,7 @@ function registerSupertankSpawns(registry) {
13808
14724
  }
13809
14725
 
13810
14726
  // src/entities/monsters/tank.ts
14727
+ init_esm();
13811
14728
  var MONSTER_TICK22 = 0.1;
13812
14729
  function M_AdjustBlindfireTarget(self, start, target, right, context) {
13813
14730
  const tr = context.trace(start, target, ZERO_VEC3, ZERO_VEC3, self, MASK_SHOT);
@@ -14178,6 +15095,7 @@ function registerTankCommanderSpawns(registry) {
14178
15095
  }
14179
15096
 
14180
15097
  // src/entities/monsters/turret.ts
15098
+ init_esm();
14181
15099
  var MONSTER_TICK23 = 0.1;
14182
15100
  function monster_ai_stand21(self, dist, context) {
14183
15101
  ai_stand(self, MONSTER_TICK23, context);
@@ -14329,8 +15247,9 @@ function registerTurretSpawns(registry) {
14329
15247
  }
14330
15248
 
14331
15249
  // src/entities/monsters/gekk.ts
15250
+ init_esm();
14332
15251
  var MONSTER_TICK24 = 0.1;
14333
- var random9 = () => Math.random();
15252
+ var random10 = () => Math.random();
14334
15253
  var frandom2 = () => Math.random();
14335
15254
  var irandom2 = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
14336
15255
  function monster_ai_stand22(self, dist, context) {
@@ -14839,7 +15758,7 @@ function gekk_pain(self, other, kick, damage, context) {
14839
15758
  }
14840
15759
  self.monsterinfo.current_move = gekk_move_pain;
14841
15760
  } else {
14842
- if (random9() > 0.5) self.monsterinfo.current_move = gekk_move_pain1;
15761
+ if (random10() > 0.5) self.monsterinfo.current_move = gekk_move_pain1;
14843
15762
  else self.monsterinfo.current_move = gekk_move_pain2;
14844
15763
  }
14845
15764
  }
@@ -14971,8 +15890,9 @@ function registerGekkSpawns(registry) {
14971
15890
  }
14972
15891
 
14973
15892
  // src/entities/monsters/fixbot.ts
15893
+ init_esm();
14974
15894
  var MONSTER_TICK25 = 0.1;
14975
- var random10 = () => Math.random();
15895
+ var random11 = () => Math.random();
14976
15896
  var frandom3 = () => Math.random();
14977
15897
  function monster_ai_walk21(self, dist, context) {
14978
15898
  ai_walk(self, dist, MONSTER_TICK25, context);
@@ -15035,7 +15955,7 @@ function fixbot_search(self, context) {
15035
15955
  fixbot_run(self);
15036
15956
  fixbot_set_fly_parameters(self, true, false);
15037
15957
  } else {
15038
- if (random10() < 0.1) {
15958
+ if (random11() < 0.1) {
15039
15959
  context.engine.sound?.(self, 0, "flyer/flysght1.wav", 1, 1, 0);
15040
15960
  }
15041
15961
  }
@@ -15694,6 +16614,9 @@ var LevelClock = class {
15694
16614
  }
15695
16615
  };
15696
16616
 
16617
+ // src/save/save.ts
16618
+ init_esm();
16619
+
15697
16620
  // src/checksum.ts
15698
16621
  var FNV_OFFSET_BASIS = 2166136261;
15699
16622
  var FNV_PRIME = 16777619;
@@ -16156,6 +17079,7 @@ function applySaveFile(save, targets) {
16156
17079
  }
16157
17080
 
16158
17081
  // src/save/rerelease.ts
17082
+ init_esm();
16159
17083
  function ensureObject2(value, label) {
16160
17084
  if (!value || typeof value !== "object" || Array.isArray(value)) {
16161
17085
  throw new Error(`${label} must be an object`);
@@ -16568,6 +17492,9 @@ _SaveStorage.DEFAULT_STORE = "saves";
16568
17492
  _SaveStorage.QUICK_SLOT = "quicksave";
16569
17493
  var SaveStorage = _SaveStorage;
16570
17494
 
17495
+ // src/index.ts
17496
+ init_esm();
17497
+
16571
17498
  // src/ai/noise.ts
16572
17499
  var PNOISE_SELF = 0;
16573
17500
  var PNOISE_WEAPON = 1;
@@ -16593,8 +17520,13 @@ function PlayerNoise(who, where, type, context) {
16593
17520
  }
16594
17521
  }
16595
17522
 
17523
+ // src/entities/player.ts
17524
+ init_playerInventory();
17525
+
16596
17526
  // src/combat/obituary.ts
16597
- var random11 = createRandomGenerator();
17527
+ init_esm();
17528
+ init_esm();
17529
+ var random12 = createRandomGenerator();
16598
17530
  var PRINT_MEDIUM = 1;
16599
17531
  function getGender(ent) {
16600
17532
  return "male";
@@ -16735,30 +17667,6 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
16735
17667
  }
16736
17668
  }
16737
17669
 
16738
- // src/entities/player_anim.ts
16739
- var FRAME_stand01 = 0;
16740
- var FRAME_stand402 = 39;
16741
- var FRAME_run1 = 40;
16742
- var FRAME_run6 = 45;
16743
- var FRAME_pain1012 = 54;
16744
- var FRAME_pain104 = 57;
16745
- var FRAME_pain2012 = 58;
16746
- var FRAME_pain204 = 61;
16747
- var FRAME_pain3012 = 62;
16748
- var FRAME_pain304 = 65;
16749
- var FRAME_death1012 = 66;
16750
- var FRAME_death106 = 71;
16751
- var FRAME_death2012 = 72;
16752
- var FRAME_death206 = 77;
16753
- var FRAME_death301 = 78;
16754
- var FRAME_death306 = 83;
16755
- var ANIM_BASIC = 0;
16756
- var ANIM_PAIN = 2;
16757
- var ANIM_DEATH = 3;
16758
-
16759
- // src/combat/weapons/firing.ts
16760
- var random12 = createRandomGenerator();
16761
-
16762
17670
  // src/entities/player.ts
16763
17671
  function P_PlayerThink(ent, sys) {
16764
17672
  if (!ent.client) return;
@@ -16777,9 +17685,9 @@ function P_PlayerThink(ent, sys) {
16777
17685
  animChanged = true;
16778
17686
  }
16779
17687
  } else {
16780
- if (ent.frame >= FRAME_run1 && ent.frame <= FRAME_run6 || client.anim_priority === ANIM_BASIC && client.anim_end !== FRAME_stand402 || client.anim_priority === void 0) {
17688
+ if (ent.frame >= FRAME_run1 && ent.frame <= FRAME_run6 || client.anim_priority === ANIM_BASIC && client.anim_end !== FRAME_stand40 || client.anim_priority === void 0) {
16781
17689
  ent.frame = FRAME_stand01;
16782
- client.anim_end = FRAME_stand402;
17690
+ client.anim_end = FRAME_stand40;
16783
17691
  client.anim_priority = ANIM_BASIC;
16784
17692
  animChanged = true;
16785
17693
  }
@@ -16798,7 +17706,7 @@ function P_PlayerThink(ent, sys) {
16798
17706
  } else if (client.anim_end === ent.frame) {
16799
17707
  if (client.anim_priority === ANIM_BASIC) {
16800
17708
  if (ent.frame === FRAME_run6) ent.frame = FRAME_run1;
16801
- else if (ent.frame === FRAME_stand402) ent.frame = FRAME_stand01;
17709
+ else if (ent.frame === FRAME_stand40) ent.frame = FRAME_stand01;
16802
17710
  } else {
16803
17711
  if (client.anim_priority !== ANIM_DEATH) {
16804
17712
  client.anim_priority = ANIM_BASIC;
@@ -16814,15 +17722,15 @@ function player_pain(self, damage) {
16814
17722
  return;
16815
17723
  }
16816
17724
  self.client.anim_priority = ANIM_PAIN;
16817
- const r = random12.frandom();
17725
+ const r = random2.frandom();
16818
17726
  if (r < 0.33) {
16819
- self.frame = FRAME_pain1012;
17727
+ self.frame = FRAME_pain101;
16820
17728
  self.client.anim_end = FRAME_pain104;
16821
17729
  } else if (r < 0.66) {
16822
- self.frame = FRAME_pain2012;
17730
+ self.frame = FRAME_pain201;
16823
17731
  self.client.anim_end = FRAME_pain204;
16824
17732
  } else {
16825
- self.frame = FRAME_pain3012;
17733
+ self.frame = FRAME_pain301;
16826
17734
  self.client.anim_end = FRAME_pain304;
16827
17735
  }
16828
17736
  }
@@ -16837,12 +17745,12 @@ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
16837
17745
  }
16838
17746
  if (self.client) {
16839
17747
  self.client.anim_priority = ANIM_DEATH;
16840
- const r = random12.frandom();
17748
+ const r = random2.frandom();
16841
17749
  if (r < 0.33) {
16842
- self.frame = FRAME_death1012;
17750
+ self.frame = FRAME_death101;
16843
17751
  self.client.anim_end = FRAME_death106;
16844
17752
  } else if (r < 0.66) {
16845
- self.frame = FRAME_death2012;
17753
+ self.frame = FRAME_death201;
16846
17754
  self.client.anim_end = FRAME_death206;
16847
17755
  } else {
16848
17756
  self.frame = FRAME_death301;
@@ -16890,6 +17798,8 @@ function player_think(self, sys) {
16890
17798
  }
16891
17799
 
16892
17800
  // src/entities/playerStats.ts
17801
+ init_esm();
17802
+ init_playerInventory();
16893
17803
  var POWERUP_TIMERS = [
16894
17804
  { id: PowerupId.QuadDamage, priority: 1 },
16895
17805
  { id: PowerupId.Invulnerability, priority: 2 },
@@ -16955,7 +17865,11 @@ function populatePlayerStats(player, timeSeconds) {
16955
17865
  return statArray;
16956
17866
  }
16957
17867
 
17868
+ // src/index.ts
17869
+ init_esm();
17870
+
16958
17871
  // src/combat/specialDamage.ts
17872
+ init_esm();
16959
17873
  var ZERO2 = { x: 0, y: 0, z: 0 };
16960
17874
  var EnvironmentalFlags = /* @__PURE__ */ ((EnvironmentalFlags2) => {
16961
17875
  EnvironmentalFlags2[EnvironmentalFlags2["IN_WATER"] = 1] = "IN_WATER";
@@ -17276,6 +18190,13 @@ function createGame(imports, engine, options) {
17276
18190
  configstring
17277
18191
  };
17278
18192
  const entities = new EntitySystem(engine, systemImports, gravity, void 0, void 0, deathmatch);
18193
+ entities._game = {
18194
+ // Lazy proxy or partial implementation of GameExports needed by EntitySystem consumers (like weapons)
18195
+ // This is circular, so we must be careful.
18196
+ // We will assign the full gameExports object later?
18197
+ // No, gameExports is const defined below.
18198
+ // We can use a getter or assign properties later.
18199
+ };
17279
18200
  frameLoop.addStage("prep", (context) => {
17280
18201
  levelClock.tick(context);
17281
18202
  entities.beginFrame(levelClock.current.timeSeconds);
@@ -17562,6 +18483,7 @@ function createGame(imports, engine, options) {
17562
18483
  };
17563
18484
  const spawnRegistry = createDefaultSpawnRegistry(gameExports);
17564
18485
  entities.setSpawnRegistry(spawnRegistry);
18486
+ entities._game = gameExports;
17565
18487
  return gameExports;
17566
18488
  }
17567
18489
  export {