quake2ts 0.0.276 → 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 (66) 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 +2237 -1199
  15. package/packages/game/dist/cjs/index.cjs.map +1 -1
  16. package/packages/game/dist/esm/index.js +2093 -1048
  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/funcs.d.ts.map +1 -1
  47. package/packages/game/dist/types/entities/gibs.d.ts +10 -2
  48. package/packages/game/dist/types/entities/gibs.d.ts.map +1 -1
  49. package/packages/game/dist/types/entities/misc.d.ts.map +1 -1
  50. package/packages/game/dist/types/entities/system.d.ts +2 -1
  51. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  52. package/packages/game/dist/types/entities/targets.d.ts.map +1 -1
  53. package/packages/game/dist/types/index.d.ts.map +1 -1
  54. package/packages/game/dist/types/inventory/items.d.ts.map +1 -1
  55. package/packages/shared/dist/browser/index.global.js +1 -1
  56. package/packages/shared/dist/browser/index.global.js.map +1 -1
  57. package/packages/shared/dist/cjs/index.cjs +26 -0
  58. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  59. package/packages/shared/dist/esm/index.js +25 -0
  60. package/packages/shared/dist/esm/index.js.map +1 -1
  61. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  62. package/packages/shared/dist/types/protocol/index.d.ts +1 -0
  63. package/packages/shared/dist/types/protocol/index.d.ts.map +1 -1
  64. package/packages/shared/dist/types/protocol/renderFx.d.ts +22 -0
  65. package/packages/shared/dist/types/protocol/renderFx.d.ts.map +1 -0
  66. 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";
@@ -3907,6 +4119,7 @@ function T_RadiusDamage(entities, inflictor, attacker, damage, ignore, radius, d
3907
4119
  }
3908
4120
 
3909
4121
  // src/entities/misc.ts
4122
+ var random = createRandomGenerator();
3910
4123
  var SPAWNFLAGS_OBJECT_TRIGGER_SPAWN = 1;
3911
4124
  var SPAWNFLAGS_OBJECT_ANIMATED = 2;
3912
4125
  function func_object_touch(self, other, plane, surf) {
@@ -3958,6 +4171,24 @@ var func_object = (entity, context) => {
3958
4171
  if (entity.spawnflags & SPAWNFLAGS_OBJECT_ANIMATED) {
3959
4172
  }
3960
4173
  };
4174
+ function gib_die(self, inflictor, attacker, damage) {
4175
+ }
4176
+ function spawn_gib(entity, model, context) {
4177
+ context.entities.modelIndex(model);
4178
+ entity.solid = 0 /* Not */;
4179
+ entity.takedamage = true;
4180
+ entity.die = gib_die;
4181
+ entity.movetype = 7 /* Toss */;
4182
+ entity.deadflag = 2;
4183
+ entity.avelocity = {
4184
+ x: random.frandom() * 200,
4185
+ y: random.frandom() * 200,
4186
+ z: random.frandom() * 200
4187
+ };
4188
+ entity.think = (self) => context.entities.free(self);
4189
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + 10);
4190
+ context.entities.linkentity(entity);
4191
+ }
3961
4192
  function registerMiscSpawns(registry) {
3962
4193
  registry.register("misc_teleporter", (entity) => {
3963
4194
  });
@@ -3975,14 +4206,23 @@ function registerMiscSpawns(registry) {
3975
4206
  entity.movetype = 0 /* None */;
3976
4207
  entity.solid = 3 /* Bsp */;
3977
4208
  });
3978
- registry.register("misc_gib_arm", (entity) => {
3979
- entity.movetype = 7 /* Toss */;
3980
- entity.solid = 0 /* Not */;
4209
+ registry.register("misc_gib_arm", (entity, context) => {
4210
+ spawn_gib(entity, "models/objects/gibs/arm/tris.md2", context);
4211
+ });
4212
+ registry.register("misc_gib_leg", (entity, context) => {
4213
+ spawn_gib(entity, "models/objects/gibs/leg/tris.md2", context);
4214
+ });
4215
+ registry.register("misc_gib_head", (entity, context) => {
4216
+ spawn_gib(entity, "models/objects/gibs/head/tris.md2", context);
3981
4217
  });
3982
4218
  registry.register("func_object", func_object);
3983
4219
  }
3984
4220
 
4221
+ // src/entities/targets.ts
4222
+ init_esm();
4223
+
3985
4224
  // src/entities/utils.ts
4225
+ init_esm();
3986
4226
  var VEC_UP = { x: 0, y: -1, z: 0 };
3987
4227
  var MOVEDIR_UP = { x: 0, y: 0, z: 1 };
3988
4228
  var VEC_DOWN = { x: 0, y: -2, z: 0 };
@@ -4004,6 +4244,7 @@ function setMovedir(angles) {
4004
4244
  }
4005
4245
 
4006
4246
  // src/entities/projectiles.ts
4247
+ init_esm();
4007
4248
  function createRocket(sys, owner, start, dir, damage, radiusDamage, speed, flashtype = 0) {
4008
4249
  const rocket = sys.spawn();
4009
4250
  rocket.classname = "rocket";
@@ -4459,6 +4700,7 @@ function useTargetSpawner(self, other, activator, context, registry) {
4459
4700
  warn: context.warn,
4460
4701
  free: context.free
4461
4702
  };
4703
+ ent.monsterinfo.aiflags |= 1024 /* DoNotCount */;
4462
4704
  spawnFunc(ent, spawnContext);
4463
4705
  context.entities.finalizeSpawn(ent);
4464
4706
  context.entities.linkentity(ent);
@@ -4466,6 +4708,7 @@ function useTargetSpawner(self, other, activator, context, registry) {
4466
4708
  if (self.speed) {
4467
4709
  ent.velocity = { ...self.movedir };
4468
4710
  }
4711
+ ent.renderfx |= RenderFx.IrVisible;
4469
4712
  }
4470
4713
  var SPAWNFLAG_BLASTER_NOTRAIL = 1;
4471
4714
  var SPAWNFLAG_BLASTER_NOEFFECTS = 2;
@@ -4851,6 +5094,7 @@ function registerTargetSpawns(registry) {
4851
5094
  }
4852
5095
 
4853
5096
  // src/entities/triggers.ts
5097
+ init_esm();
4854
5098
  var FRAME_TIME_SECONDS = 1 / 40;
4855
5099
  var THINK_INTERVAL = 0.1;
4856
5100
  var HURT_INTERVAL = 0.1;
@@ -5353,91 +5597,749 @@ function triggerElevatorInit(self, entities, warn) {
5353
5597
  warn(`trigger_elevator target ${self.target} is not a train`);
5354
5598
  return;
5355
5599
  }
5356
- self.use = (entity, other, activator) => triggerElevatorUse(entity, other ?? activator ?? null, entities, warn);
5357
- self.svflags |= 1 /* NoClient */;
5358
- }
5359
- function registerTriggerElevator(registry) {
5360
- registry.register("trigger_elevator", (entity, context) => {
5361
- entity.think = (self) => triggerElevatorInit(self, context.entities, context.warn);
5362
- context.entities.scheduleThink(entity, context.entities.timeSeconds + FRAME_TIME_SECONDS);
5363
- });
5600
+ self.use = (entity, other, activator) => triggerElevatorUse(entity, other ?? activator ?? null, entities, warn);
5601
+ self.svflags |= 1 /* NoClient */;
5602
+ }
5603
+ function registerTriggerElevator(registry) {
5604
+ registry.register("trigger_elevator", (entity, context) => {
5605
+ entity.think = (self) => triggerElevatorInit(self, context.entities, context.warn);
5606
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + FRAME_TIME_SECONDS);
5607
+ });
5608
+ }
5609
+ function registerTriggerMonsterJump(registry) {
5610
+ registry.register("trigger_monsterjump", (entity, context) => {
5611
+ const heightText = context.keyValues.height;
5612
+ const height = heightText ? Number.parseFloat(heightText) || 0 : 200;
5613
+ if (entity.angles.y === 0) {
5614
+ entity.angles = { ...entity.angles, y: 360 };
5615
+ }
5616
+ if (!entity.speed) {
5617
+ entity.speed = 200;
5618
+ }
5619
+ initTrigger(entity);
5620
+ entity.movedir = { ...entity.movedir, z: height };
5621
+ const touchHandler = (self, other) => monsterJumpTouch(self, other);
5622
+ entity.touch = touchHandler;
5623
+ if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.StartOff) {
5624
+ entity.solid = 0 /* Not */;
5625
+ entity.touch = void 0;
5626
+ }
5627
+ if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.Toggle) {
5628
+ entity.use = (self) => {
5629
+ toggleSolid(self);
5630
+ self.touch = self.solid === 1 /* Trigger */ ? touchHandler : void 0;
5631
+ };
5632
+ }
5633
+ });
5634
+ }
5635
+ function registerTriggerSpawns(registry) {
5636
+ registerTriggerMultiple(registry);
5637
+ registerTriggerOnce(registry);
5638
+ registerTriggerRelay(registry);
5639
+ registerTriggerAlways(registry);
5640
+ registerTriggerCounter(registry);
5641
+ registerTriggerKey(registry);
5642
+ registerTriggerPush(registry);
5643
+ registerTriggerHurt(registry);
5644
+ registerTriggerTeleport(registry);
5645
+ registerTriggerGravity(registry);
5646
+ registerTriggerElevator(registry);
5647
+ registerTriggerMonsterJump(registry);
5648
+ }
5649
+
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;
5685
+ }
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) {
6053
+ }
6054
+ }
6055
+
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
+ }
5364
6142
  }
5365
- function registerTriggerMonsterJump(registry) {
5366
- registry.register("trigger_monsterjump", (entity, context) => {
5367
- const heightText = context.keyValues.height;
5368
- const height = heightText ? Number.parseFloat(heightText) || 0 : 200;
5369
- if (entity.angles.y === 0) {
5370
- entity.angles = { ...entity.angles, y: 360 };
5371
- }
5372
- if (!entity.speed) {
5373
- entity.speed = 200;
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++;
5374
6151
  }
5375
- initTrigger(entity);
5376
- entity.movedir = { ...entity.movedir, z: height };
5377
- const touchHandler = (self, other) => monsterJumpTouch(self, other);
5378
- entity.touch = touchHandler;
5379
- if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.StartOff) {
5380
- entity.solid = 0 /* Not */;
5381
- entity.touch = void 0;
6152
+ if (fire) {
6153
+ fire(ent);
5382
6154
  }
5383
- if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.Toggle) {
5384
- entity.use = (self) => {
5385
- toggleSolid(self);
5386
- self.touch = self.solid === 1 /* Trigger */ ? touchHandler : void 0;
5387
- };
6155
+ if (!(client.buttons & 1)) {
6156
+ client.gun_frame = FRAME_IDLE_LAST + 1;
6157
+ client.weaponstate = 0 /* WEAPON_READY */;
5388
6158
  }
5389
- });
5390
- }
5391
- function registerTriggerSpawns(registry) {
5392
- registerTriggerMultiple(registry);
5393
- registerTriggerOnce(registry);
5394
- registerTriggerRelay(registry);
5395
- registerTriggerAlways(registry);
5396
- registerTriggerCounter(registry);
5397
- registerTriggerKey(registry);
5398
- registerTriggerPush(registry);
5399
- registerTriggerHurt(registry);
5400
- registerTriggerTeleport(registry);
5401
- registerTriggerGravity(registry);
5402
- registerTriggerElevator(registry);
5403
- registerTriggerMonsterJump(registry);
5404
- }
5405
-
5406
- // src/combat/weapons/state.ts
5407
- var WeaponStateEnum = /* @__PURE__ */ ((WeaponStateEnum2) => {
5408
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_READY"] = 0] = "WEAPON_READY";
5409
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_ACTIVATING"] = 1] = "WEAPON_ACTIVATING";
5410
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_DROPPING"] = 2] = "WEAPON_DROPPING";
5411
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_FIRING"] = 3] = "WEAPON_FIRING";
5412
- return WeaponStateEnum2;
5413
- })(WeaponStateEnum || {});
5414
- function createPlayerWeaponStates() {
5415
- return {
5416
- states: /* @__PURE__ */ new Map()
5417
- };
5418
- }
5419
- function getWeaponState(playerStates, weaponId) {
5420
- let state = playerStates.states.get(weaponId);
5421
- if (!state) {
5422
- state = { lastFireTime: 0 };
5423
- playerStates.states.set(weaponId, state);
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
+ );
5424
6171
  }
5425
- return state;
5426
6172
  }
5427
6173
 
5428
- // src/buttons.ts
5429
- var BUTTON_ATTACK = 1;
5430
-
5431
6174
  // src/combat/weapons/chaingun.ts
5432
6175
  function chaingunThink(player, sys) {
5433
- if (!player.client) {
5434
- return;
5435
- }
5436
6176
  const weaponState = getWeaponState(player.client.weaponStates, WeaponId.Chaingun);
5437
6177
  if (!(player.client.buttons & BUTTON_ATTACK) && weaponState.spinupCount && weaponState.spinupCount > 0) {
5438
6178
  sys.sound(player, 0, "weapons/chngnd1a.wav", 1, 0, 0);
5439
6179
  weaponState.spinupCount = 0;
5440
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
+ );
5441
6343
  }
5442
6344
 
5443
6345
  // src/inventory/items.ts
@@ -5450,7 +6352,8 @@ var WEAPON_ITEMS = {
5450
6352
  ammoType: null,
5451
6353
  initialAmmo: 0,
5452
6354
  pickupAmmo: 0,
5453
- fireRate: 0.5
6355
+ fireRate: 0.5,
6356
+ think: blasterThink
5454
6357
  },
5455
6358
  "weapon_shotgun": {
5456
6359
  type: "weapon",
@@ -5460,7 +6363,8 @@ var WEAPON_ITEMS = {
5460
6363
  ammoType: AmmoType.Shells,
5461
6364
  initialAmmo: 10,
5462
6365
  pickupAmmo: 10,
5463
- fireRate: 1
6366
+ fireRate: 1,
6367
+ think: shotgunThink
5464
6368
  },
5465
6369
  "weapon_supershotgun": {
5466
6370
  type: "weapon",
@@ -5470,7 +6374,8 @@ var WEAPON_ITEMS = {
5470
6374
  ammoType: AmmoType.Shells,
5471
6375
  initialAmmo: 10,
5472
6376
  pickupAmmo: 10,
5473
- fireRate: 1
6377
+ fireRate: 1,
6378
+ think: superShotgunThink
5474
6379
  },
5475
6380
  "weapon_machinegun": {
5476
6381
  type: "weapon",
@@ -5481,7 +6386,7 @@ var WEAPON_ITEMS = {
5481
6386
  initialAmmo: 50,
5482
6387
  pickupAmmo: 50,
5483
6388
  fireRate: 0.1,
5484
- think: chaingunThink
6389
+ think: machinegunThink
5485
6390
  },
5486
6391
  "weapon_chaingun": {
5487
6392
  type: "weapon",
@@ -5491,7 +6396,8 @@ var WEAPON_ITEMS = {
5491
6396
  ammoType: AmmoType.Bullets,
5492
6397
  initialAmmo: 50,
5493
6398
  pickupAmmo: 50,
5494
- fireRate: 0.1
6399
+ fireRate: 0.1,
6400
+ think: chaingunThink
5495
6401
  },
5496
6402
  "weapon_grenades": {
5497
6403
  type: "weapon",
@@ -5511,7 +6417,8 @@ var WEAPON_ITEMS = {
5511
6417
  ammoType: AmmoType.Grenades,
5512
6418
  initialAmmo: 10,
5513
6419
  pickupAmmo: 10,
5514
- fireRate: 1
6420
+ fireRate: 1,
6421
+ think: grenadeLauncherThink
5515
6422
  },
5516
6423
  "weapon_rocketlauncher": {
5517
6424
  type: "weapon",
@@ -5521,7 +6428,8 @@ var WEAPON_ITEMS = {
5521
6428
  ammoType: AmmoType.Rockets,
5522
6429
  initialAmmo: 5,
5523
6430
  pickupAmmo: 5,
5524
- fireRate: 1
6431
+ fireRate: 1,
6432
+ think: rocketLauncherThink
5525
6433
  },
5526
6434
  "weapon_hyperblaster": {
5527
6435
  type: "weapon",
@@ -5531,7 +6439,8 @@ var WEAPON_ITEMS = {
5531
6439
  ammoType: AmmoType.Cells,
5532
6440
  initialAmmo: 50,
5533
6441
  pickupAmmo: 50,
5534
- fireRate: 0.1
6442
+ fireRate: 0.1,
6443
+ think: hyperBlasterThink
5535
6444
  },
5536
6445
  "weapon_railgun": {
5537
6446
  type: "weapon",
@@ -5541,7 +6450,8 @@ var WEAPON_ITEMS = {
5541
6450
  ammoType: AmmoType.Slugs,
5542
6451
  initialAmmo: 10,
5543
6452
  pickupAmmo: 10,
5544
- fireRate: 1.5
6453
+ fireRate: 1.5,
6454
+ think: railgunThink
5545
6455
  },
5546
6456
  "weapon_bfg": {
5547
6457
  type: "weapon",
@@ -5551,7 +6461,8 @@ var WEAPON_ITEMS = {
5551
6461
  ammoType: AmmoType.Cells,
5552
6462
  initialAmmo: 50,
5553
6463
  pickupAmmo: 50,
5554
- fireRate: 1
6464
+ fireRate: 1,
6465
+ think: bfgThink2
5555
6466
  },
5556
6467
  // Rogue Weapons
5557
6468
  "weapon_boomer": {
@@ -5606,7 +6517,6 @@ var WEAPON_ITEMS = {
5606
6517
  fireRate: 0.8
5607
6518
  // Guessing fire rate, refine if needed
5608
6519
  }
5609
- // ... add others as we implement them
5610
6520
  };
5611
6521
  var HEALTH_ITEMS = {
5612
6522
  "item_health_small": {
@@ -5866,6 +6776,7 @@ function createKeyPickupEntity(game, keyItem) {
5866
6776
  }
5867
6777
 
5868
6778
  // src/entities/items/ammo.ts
6779
+ init_ammo();
5869
6780
  function createAmmoPickupEntity(game, itemId) {
5870
6781
  const def = getAmmoItemDefinition(itemId);
5871
6782
  const respawn = (self) => {
@@ -5920,6 +6831,7 @@ function createPowerArmorPickupEntity(game, item) {
5920
6831
  }
5921
6832
 
5922
6833
  // src/entities/items.ts
6834
+ init_ammo();
5923
6835
  function registerItemSpawns(game, registry) {
5924
6836
  for (const weaponItem of Object.values(WEAPON_ITEMS)) {
5925
6837
  registry.register(weaponItem.id, (entity) => {
@@ -5958,6 +6870,70 @@ function registerItemSpawns(game, registry) {
5958
6870
  }
5959
6871
  }
5960
6872
 
6873
+ // src/entities/funcs.ts
6874
+ init_esm();
6875
+
6876
+ // src/entities/gibs.ts
6877
+ init_esm();
6878
+ var random3 = createRandomGenerator();
6879
+ var GIB_METALLIC = 1;
6880
+ var GIB_DEBRIS = 2;
6881
+ function spawnGib(sys, origin, damage, model, type) {
6882
+ const gib = sys.spawn();
6883
+ gib.classname = "gib";
6884
+ gib.origin = {
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
6888
+ };
6889
+ gib.velocity = {
6890
+ x: (random3.frandom() - 0.5) * 300,
6891
+ y: (random3.frandom() - 0.5) * 300,
6892
+ z: 200 + random3.frandom() * 100
6893
+ };
6894
+ gib.movetype = 9 /* Bounce */;
6895
+ gib.solid = 0 /* Not */;
6896
+ gib.clipmask = 1;
6897
+ gib.avelocity = {
6898
+ x: random3.crandom() * 600,
6899
+ y: random3.crandom() * 600,
6900
+ z: random3.crandom() * 600
6901
+ };
6902
+ const defaultModels = [
6903
+ "models/objects/gibs/bone/tris.md2",
6904
+ "models/objects/gibs/meat/tris.md2",
6905
+ "models/objects/gibs/sm_meat/tris.md2"
6906
+ ];
6907
+ const modelName = model || defaultModels[Math.floor(random3.frandom() * defaultModels.length)];
6908
+ gib.modelindex = sys.modelIndex(modelName);
6909
+ gib.mins = { x: -2, y: -2, z: -2 };
6910
+ gib.maxs = { x: 2, y: 2, z: 2 };
6911
+ if (type && type & GIB_METALLIC) {
6912
+ }
6913
+ gib.think = (self) => {
6914
+ sys.free(self);
6915
+ };
6916
+ sys.scheduleThink(gib, sys.timeSeconds + 10 + random3.frandom() * 10);
6917
+ sys.finalizeSpawn(gib);
6918
+ return gib;
6919
+ }
6920
+ function throwGibs(sys, origin, damageOrDefs) {
6921
+ if (typeof damageOrDefs === "number") {
6922
+ const damage = damageOrDefs;
6923
+ const count = 4 + Math.floor(random3.frandom() * 4);
6924
+ for (let i = 0; i < count; i++) {
6925
+ spawnGib(sys, origin, damage);
6926
+ }
6927
+ } else {
6928
+ const defs = damageOrDefs;
6929
+ for (const def of defs) {
6930
+ for (let i = 0; i < def.count; i++) {
6931
+ spawnGib(sys, origin, 0, def.model, def.flags);
6932
+ }
6933
+ }
6934
+ }
6935
+ }
6936
+
5961
6937
  // src/entities/funcs.ts
5962
6938
  function move_calc(ent, dest, context, done) {
5963
6939
  const dt = 0.1;
@@ -6602,15 +7578,99 @@ var func_water = (entity, context) => {
6602
7578
  entity.solid = 3 /* Bsp */;
6603
7579
  entity.movetype = 2 /* Push */;
6604
7580
  };
7581
+ var SPAWNFLAGS_EXPLOSIVE_TRIGGER_SPAWN = 1;
7582
+ var SPAWNFLAGS_EXPLOSIVE_ANIMATED = 2;
7583
+ var SPAWNFLAGS_EXPLOSIVE_ANIMATED_FAST = 4;
7584
+ var SPAWNFLAGS_EXPLOSIVE_INACTIVE = 8;
7585
+ var SPAWNFLAGS_EXPLOSIVE_ALWAYS_SHOOTABLE = 16;
6605
7586
  var func_explosive = (entity, context) => {
6606
- entity.solid = 3 /* Bsp */;
7587
+ const sys = context.entities;
6607
7588
  entity.movetype = 2 /* Push */;
6608
- if (!entity.health) entity.health = 100;
6609
- if (!entity.dmg) entity.dmg = 120;
6610
- entity.takedamage = true;
6611
- entity.die = (self, inflictor, attacker, damage) => {
6612
- context.entities.free(self);
7589
+ const func_explosive_spawn = (self, other, activator) => {
7590
+ self.solid = 3 /* Bsp */;
7591
+ self.svflags &= ~1 /* NoClient */;
7592
+ self.use = void 0;
7593
+ sys.linkentity(self);
7594
+ sys.killBox(self);
7595
+ };
7596
+ const func_explosive_explode = (self, inflictor, attacker, damage) => {
7597
+ self.takedamage = false;
7598
+ const ent = self;
7599
+ if (ent.dmg) {
7600
+ const radius = ent.dmg + 40;
7601
+ const candidates = sys.findByRadius(ent.origin, radius);
7602
+ const damageables = candidates;
7603
+ T_RadiusDamage(damageables, ent, attacker, ent.dmg, null, radius, 0 /* NONE */, 26 /* EXPLOSIVE */, sys.timeSeconds, {}, sys.multicast.bind(sys));
7604
+ }
7605
+ const mass = ent.mass || 75;
7606
+ if (mass >= 100) {
7607
+ let count2 = Math.floor(mass / 100);
7608
+ if (count2 > 8) count2 = 8;
7609
+ throwGibs(sys, ent.origin, [
7610
+ { count: count2, model: "models/objects/debris1/tris.md2", flags: GIB_METALLIC | GIB_DEBRIS }
7611
+ ]);
7612
+ }
7613
+ let count = Math.floor(mass / 25);
7614
+ if (count > 16) count = 16;
7615
+ throwGibs(sys, ent.origin, [
7616
+ { count, model: "models/objects/debris2/tris.md2", flags: GIB_METALLIC | GIB_DEBRIS }
7617
+ ]);
7618
+ sys.useTargets(ent, attacker);
7619
+ if (ent.noise_index) {
7620
+ sys.sound(ent, 0, ent.noise_index, 1, 1, 0);
7621
+ }
7622
+ if (ent.dmg) {
7623
+ sys.free(ent);
7624
+ } else {
7625
+ sys.free(ent);
7626
+ }
7627
+ };
7628
+ const func_explosive_use = (self, other, activator) => {
7629
+ func_explosive_explode(self, self, activator || null, self.health);
6613
7630
  };
7631
+ const func_explosive_activate = (self, other, activator) => {
7632
+ let approved = false;
7633
+ if (other && other.target && self.targetname && other.target === self.targetname) {
7634
+ approved = true;
7635
+ }
7636
+ if (!approved && activator && activator.target && self.targetname && activator.target === self.targetname) {
7637
+ approved = true;
7638
+ }
7639
+ if (!approved) return;
7640
+ self.use = func_explosive_use;
7641
+ if (!self.health) self.health = 100;
7642
+ self.die = func_explosive_explode;
7643
+ self.takedamage = true;
7644
+ };
7645
+ if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_TRIGGER_SPAWN) {
7646
+ entity.svflags |= 1 /* NoClient */;
7647
+ entity.solid = 0 /* Not */;
7648
+ entity.use = func_explosive_spawn;
7649
+ } else if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_INACTIVE) {
7650
+ entity.solid = 3 /* Bsp */;
7651
+ if (entity.targetname) {
7652
+ entity.use = func_explosive_activate;
7653
+ }
7654
+ } else {
7655
+ entity.solid = 3 /* Bsp */;
7656
+ if (entity.targetname) {
7657
+ entity.use = func_explosive_use;
7658
+ }
7659
+ }
7660
+ if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_ANIMATED) {
7661
+ entity.effects |= EF_ANIM_ALL;
7662
+ }
7663
+ if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_ANIMATED_FAST) {
7664
+ entity.effects |= EF_ANIM_ALLFAST;
7665
+ }
7666
+ if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_ALWAYS_SHOOTABLE || entity.use !== func_explosive_use && entity.use !== func_explosive_activate) {
7667
+ if (!entity.health) entity.health = 100;
7668
+ entity.die = func_explosive_explode;
7669
+ entity.takedamage = true;
7670
+ }
7671
+ if (entity.sounds === 1) {
7672
+ entity.noise_index = "world/brkglas.wav";
7673
+ }
6614
7674
  };
6615
7675
  var func_killbox = (entity, context) => {
6616
7676
  entity.solid = 0 /* Not */;
@@ -6707,6 +7767,9 @@ function registerLightSpawns(registry) {
6707
7767
  });
6708
7768
  }
6709
7769
 
7770
+ // src/entities/monsters/berserk.ts
7771
+ init_esm();
7772
+
6710
7773
  // src/ai/monster.ts
6711
7774
  function M_MoveFrame(self, context) {
6712
7775
  const move = self.monsterinfo.current_move;
@@ -6746,64 +7809,19 @@ function monster_think(self, context) {
6746
7809
  self.nextthink = context.timeSeconds + 0.1;
6747
7810
  }
6748
7811
 
6749
- // src/entities/gibs.ts
6750
- var random = createRandomGenerator();
6751
- function spawnGib(sys, origin, damage) {
6752
- const gib = sys.spawn();
6753
- gib.classname = "gib";
6754
- gib.origin = {
6755
- x: origin.x + (random.frandom() - 0.5) * 20,
6756
- y: origin.y + (random.frandom() - 0.5) * 20,
6757
- z: origin.z + (random.frandom() - 0.5) * 20
6758
- };
6759
- gib.velocity = {
6760
- x: (random.frandom() - 0.5) * 300,
6761
- y: (random.frandom() - 0.5) * 300,
6762
- z: 200 + random.frandom() * 100
6763
- };
6764
- gib.movetype = 9 /* Bounce */;
6765
- gib.solid = 0 /* Not */;
6766
- gib.clipmask = 1;
6767
- gib.avelocity = {
6768
- x: random.crandom() * 600,
6769
- y: random.crandom() * 600,
6770
- z: random.crandom() * 600
6771
- };
6772
- const models = [
6773
- "models/objects/gibs/bone/tris.md2",
6774
- "models/objects/gibs/meat/tris.md2",
6775
- "models/objects/gibs/sm_meat/tris.md2"
6776
- ];
6777
- const modelName = models[Math.floor(random.frandom() * models.length)];
6778
- gib.modelindex = sys.modelIndex(modelName);
6779
- gib.mins = { x: -2, y: -2, z: -2 };
6780
- gib.maxs = { x: 2, y: 2, z: 2 };
6781
- gib.think = (self) => {
6782
- sys.free(self);
6783
- };
6784
- sys.scheduleThink(gib, sys.timeSeconds + 10 + random.frandom() * 10);
6785
- sys.finalizeSpawn(gib);
6786
- }
6787
- function throwGibs(sys, origin, damage) {
6788
- const count = 4 + Math.floor(random.frandom() * 4);
6789
- for (let i = 0; i < count; i++) {
6790
- spawnGib(sys, origin, damage);
6791
- }
6792
- }
6793
-
6794
7812
  // src/entities/monsters/berserk.ts
6795
7813
  var MONSTER_TICK = 0.1;
6796
7814
  var MELEE_DISTANCE = 80;
6797
7815
  var SPAWNFLAG_BERSERK_NOJUMPING = 16;
6798
- var random2 = createRandomGenerator();
7816
+ var random4 = createRandomGenerator();
6799
7817
  function frandom() {
6800
- return random2.frandom();
7818
+ return random4.frandom();
6801
7819
  }
6802
7820
  function brandom() {
6803
- return random2.frandom() > 0.5;
7821
+ return random4.frandom() > 0.5;
6804
7822
  }
6805
7823
  function irandom(min, max) {
6806
- return Math.floor(random2.frandom() * (max - min + 1) + min);
7824
+ return Math.floor(random4.frandom() * (max - min + 1) + min);
6807
7825
  }
6808
7826
  function monster_ai_stand(self, dist, context) {
6809
7827
  ai_stand(self, MONSTER_TICK, context);
@@ -7299,6 +8317,7 @@ function registerBerserkSpawns(registry) {
7299
8317
  }
7300
8318
 
7301
8319
  // src/entities/monsters/attack.ts
8320
+ init_esm();
7302
8321
  function crandom() {
7303
8322
  return 2 * Math.random() - 1;
7304
8323
  }
@@ -7489,6 +8508,7 @@ function monster_fire_dabeam(self, damage, secondary, update_func, context) {
7489
8508
  }
7490
8509
 
7491
8510
  // src/entities/monsters/boss2.ts
8511
+ init_esm();
7492
8512
  var MONSTER_TICK2 = 0.1;
7493
8513
  var BOSS2_ROCKET_OFFSET_1 = { x: 0, y: 30, z: -15 };
7494
8514
  var BOSS2_ROCKET_OFFSET_2 = { x: 0, y: 15, z: 0 };
@@ -7676,9 +8696,10 @@ function registerBoss2Spawns(registry) {
7676
8696
  }
7677
8697
 
7678
8698
  // src/entities/monsters/brain.ts
8699
+ init_esm();
7679
8700
  var MONSTER_TICK3 = 0.1;
7680
8701
  var MELEE_DISTANCE2 = 80;
7681
- var random3 = Math.random;
8702
+ var random5 = Math.random;
7682
8703
  function monster_ai_stand3(self, dist, context) {
7683
8704
  ai_stand(self, MONSTER_TICK3, context);
7684
8705
  }
@@ -7731,7 +8752,7 @@ function brain_swing_right(self, context) {
7731
8752
  }
7732
8753
  function brain_hit_right(self, context) {
7733
8754
  const aim = { x: MELEE_DISTANCE2, y: self.maxs.x, z: 8 };
7734
- if (monster_fire_hit(self, aim, 15 + Math.floor(random3() * 5), 40, context)) {
8755
+ if (monster_fire_hit(self, aim, 15 + Math.floor(random5() * 5), 40, context)) {
7735
8756
  context.engine.sound?.(self, 0, "brain/melee3.wav", 1, 1, 0);
7736
8757
  } else {
7737
8758
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7742,7 +8763,7 @@ function brain_swing_left(self, context) {
7742
8763
  }
7743
8764
  function brain_hit_left(self, context) {
7744
8765
  const aim = { x: MELEE_DISTANCE2, y: self.mins.x, z: 8 };
7745
- if (monster_fire_hit(self, aim, 15 + Math.floor(random3() * 5), 40, context)) {
8766
+ if (monster_fire_hit(self, aim, 15 + Math.floor(random5() * 5), 40, context)) {
7746
8767
  context.engine.sound?.(self, 0, "brain/melee3.wav", 1, 1, 0);
7747
8768
  } else {
7748
8769
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7755,7 +8776,7 @@ function brain_chest_open(self, context) {
7755
8776
  }
7756
8777
  function brain_tentacle_attack(self, context) {
7757
8778
  const aim = { x: MELEE_DISTANCE2, y: 0, z: 8 };
7758
- if (monster_fire_hit(self, aim, 10 + Math.floor(random3() * 5), -600, context)) {
8779
+ if (monster_fire_hit(self, aim, 10 + Math.floor(random5() * 5), -600, context)) {
7759
8780
  self.count = 1;
7760
8781
  } else {
7761
8782
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7770,7 +8791,7 @@ function brain_chest_closed(self) {
7770
8791
  }
7771
8792
  }
7772
8793
  function brain_melee(self) {
7773
- if (random3() <= 0.5) {
8794
+ if (random5() <= 0.5) {
7774
8795
  self.monsterinfo.current_move = attack1_move;
7775
8796
  } else {
7776
8797
  self.monsterinfo.current_move = attack2_move;
@@ -7853,7 +8874,7 @@ function brain_laserbeam(self, context) {
7853
8874
  monster_fire_dabeam(self, 1, true, brain_left_eye_laser_update, context);
7854
8875
  }
7855
8876
  function brain_laserbeam_reattack(self) {
7856
- if (random3() < 0.5) {
8877
+ if (random5() < 0.5) {
7857
8878
  if (self.enemy && self.enemy.health > 0) {
7858
8879
  self.frame = 0;
7859
8880
  }
@@ -7862,7 +8883,7 @@ function brain_laserbeam_reattack(self) {
7862
8883
  function brain_attack(self, context) {
7863
8884
  const r = rangeTo(self, self.enemy);
7864
8885
  if (r <= RANGE_NEAR) {
7865
- if (random3() < 0.5) {
8886
+ if (random5() < 0.5) {
7866
8887
  self.monsterinfo.current_move = attack3_move;
7867
8888
  } else {
7868
8889
  self.monsterinfo.current_move = attack4_move;
@@ -7882,7 +8903,7 @@ function brain_duck_up(self) {
7882
8903
  self.monsterinfo.aiflags &= ~16;
7883
8904
  }
7884
8905
  function brain_dodge(self, attacker, eta) {
7885
- if (random3() > 0.25) return;
8906
+ if (random5() > 0.25) return;
7886
8907
  if (!self.enemy) self.enemy = attacker;
7887
8908
  self.monsterinfo.pausetime = self.timestamp + eta + 0.5;
7888
8909
  self.monsterinfo.current_move = duck_move;
@@ -8138,7 +9159,7 @@ function brain_pain(self, other, kick, damage, context) {
8138
9159
  return;
8139
9160
  }
8140
9161
  self.pain_debounce_time = self.timestamp + 3;
8141
- const r = random3();
9162
+ const r = random5();
8142
9163
  if (r < 0.33) {
8143
9164
  context.engine.sound?.(self, 0, "brain/brnpain1.wav", 1, 1, 0);
8144
9165
  self.monsterinfo.current_move = pain1_move;
@@ -8162,7 +9183,7 @@ function brain_die(self, inflictor, attacker, damage, point, context) {
8162
9183
  context.engine.sound?.(self, 0, "brain/brndeth1.wav", 1, 1, 0);
8163
9184
  self.deadflag = 2 /* Dead */;
8164
9185
  self.takedamage = true;
8165
- if (random3() <= 0.5) {
9186
+ if (random5() <= 0.5) {
8166
9187
  self.monsterinfo.current_move = death1_move;
8167
9188
  } else {
8168
9189
  self.monsterinfo.current_move = death2_move;
@@ -8199,7 +9220,7 @@ function SP_monster_brain(self, context) {
8199
9220
  context.entities.sound?.(s, 2, "brain/brnsght1.wav", 1, 1, 0);
8200
9221
  };
8201
9222
  self.monsterinfo.search = (s) => {
8202
- if (random3() < 0.5) {
9223
+ if (random5() < 0.5) {
8203
9224
  context.entities.sound?.(s, 2, "brain/brnidle2.wav", 1, 1, 0);
8204
9225
  } else {
8205
9226
  context.entities.sound?.(s, 2, "brain/brnsrch1.wav", 1, 1, 0);
@@ -8217,9 +9238,10 @@ function registerBrainSpawns(registry) {
8217
9238
  }
8218
9239
 
8219
9240
  // src/entities/monsters/chick.ts
9241
+ init_esm();
8220
9242
  var MONSTER_TICK4 = 0.1;
8221
9243
  var MELEE_DISTANCE3 = 80;
8222
- var random4 = Math.random;
9244
+ var random6 = Math.random;
8223
9245
  function monster_ai_stand4(self, dist, context) {
8224
9246
  ai_stand(self, MONSTER_TICK4, context);
8225
9247
  }
@@ -8267,12 +9289,12 @@ function chick_run(self) {
8267
9289
  function chick_fidget(self) {
8268
9290
  if (self.monsterinfo.aiflags & 4) return;
8269
9291
  if (self.enemy) return;
8270
- if (random4() <= 0.3) {
9292
+ if (random6() <= 0.3) {
8271
9293
  self.monsterinfo.current_move = fidget_move;
8272
9294
  }
8273
9295
  }
8274
9296
  function ChickMoan(self, context) {
8275
- if (random4() < 0.5) {
9297
+ if (random6() < 0.5) {
8276
9298
  context.engine.sound?.(self, 2, "chick/chkidle1.wav", 1, 0, 0);
8277
9299
  } else {
8278
9300
  context.engine.sound?.(self, 2, "chick/chkidle2.wav", 1, 0, 0);
@@ -8281,7 +9303,7 @@ function ChickMoan(self, context) {
8281
9303
  function chick_slash(self, context) {
8282
9304
  const aim = { x: MELEE_DISTANCE3, y: self.mins.x, z: 10 };
8283
9305
  context.engine.sound?.(self, 0, "chick/chkatck3.wav", 1, 1, 0);
8284
- monster_fire_hit(self, aim, 10 + Math.floor(random4() * 6), 100, context);
9306
+ monster_fire_hit(self, aim, 10 + Math.floor(random6() * 6), 100, context);
8285
9307
  }
8286
9308
  function chick_rocket(self, context) {
8287
9309
  const { forward, right } = angleVectors(self.angles);
@@ -8302,7 +9324,7 @@ function chick_rocket(self, context) {
8302
9324
  }
8303
9325
  let dir = subtractVec3(target, finalStart);
8304
9326
  if (!blindfire && self.enemy) {
8305
- if (random4() < 0.33 || finalStart.z < self.enemy.absmin.z) {
9327
+ if (random6() < 0.33 || finalStart.z < self.enemy.absmin.z) {
8306
9328
  const tempDir = { ...dir, z: dir.z + self.enemy.viewheight };
8307
9329
  dir = tempDir;
8308
9330
  } else {
@@ -8337,7 +9359,7 @@ function chick_rerocket(self) {
8337
9359
  return;
8338
9360
  }
8339
9361
  if (self.enemy && self.enemy.health > 0) {
8340
- if (random4() <= 0.6) {
9362
+ if (random6() <= 0.6) {
8341
9363
  self.monsterinfo.current_move = attack1_move2;
8342
9364
  return;
8343
9365
  }
@@ -8346,7 +9368,7 @@ function chick_rerocket(self) {
8346
9368
  }
8347
9369
  function chick_reslash(self) {
8348
9370
  if (self.enemy && self.enemy.health > 0) {
8349
- if (random4() <= 0.9) {
9371
+ if (random6() <= 0.9) {
8350
9372
  self.monsterinfo.current_move = slash_move;
8351
9373
  return;
8352
9374
  }
@@ -8424,7 +9446,7 @@ function chick_pain(self, other, kick, damage, context) {
8424
9446
  }
8425
9447
  if (self.timestamp < (self.pain_debounce_time || 0)) return;
8426
9448
  self.pain_debounce_time = self.timestamp + 3;
8427
- const r = random4();
9449
+ const r = random6();
8428
9450
  if (r < 0.33) context.engine.sound?.(self, 0, "chick/chkpain1.wav", 1, 1, 0);
8429
9451
  else if (r < 0.66) context.engine.sound?.(self, 0, "chick/chkpain2.wav", 1, 1, 0);
8430
9452
  else context.engine.sound?.(self, 0, "chick/chkpain3.wav", 1, 1, 0);
@@ -8453,7 +9475,7 @@ function chick_die(self, inflictor, attacker, damage, point, context) {
8453
9475
  if (self.deadflag === 2 /* Dead */) return;
8454
9476
  self.deadflag = 2 /* Dead */;
8455
9477
  self.takedamage = true;
8456
- if (random4() <= 0.5) {
9478
+ if (random6() <= 0.5) {
8457
9479
  self.monsterinfo.current_move = death1_move2;
8458
9480
  context.engine.sound?.(self, 0, "chick/chkdeth1.wav", 1, 1, 0);
8459
9481
  } else {
@@ -8573,7 +9595,7 @@ function registerChickSpawns(registry) {
8573
9595
  var MONSTER_TICK5 = 0.1;
8574
9596
  var MELEE_DISTANCE4 = 80;
8575
9597
  var FLIPPER_RUN_SPEED = 24;
8576
- var random5 = Math.random;
9598
+ var random7 = Math.random;
8577
9599
  function monster_ai_stand5(self, dist, context) {
8578
9600
  ai_stand(self, MONSTER_TICK5, context);
8579
9601
  }
@@ -8690,7 +9712,7 @@ function flipper_pain(self, other, kick, damage, context) {
8690
9712
  return;
8691
9713
  }
8692
9714
  self.pain_debounce_time = self.timestamp + 3;
8693
- if (random5() < 0.5) {
9715
+ if (random7() < 0.5) {
8694
9716
  context.engine.sound?.(self, 0, "flipper/flppain1.wav", 1, 1, 0);
8695
9717
  self.monsterinfo.current_move = pain1_move3;
8696
9718
  } else {
@@ -8798,6 +9820,7 @@ function registerFlipperSpawns(registry) {
8798
9820
  }
8799
9821
 
8800
9822
  // src/entities/monsters/floater.ts
9823
+ init_esm();
8801
9824
  var MONSTER_TICK6 = 0.1;
8802
9825
  function monster_ai_stand6(self, dist, context) {
8803
9826
  ai_stand(self, MONSTER_TICK6, context);
@@ -8955,6 +9978,7 @@ function registerFloaterSpawns(registry) {
8955
9978
  }
8956
9979
 
8957
9980
  // src/entities/monsters/flyer.ts
9981
+ init_esm();
8958
9982
  var MONSTER_TICK7 = 0.1;
8959
9983
  function monster_ai_stand7(self, dist, context) {
8960
9984
  ai_stand(self, MONSTER_TICK7, context);
@@ -9133,6 +10157,7 @@ function registerFlyerSpawns(registry) {
9133
10157
  }
9134
10158
 
9135
10159
  // src/entities/monsters/gladiator.ts
10160
+ init_esm();
9136
10161
  var MONSTER_TICK8 = 0.1;
9137
10162
  function monster_ai_stand8(self, dist, context) {
9138
10163
  ai_stand(self, MONSTER_TICK8, context);
@@ -9332,6 +10357,7 @@ function registerGladiatorSpawns(registry) {
9332
10357
  }
9333
10358
 
9334
10359
  // src/entities/monsters/gunner.ts
10360
+ init_esm();
9335
10361
  var MONSTER_TICK9 = 0.1;
9336
10362
  function monster_ai_stand9(self, dist, context) {
9337
10363
  ai_stand(self, MONSTER_TICK9, context);
@@ -9754,6 +10780,7 @@ function registerGunnerSpawns(registry) {
9754
10780
  }
9755
10781
 
9756
10782
  // src/entities/monsters/hover.ts
10783
+ init_esm();
9757
10784
  var MONSTER_TICK10 = 0.1;
9758
10785
  function monster_ai_stand10(self, dist, context) {
9759
10786
  ai_stand(self, MONSTER_TICK10, context);
@@ -9911,6 +10938,7 @@ function registerHoverSpawns(registry) {
9911
10938
  }
9912
10939
 
9913
10940
  // src/entities/monsters/icarus.ts
10941
+ init_esm();
9914
10942
  var MONSTER_TICK11 = 0.1;
9915
10943
  function monster_ai_stand11(self, dist, context) {
9916
10944
  ai_stand(self, MONSTER_TICK11, context);
@@ -10068,6 +11096,7 @@ function registerIcarusSpawns(registry) {
10068
11096
  }
10069
11097
 
10070
11098
  // src/entities/monsters/infantry.ts
11099
+ init_esm();
10071
11100
  var MONSTER_TICK12 = 0.1;
10072
11101
  function monster_ai_stand12(self, dist, context) {
10073
11102
  ai_stand(self, MONSTER_TICK12, context);
@@ -10268,6 +11297,7 @@ function registerInfantrySpawns(registry) {
10268
11297
  }
10269
11298
 
10270
11299
  // src/entities/monsters/makron.ts
11300
+ init_esm();
10271
11301
  var MONSTER_TICK13 = 0.1;
10272
11302
  var MAKRON_BFG_OFFSET = { x: 30, y: 28, z: 24 };
10273
11303
  var MAKRON_BLASTER_OFFSET_1 = { x: 26, y: 16, z: 24 };
@@ -10513,6 +11543,7 @@ function registerMakronSpawns(registry) {
10513
11543
  }
10514
11544
 
10515
11545
  // src/entities/monsters/jorg.ts
11546
+ init_esm();
10516
11547
  var MONSTER_TICK14 = 0.1;
10517
11548
  var JORG_MACHINEGUN_R1_OFFSET = { x: 40, y: -20, z: 20 };
10518
11549
  var JORG_MACHINEGUN_L1_OFFSET = { x: 40, y: 20, z: 20 };
@@ -10736,7 +11767,7 @@ var SPAWNFLAG_INSANE_STAND_GROUND = 16;
10736
11767
  var SPAWNFLAG_INSANE_ALWAYS_STAND = 32;
10737
11768
  var SPAWNFLAG_INSANE_QUIET = 64;
10738
11769
  var FRAME_stand1 = 0;
10739
- var FRAME_stand40 = 39;
11770
+ var FRAME_stand402 = 39;
10740
11771
  var FRAME_stand41 = 40;
10741
11772
  var FRAME_stand59 = 58;
10742
11773
  var FRAME_stand60 = 59;
@@ -10998,7 +12029,7 @@ var frames_uptodown = [
10998
12029
  ];
10999
12030
  insane_move_uptodown = {
11000
12031
  firstframe: FRAME_stand1,
11001
- lastframe: FRAME_stand40,
12032
+ lastframe: FRAME_stand402,
11002
12033
  frames: frames_uptodown,
11003
12034
  endfunc: insane_onground
11004
12035
  };
@@ -11363,7 +12394,7 @@ function SP_misc_insane(self, context) {
11363
12394
  return;
11364
12395
  }
11365
12396
  const frame = self2.frame;
11366
- 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) {
11367
12398
  self2.monsterinfo.current_move = insane_move_crawl_pain;
11368
12399
  } else {
11369
12400
  self2.monsterinfo.current_move = insane_move_stand_pain;
@@ -11422,6 +12453,8 @@ function registerInsaneSpawns(registry) {
11422
12453
  }
11423
12454
 
11424
12455
  // src/entities/monsters/actor.ts
12456
+ init_esm();
12457
+ init_esm();
11425
12458
  var MONSTER_TICK16 = 0.1;
11426
12459
  var MZ2_ACTOR_MACHINEGUN_1 = 0;
11427
12460
  var actor_names = [
@@ -11440,19 +12473,19 @@ var FRAME_walk01 = 40;
11440
12473
  var FRAME_walk08 = 47;
11441
12474
  var FRAME_run02 = 48;
11442
12475
  var FRAME_run07 = 53;
11443
- var FRAME_pain101 = 54;
12476
+ var FRAME_pain1012 = 54;
11444
12477
  var FRAME_pain103 = 56;
11445
- var FRAME_pain201 = 57;
12478
+ var FRAME_pain2012 = 57;
11446
12479
  var FRAME_pain203 = 59;
11447
- var FRAME_pain301 = 60;
12480
+ var FRAME_pain3012 = 60;
11448
12481
  var FRAME_pain303 = 62;
11449
12482
  var FRAME_flip01 = 63;
11450
12483
  var FRAME_flip14 = 76;
11451
12484
  var FRAME_taunt01 = 77;
11452
12485
  var FRAME_taunt17 = 93;
11453
- var FRAME_death101 = 94;
12486
+ var FRAME_death1012 = 94;
11454
12487
  var FRAME_death107 = 100;
11455
- var FRAME_death201 = 101;
12488
+ var FRAME_death2012 = 101;
11456
12489
  var FRAME_death213 = 113;
11457
12490
  var FRAME_attak01 = 114;
11458
12491
  var FRAME_attak04 = 117;
@@ -11508,8 +12541,8 @@ function actor_pain(self, other, kick, damage) {
11508
12541
  if (context.timeSeconds < self.pain_debounce_time)
11509
12542
  return;
11510
12543
  self.pain_debounce_time = context.timeSeconds + 3;
11511
- const random12 = Math.random();
11512
- if (other && other.client && random12 < 0.4) {
12544
+ const random13 = Math.random();
12545
+ if (other && other.client && random13 < 0.4) {
11513
12546
  const v = subtractVec3(other.origin, self.origin);
11514
12547
  self.ideal_yaw = vectorToYaw(v);
11515
12548
  if (Math.random() < 0.5)
@@ -11702,7 +12735,7 @@ var frames_pain1 = [
11702
12735
  m2(ai_move, 1)
11703
12736
  ];
11704
12737
  actor_move_pain1 = {
11705
- firstframe: FRAME_pain101,
12738
+ firstframe: FRAME_pain1012,
11706
12739
  lastframe: FRAME_pain103,
11707
12740
  frames: frames_pain1,
11708
12741
  endfunc: actor_run
@@ -11713,7 +12746,7 @@ var frames_pain2 = [
11713
12746
  m2(ai_move)
11714
12747
  ];
11715
12748
  actor_move_pain2 = {
11716
- firstframe: FRAME_pain201,
12749
+ firstframe: FRAME_pain2012,
11717
12750
  lastframe: FRAME_pain203,
11718
12751
  frames: frames_pain2,
11719
12752
  endfunc: actor_run
@@ -11724,7 +12757,7 @@ var frames_pain3 = [
11724
12757
  m2(ai_move, 0)
11725
12758
  ];
11726
12759
  actor_move_pain3 = {
11727
- firstframe: FRAME_pain301,
12760
+ firstframe: FRAME_pain3012,
11728
12761
  lastframe: FRAME_pain303,
11729
12762
  frames: frames_pain3,
11730
12763
  endfunc: actor_run
@@ -11786,7 +12819,7 @@ var frames_death1 = [
11786
12819
  m2(ai_move, 1)
11787
12820
  ];
11788
12821
  actor_move_death1 = {
11789
- firstframe: FRAME_death101,
12822
+ firstframe: FRAME_death1012,
11790
12823
  lastframe: FRAME_death107,
11791
12824
  frames: frames_death1,
11792
12825
  endfunc: actor_dead
@@ -11807,7 +12840,7 @@ var frames_death2 = [
11807
12840
  m2(ai_move)
11808
12841
  ];
11809
12842
  actor_move_death2 = {
11810
- firstframe: FRAME_death201,
12843
+ firstframe: FRAME_death2012,
11811
12844
  lastframe: FRAME_death213,
11812
12845
  frames: frames_death2,
11813
12846
  endfunc: actor_dead
@@ -11962,6 +12995,8 @@ function registerActorSpawns(registry) {
11962
12995
  }
11963
12996
 
11964
12997
  // src/entities/monsters/medic.ts
12998
+ init_esm();
12999
+ init_esm();
11965
13000
  var MONSTER_TICK17 = 0.1;
11966
13001
  function monster_ai_stand15(self, dist, context) {
11967
13002
  if (self.classname === "monster_medic") {
@@ -12338,8 +13373,9 @@ function registerMedicSpawns(registry) {
12338
13373
  }
12339
13374
 
12340
13375
  // src/entities/monsters/mutant.ts
13376
+ init_esm();
12341
13377
  var MONSTER_TICK18 = 0.1;
12342
- var random6 = () => Math.random();
13378
+ var random8 = () => Math.random();
12343
13379
  function monster_ai_stand16(self, dist, context) {
12344
13380
  ai_stand(self, MONSTER_TICK18, context);
12345
13381
  }
@@ -12452,11 +13488,11 @@ function mutant_check_attack(self, context) {
12452
13488
  if (self.enemy && self.enemy.health > 0) {
12453
13489
  const diff = subtractVec3(self.enemy.origin, self.origin);
12454
13490
  const dist = lengthVec3(diff);
12455
- if (dist < 128 && random6() < 0.5) {
13491
+ if (dist < 128 && random8() < 0.5) {
12456
13492
  self.monsterinfo.current_move = attack_move7;
12457
13493
  return true;
12458
13494
  }
12459
- if (dist >= 128 && dist < 512 && random6() < 0.3) {
13495
+ if (dist >= 128 && dist < 512 && random8() < 0.3) {
12460
13496
  self.monsterinfo.current_move = jump_move2;
12461
13497
  return true;
12462
13498
  }
@@ -12469,10 +13505,10 @@ function mutant_pain_func(self, other, kick, damage, context) {
12469
13505
  }
12470
13506
  if (self.timestamp < (self.pain_finished_time || 0)) return;
12471
13507
  self.pain_finished_time = self.timestamp + 3;
12472
- if (random6() < 0.5) {
13508
+ if (random8() < 0.5) {
12473
13509
  context.engine.sound?.(self, 0, "mutant/mutpain1.wav", 1, 1, 0);
12474
13510
  self.monsterinfo.current_move = pain1_move6;
12475
- } else if (random6() < 0.5) {
13511
+ } else if (random8() < 0.5) {
12476
13512
  context.engine.sound?.(self, 0, "mutant/mutpain2.wav", 1, 1, 0);
12477
13513
  self.monsterinfo.current_move = pain2_move6;
12478
13514
  } else {
@@ -12727,8 +13763,9 @@ function registerMutantSpawns(registry) {
12727
13763
  }
12728
13764
 
12729
13765
  // src/entities/monsters/parasite.ts
13766
+ init_esm();
12730
13767
  var MONSTER_TICK19 = 0.1;
12731
- var random7 = () => Math.random();
13768
+ var random9 = () => Math.random();
12732
13769
  function monster_ai_stand17(self, dist, context) {
12733
13770
  ai_stand(self, MONSTER_TICK19, context);
12734
13771
  }
@@ -12773,7 +13810,7 @@ function parasite_do_fidget(self) {
12773
13810
  self.monsterinfo.current_move = fidget_move3;
12774
13811
  }
12775
13812
  function parasite_refidget(self) {
12776
- if (random7() <= 0.8) {
13813
+ if (random9() <= 0.8) {
12777
13814
  self.monsterinfo.current_move = fidget_move3;
12778
13815
  } else {
12779
13816
  self.monsterinfo.current_move = end_fidget_move;
@@ -12886,7 +13923,7 @@ function parasite_pain_func(self, other, kick, damage, context) {
12886
13923
  }
12887
13924
  if (self.timestamp < (self.pain_finished_time || 0)) return;
12888
13925
  self.pain_finished_time = self.timestamp + 3;
12889
- if (random7() < 0.5) {
13926
+ if (random9() < 0.5) {
12890
13927
  context.engine.sound?.(self, 0, "parasite/parpain1.wav", 1, 1, 0);
12891
13928
  } else {
12892
13929
  context.engine.sound?.(self, 0, "parasite/parpain2.wav", 1, 1, 0);
@@ -13123,6 +14160,7 @@ function registerParasiteSpawns(registry) {
13123
14160
  }
13124
14161
 
13125
14162
  // src/entities/monsters/soldier.ts
14163
+ init_esm();
13126
14164
  var MONSTER_TICK20 = 0.1;
13127
14165
  var SOLDIER_LIGHT = 1;
13128
14166
  var SOLDIER_SSG = 2;
@@ -13461,6 +14499,7 @@ function registerMonsterSpawns(registry) {
13461
14499
  }
13462
14500
 
13463
14501
  // src/entities/monsters/supertank.ts
14502
+ init_esm();
13464
14503
  var MONSTER_TICK21 = 0.1;
13465
14504
  var SUPERTANK_MACHINEGUN_OFFSET = { x: 30, y: 30, z: 40 };
13466
14505
  var SUPERTANK_ROCKET_OFFSET = { x: 30, y: -30, z: 40 };
@@ -13685,6 +14724,7 @@ function registerSupertankSpawns(registry) {
13685
14724
  }
13686
14725
 
13687
14726
  // src/entities/monsters/tank.ts
14727
+ init_esm();
13688
14728
  var MONSTER_TICK22 = 0.1;
13689
14729
  function M_AdjustBlindfireTarget(self, start, target, right, context) {
13690
14730
  const tr = context.trace(start, target, ZERO_VEC3, ZERO_VEC3, self, MASK_SHOT);
@@ -14055,6 +15095,7 @@ function registerTankCommanderSpawns(registry) {
14055
15095
  }
14056
15096
 
14057
15097
  // src/entities/monsters/turret.ts
15098
+ init_esm();
14058
15099
  var MONSTER_TICK23 = 0.1;
14059
15100
  function monster_ai_stand21(self, dist, context) {
14060
15101
  ai_stand(self, MONSTER_TICK23, context);
@@ -14206,8 +15247,9 @@ function registerTurretSpawns(registry) {
14206
15247
  }
14207
15248
 
14208
15249
  // src/entities/monsters/gekk.ts
15250
+ init_esm();
14209
15251
  var MONSTER_TICK24 = 0.1;
14210
- var random8 = () => Math.random();
15252
+ var random10 = () => Math.random();
14211
15253
  var frandom2 = () => Math.random();
14212
15254
  var irandom2 = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
14213
15255
  function monster_ai_stand22(self, dist, context) {
@@ -14716,7 +15758,7 @@ function gekk_pain(self, other, kick, damage, context) {
14716
15758
  }
14717
15759
  self.monsterinfo.current_move = gekk_move_pain;
14718
15760
  } else {
14719
- if (random8() > 0.5) self.monsterinfo.current_move = gekk_move_pain1;
15761
+ if (random10() > 0.5) self.monsterinfo.current_move = gekk_move_pain1;
14720
15762
  else self.monsterinfo.current_move = gekk_move_pain2;
14721
15763
  }
14722
15764
  }
@@ -14848,8 +15890,9 @@ function registerGekkSpawns(registry) {
14848
15890
  }
14849
15891
 
14850
15892
  // src/entities/monsters/fixbot.ts
15893
+ init_esm();
14851
15894
  var MONSTER_TICK25 = 0.1;
14852
- var random9 = () => Math.random();
15895
+ var random11 = () => Math.random();
14853
15896
  var frandom3 = () => Math.random();
14854
15897
  function monster_ai_walk21(self, dist, context) {
14855
15898
  ai_walk(self, dist, MONSTER_TICK25, context);
@@ -14912,7 +15955,7 @@ function fixbot_search(self, context) {
14912
15955
  fixbot_run(self);
14913
15956
  fixbot_set_fly_parameters(self, true, false);
14914
15957
  } else {
14915
- if (random9() < 0.1) {
15958
+ if (random11() < 0.1) {
14916
15959
  context.engine.sound?.(self, 0, "flyer/flysght1.wav", 1, 1, 0);
14917
15960
  }
14918
15961
  }
@@ -15571,6 +16614,9 @@ var LevelClock = class {
15571
16614
  }
15572
16615
  };
15573
16616
 
16617
+ // src/save/save.ts
16618
+ init_esm();
16619
+
15574
16620
  // src/checksum.ts
15575
16621
  var FNV_OFFSET_BASIS = 2166136261;
15576
16622
  var FNV_PRIME = 16777619;
@@ -16033,6 +17079,7 @@ function applySaveFile(save, targets) {
16033
17079
  }
16034
17080
 
16035
17081
  // src/save/rerelease.ts
17082
+ init_esm();
16036
17083
  function ensureObject2(value, label) {
16037
17084
  if (!value || typeof value !== "object" || Array.isArray(value)) {
16038
17085
  throw new Error(`${label} must be an object`);
@@ -16445,6 +17492,9 @@ _SaveStorage.DEFAULT_STORE = "saves";
16445
17492
  _SaveStorage.QUICK_SLOT = "quicksave";
16446
17493
  var SaveStorage = _SaveStorage;
16447
17494
 
17495
+ // src/index.ts
17496
+ init_esm();
17497
+
16448
17498
  // src/ai/noise.ts
16449
17499
  var PNOISE_SELF = 0;
16450
17500
  var PNOISE_WEAPON = 1;
@@ -16470,8 +17520,13 @@ function PlayerNoise(who, where, type, context) {
16470
17520
  }
16471
17521
  }
16472
17522
 
17523
+ // src/entities/player.ts
17524
+ init_playerInventory();
17525
+
16473
17526
  // src/combat/obituary.ts
16474
- var random10 = createRandomGenerator();
17527
+ init_esm();
17528
+ init_esm();
17529
+ var random12 = createRandomGenerator();
16475
17530
  var PRINT_MEDIUM = 1;
16476
17531
  function getGender(ent) {
16477
17532
  return "male";
@@ -16612,30 +17667,6 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
16612
17667
  }
16613
17668
  }
16614
17669
 
16615
- // src/entities/player_anim.ts
16616
- var FRAME_stand01 = 0;
16617
- var FRAME_stand402 = 39;
16618
- var FRAME_run1 = 40;
16619
- var FRAME_run6 = 45;
16620
- var FRAME_pain1012 = 54;
16621
- var FRAME_pain104 = 57;
16622
- var FRAME_pain2012 = 58;
16623
- var FRAME_pain204 = 61;
16624
- var FRAME_pain3012 = 62;
16625
- var FRAME_pain304 = 65;
16626
- var FRAME_death1012 = 66;
16627
- var FRAME_death106 = 71;
16628
- var FRAME_death2012 = 72;
16629
- var FRAME_death206 = 77;
16630
- var FRAME_death301 = 78;
16631
- var FRAME_death306 = 83;
16632
- var ANIM_BASIC = 0;
16633
- var ANIM_PAIN = 2;
16634
- var ANIM_DEATH = 3;
16635
-
16636
- // src/combat/weapons/firing.ts
16637
- var random11 = createRandomGenerator();
16638
-
16639
17670
  // src/entities/player.ts
16640
17671
  function P_PlayerThink(ent, sys) {
16641
17672
  if (!ent.client) return;
@@ -16654,9 +17685,9 @@ function P_PlayerThink(ent, sys) {
16654
17685
  animChanged = true;
16655
17686
  }
16656
17687
  } else {
16657
- 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) {
16658
17689
  ent.frame = FRAME_stand01;
16659
- client.anim_end = FRAME_stand402;
17690
+ client.anim_end = FRAME_stand40;
16660
17691
  client.anim_priority = ANIM_BASIC;
16661
17692
  animChanged = true;
16662
17693
  }
@@ -16675,7 +17706,7 @@ function P_PlayerThink(ent, sys) {
16675
17706
  } else if (client.anim_end === ent.frame) {
16676
17707
  if (client.anim_priority === ANIM_BASIC) {
16677
17708
  if (ent.frame === FRAME_run6) ent.frame = FRAME_run1;
16678
- else if (ent.frame === FRAME_stand402) ent.frame = FRAME_stand01;
17709
+ else if (ent.frame === FRAME_stand40) ent.frame = FRAME_stand01;
16679
17710
  } else {
16680
17711
  if (client.anim_priority !== ANIM_DEATH) {
16681
17712
  client.anim_priority = ANIM_BASIC;
@@ -16691,15 +17722,15 @@ function player_pain(self, damage) {
16691
17722
  return;
16692
17723
  }
16693
17724
  self.client.anim_priority = ANIM_PAIN;
16694
- const r = random11.frandom();
17725
+ const r = random2.frandom();
16695
17726
  if (r < 0.33) {
16696
- self.frame = FRAME_pain1012;
17727
+ self.frame = FRAME_pain101;
16697
17728
  self.client.anim_end = FRAME_pain104;
16698
17729
  } else if (r < 0.66) {
16699
- self.frame = FRAME_pain2012;
17730
+ self.frame = FRAME_pain201;
16700
17731
  self.client.anim_end = FRAME_pain204;
16701
17732
  } else {
16702
- self.frame = FRAME_pain3012;
17733
+ self.frame = FRAME_pain301;
16703
17734
  self.client.anim_end = FRAME_pain304;
16704
17735
  }
16705
17736
  }
@@ -16714,12 +17745,12 @@ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
16714
17745
  }
16715
17746
  if (self.client) {
16716
17747
  self.client.anim_priority = ANIM_DEATH;
16717
- const r = random11.frandom();
17748
+ const r = random2.frandom();
16718
17749
  if (r < 0.33) {
16719
- self.frame = FRAME_death1012;
17750
+ self.frame = FRAME_death101;
16720
17751
  self.client.anim_end = FRAME_death106;
16721
17752
  } else if (r < 0.66) {
16722
- self.frame = FRAME_death2012;
17753
+ self.frame = FRAME_death201;
16723
17754
  self.client.anim_end = FRAME_death206;
16724
17755
  } else {
16725
17756
  self.frame = FRAME_death301;
@@ -16767,6 +17798,8 @@ function player_think(self, sys) {
16767
17798
  }
16768
17799
 
16769
17800
  // src/entities/playerStats.ts
17801
+ init_esm();
17802
+ init_playerInventory();
16770
17803
  var POWERUP_TIMERS = [
16771
17804
  { id: PowerupId.QuadDamage, priority: 1 },
16772
17805
  { id: PowerupId.Invulnerability, priority: 2 },
@@ -16832,7 +17865,11 @@ function populatePlayerStats(player, timeSeconds) {
16832
17865
  return statArray;
16833
17866
  }
16834
17867
 
17868
+ // src/index.ts
17869
+ init_esm();
17870
+
16835
17871
  // src/combat/specialDamage.ts
17872
+ init_esm();
16836
17873
  var ZERO2 = { x: 0, y: 0, z: 0 };
16837
17874
  var EnvironmentalFlags = /* @__PURE__ */ ((EnvironmentalFlags2) => {
16838
17875
  EnvironmentalFlags2[EnvironmentalFlags2["IN_WATER"] = 1] = "IN_WATER";
@@ -17153,6 +18190,13 @@ function createGame(imports, engine, options) {
17153
18190
  configstring
17154
18191
  };
17155
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
+ };
17156
18200
  frameLoop.addStage("prep", (context) => {
17157
18201
  levelClock.tick(context);
17158
18202
  entities.beginFrame(levelClock.current.timeSeconds);
@@ -17439,6 +18483,7 @@ function createGame(imports, engine, options) {
17439
18483
  };
17440
18484
  const spawnRegistry = createDefaultSpawnRegistry(gameExports);
17441
18485
  entities.setSpawnRegistry(spawnRegistry);
18486
+ entities._game = gameExports;
17442
18487
  return gameExports;
17443
18488
  }
17444
18489
  export {