quake2ts 0.0.277 → 0.0.281

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +13 -13
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs.map +1 -1
  5. package/packages/client/dist/esm/index.js.map +1 -1
  6. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  7. package/packages/engine/dist/browser/index.global.js +9 -9
  8. package/packages/engine/dist/browser/index.global.js.map +1 -1
  9. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  10. package/packages/engine/dist/esm/index.js.map +1 -1
  11. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  12. package/packages/game/dist/browser/index.global.js +3 -3
  13. package/packages/game/dist/browser/index.global.js.map +1 -1
  14. package/packages/game/dist/cjs/index.cjs +2108 -1193
  15. package/packages/game/dist/cjs/index.cjs.map +1 -1
  16. package/packages/game/dist/esm/index.js +1879 -957
  17. package/packages/game/dist/esm/index.js.map +1 -1
  18. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  19. package/packages/game/dist/types/combat/weapons/animation.d.ts +3 -2
  20. package/packages/game/dist/types/combat/weapons/animation.d.ts.map +1 -1
  21. package/packages/game/dist/types/combat/weapons/bfg.d.ts +4 -0
  22. package/packages/game/dist/types/combat/weapons/bfg.d.ts.map +1 -0
  23. package/packages/game/dist/types/combat/weapons/blaster.d.ts +4 -0
  24. package/packages/game/dist/types/combat/weapons/blaster.d.ts.map +1 -0
  25. package/packages/game/dist/types/combat/weapons/chaingun.d.ts.map +1 -1
  26. package/packages/game/dist/types/combat/weapons/firing.d.ts +10 -0
  27. package/packages/game/dist/types/combat/weapons/firing.d.ts.map +1 -1
  28. package/packages/game/dist/types/combat/weapons/frames.d.ts +43 -0
  29. package/packages/game/dist/types/combat/weapons/frames.d.ts.map +1 -1
  30. package/packages/game/dist/types/combat/weapons/grenadelauncher.d.ts +4 -0
  31. package/packages/game/dist/types/combat/weapons/grenadelauncher.d.ts.map +1 -0
  32. package/packages/game/dist/types/combat/weapons/hyperblaster.d.ts +4 -0
  33. package/packages/game/dist/types/combat/weapons/hyperblaster.d.ts.map +1 -0
  34. package/packages/game/dist/types/combat/weapons/machinegun.d.ts +4 -0
  35. package/packages/game/dist/types/combat/weapons/machinegun.d.ts.map +1 -0
  36. package/packages/game/dist/types/combat/weapons/railgun.d.ts +4 -0
  37. package/packages/game/dist/types/combat/weapons/railgun.d.ts.map +1 -0
  38. package/packages/game/dist/types/combat/weapons/rocket.d.ts +4 -0
  39. package/packages/game/dist/types/combat/weapons/rocket.d.ts.map +1 -0
  40. package/packages/game/dist/types/combat/weapons/shotgun.d.ts +4 -0
  41. package/packages/game/dist/types/combat/weapons/shotgun.d.ts.map +1 -0
  42. package/packages/game/dist/types/combat/weapons/supershotgun.d.ts +4 -0
  43. package/packages/game/dist/types/combat/weapons/supershotgun.d.ts.map +1 -0
  44. package/packages/game/dist/types/entities/entity.d.ts +17 -0
  45. package/packages/game/dist/types/entities/entity.d.ts.map +1 -1
  46. package/packages/game/dist/types/entities/system.d.ts +2 -1
  47. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  48. package/packages/game/dist/types/entities/targets.d.ts.map +1 -1
  49. package/packages/game/dist/types/index.d.ts.map +1 -1
  50. package/packages/game/dist/types/inventory/items.d.ts.map +1 -1
  51. package/packages/shared/dist/browser/index.global.js +1 -1
  52. package/packages/shared/dist/browser/index.global.js.map +1 -1
  53. package/packages/shared/dist/cjs/index.cjs +26 -0
  54. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  55. package/packages/shared/dist/esm/index.js +25 -0
  56. package/packages/shared/dist/esm/index.js.map +1 -1
  57. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  58. package/packages/shared/dist/types/protocol/index.d.ts +1 -0
  59. package/packages/shared/dist/types/protocol/index.d.ts.map +1 -1
  60. package/packages/shared/dist/types/protocol/renderFx.d.ts +22 -0
  61. package/packages/shared/dist/types/protocol/renderFx.d.ts.map +1 -0
  62. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -3,6 +3,9 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __esm = (fn, res) => function __init() {
7
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
+ };
6
9
  var __export = (target, all) => {
7
10
  for (var name in all)
8
11
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -17,162 +20,7 @@ var __copyProps = (to, from, except, desc) => {
17
20
  };
18
21
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
22
 
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- AIFlags: () => AIFlags,
24
- AMMO_TYPE_COUNT: () => AMMO_TYPE_COUNT,
25
- ARMOR_INFO: () => ARMOR_INFO,
26
- ARMOR_ITEMS: () => ARMOR_ITEMS,
27
- AmmoItemId: () => AmmoItemId,
28
- AmmoType: () => AmmoType,
29
- ArmorType: () => ArmorType,
30
- AttackState: () => AttackState,
31
- CheckGround: () => CheckGround,
32
- DamageFlags: () => DamageFlags,
33
- DamageMod: () => DamageMod,
34
- DeadFlag: () => DeadFlag,
35
- ENTITY_FIELD_METADATA: () => ENTITY_FIELD_METADATA,
36
- Entity: () => Entity,
37
- EntityDamageFlags: () => EntityDamageFlags,
38
- EntitySystem: () => EntitySystem,
39
- EnvironmentalFlags: () => EnvironmentalFlags,
40
- FL_NOTARGET: () => FL_NOTARGET,
41
- FL_NOVISIBLE: () => FL_NOVISIBLE,
42
- HEALTH_ITEMS: () => HEALTH_ITEMS,
43
- KEY_ITEMS: () => KEY_ITEMS,
44
- KeyId: () => KeyId,
45
- M_CheckBottom: () => M_CheckBottom,
46
- M_MoveFrame: () => M_MoveFrame,
47
- M_walkmove: () => M_walkmove,
48
- MoveType: () => MoveType,
49
- MulticastType: () => MulticastType,
50
- ORDERED_DAMAGE_MODS: () => ORDERED_DAMAGE_MODS,
51
- PNOISE_IMPACT: () => PNOISE_IMPACT,
52
- PNOISE_SELF: () => PNOISE_SELF,
53
- PNOISE_WEAPON: () => PNOISE_WEAPON,
54
- POWERUP_ITEMS: () => POWERUP_ITEMS,
55
- POWER_ARMOR_ITEMS: () => POWER_ARMOR_ITEMS,
56
- PlayerNoise: () => PlayerNoise,
57
- PowerupId: () => PowerupId,
58
- RANGE_MELEE: () => RANGE_MELEE,
59
- RANGE_MID: () => RANGE_MID,
60
- RANGE_NEAR: () => RANGE_NEAR,
61
- Range: () => RangeCategory,
62
- RangeCategory: () => RangeCategory,
63
- SAVE_FORMAT_VERSION: () => SAVE_FORMAT_VERSION,
64
- SPAWNFLAG_MONSTER_AMBUSH: () => SPAWNFLAG_MONSTER_AMBUSH,
65
- SV_NewChaseDir: () => SV_NewChaseDir,
66
- SV_StepDirection: () => SV_StepDirection,
67
- SaveStorage: () => SaveStorage,
68
- ServerFlags: () => ServerFlags,
69
- Solid: () => Solid,
70
- SpawnRegistry: () => SpawnRegistry,
71
- T_Damage: () => T_Damage,
72
- T_RadiusDamage: () => T_RadiusDamage,
73
- TraceMask: () => TraceMask,
74
- WEAPONS: () => WEAPONS,
75
- WEAPON_ITEMS: () => WEAPON_ITEMS,
76
- WeaponId: () => WeaponId,
77
- WeaponStateEnum: () => WeaponStateEnum,
78
- WeaponType: () => WeaponType,
79
- addAmmo: () => addAmmo,
80
- addKey: () => addKey,
81
- addPowerup: () => addPowerup,
82
- ai_charge: () => ai_charge,
83
- ai_face: () => ai_face,
84
- ai_move: () => ai_move,
85
- ai_run: () => ai_run,
86
- ai_stand: () => ai_stand,
87
- ai_turn: () => ai_turn,
88
- ai_walk: () => ai_walk,
89
- applyCrushDamage: () => applyCrushDamage,
90
- applyEntityKeyValues: () => applyEntityKeyValues,
91
- applyEnvironmentalDamage: () => applyEnvironmentalDamage,
92
- applyFallingDamage: () => applyFallingDamage,
93
- applyPowerArmor: () => applyPowerArmor,
94
- applyRegularArmor: () => applyRegularArmor,
95
- applySaveFile: () => applySaveFile,
96
- calculateFallingDamage: () => calculateFallingDamage,
97
- calculateSaveChecksum: () => calculateSaveChecksum,
98
- canPickupHealth: () => canPickupHealth,
99
- changeYaw: () => changeYaw,
100
- clampAmmoCounts: () => clampAmmoCounts,
101
- classifyRange: () => classifyRange,
102
- clearExpiredPowerups: () => clearExpiredPowerups,
103
- convertGameSaveToRereleaseLevel: () => convertGameSaveToRereleaseLevel,
104
- convertRereleaseLevelToGameSave: () => convertRereleaseLevelToGameSave,
105
- convertRereleaseSaveToGameSave: () => convertRereleaseSaveToGameSave,
106
- createAmmoInventory: () => createAmmoInventory,
107
- createAmmoPickupEntity: () => createAmmoPickupEntity,
108
- createArmorPickupEntity: () => createArmorPickupEntity,
109
- createBaseAmmoCaps: () => createBaseAmmoCaps,
110
- createCallbackRegistry: () => createCallbackRegistry,
111
- createDefaultSpawnRegistry: () => createDefaultSpawnRegistry,
112
- createGame: () => createGame,
113
- createHealthPickupEntity: () => createHealthPickupEntity,
114
- createKeyPickupEntity: () => createKeyPickupEntity,
115
- createPlayerInventory: () => createPlayerInventory,
116
- createPlayerWeaponStates: () => createPlayerWeaponStates,
117
- createPowerupPickupEntity: () => createPowerupPickupEntity,
118
- createSaveFile: () => createSaveFile,
119
- createWeaponPickupEntity: () => createWeaponPickupEntity,
120
- damageModName: () => damageModName,
121
- deserializePlayerInventory: () => deserializePlayerInventory,
122
- equipArmor: () => equipArmor,
123
- facingIdeal: () => facingIdeal,
124
- findTarget: () => findTarget,
125
- foundTarget: () => foundTarget,
126
- getAmmoItemDefinition: () => getAmmoItemDefinition,
127
- getWeaponState: () => getWeaponState,
128
- giveAmmoItem: () => giveAmmoItem,
129
- giveWeapon: () => giveWeapon,
130
- hasAnyDamageFlag: () => hasAnyDamageFlag,
131
- hasItem: () => hasItem,
132
- hasKey: () => hasKey,
133
- hasPowerup: () => hasPowerup,
134
- hasWeapon: () => hasWeapon,
135
- hashEntitySystem: () => hashEntitySystem,
136
- hashGameState: () => hashGameState,
137
- huntTarget: () => huntTarget,
138
- infront: () => infront,
139
- isZeroVector: () => isZeroVector,
140
- killBox: () => killBox,
141
- monster_think: () => monster_think,
142
- parseEntityLump: () => parseEntityLump,
143
- parseRereleaseSave: () => parseRereleaseSave,
144
- parseSaveFile: () => parseSaveFile,
145
- pickupAmmo: () => pickupAmmo,
146
- pickupArmor: () => pickupArmor,
147
- pickupKey: () => pickupKey,
148
- pickupPowerArmor: () => pickupPowerArmor,
149
- pickupPowerup: () => pickupPowerup,
150
- pickupWeapon: () => pickupWeapon,
151
- range: () => rangeTo,
152
- rangeTo: () => rangeTo,
153
- registerCallback: () => registerCallback,
154
- registerDefaultSpawns: () => registerDefaultSpawns,
155
- selectWeapon: () => selectWeapon,
156
- serializePlayerInventory: () => serializePlayerInventory,
157
- serializeRereleaseSave: () => serializeRereleaseSave,
158
- setMovedir: () => setMovedir,
159
- spawnEntitiesFromText: () => spawnEntitiesFromText,
160
- spawnEntityFromDictionary: () => spawnEntityFromDictionary,
161
- summarizeRereleaseSave: () => summarizeRereleaseSave,
162
- visible: () => visible,
163
- walkMove: () => walkMove
164
- });
165
- module.exports = __toCommonJS(index_exports);
166
-
167
23
  // ../shared/dist/esm/index.js
168
- var __defProp2 = Object.defineProperty;
169
- var __export2 = (target, all) => {
170
- for (var name in all)
171
- __defProp2(target, name, { get: all[name], enumerable: true });
172
- };
173
- var ZERO_VEC3 = { x: 0, y: 0, z: 0 };
174
- var STOP_EPSILON = 0.1;
175
- var DEG_TO_RAD = Math.PI / 180;
176
24
  function copyVec3(a) {
177
25
  return { x: a.x, y: a.y, z: a.z };
178
26
  }
@@ -319,11 +167,6 @@ function rotatePointAroundVector(dir, point, degrees) {
319
167
  z: rot[2][0] * point.x + rot[2][1] * point.y + rot[2][2] * point.z
320
168
  };
321
169
  }
322
- var PITCH = 0;
323
- var YAW = 1;
324
- var ROLL = 2;
325
- var DEG2RAD_FACTOR = Math.PI / 180;
326
- var RAD2DEG_FACTOR = 180 / Math.PI;
327
170
  function axisComponent(vec, axis) {
328
171
  switch (axis) {
329
172
  case PITCH:
@@ -409,247 +252,9 @@ function vectorToAngles(vec) {
409
252
  }
410
253
  return { x: -pitch, y: yaw, z: 0 };
411
254
  }
412
- var STATE_SIZE = 624;
413
- var MIDDLE_WORD = 397;
414
- var MATRIX_A = 2567483615;
415
- var UPPER_MASK = 2147483648;
416
- var LOWER_MASK = 2147483647;
417
- var TWO_POW_32 = 4294967296;
418
- var MersenneTwister19937 = class {
419
- constructor(seed = 5489) {
420
- this.state = new Uint32Array(STATE_SIZE);
421
- this.index = STATE_SIZE;
422
- this.seed(seed);
423
- }
424
- seed(seed) {
425
- this.state[0] = seed >>> 0;
426
- for (let i = 1; i < STATE_SIZE; i++) {
427
- const prev = this.state[i - 1] ^ this.state[i - 1] >>> 30;
428
- const next = Math.imul(prev >>> 0, 1812433253) + i;
429
- this.state[i] = next >>> 0;
430
- }
431
- this.index = STATE_SIZE;
432
- }
433
- nextUint32() {
434
- if (this.index >= STATE_SIZE) {
435
- this.twist();
436
- }
437
- let y = this.state[this.index++];
438
- y ^= y >>> 11;
439
- y ^= y << 7 & 2636928640;
440
- y ^= y << 15 & 4022730752;
441
- y ^= y >>> 18;
442
- return y >>> 0;
443
- }
444
- twist() {
445
- for (let i = 0; i < STATE_SIZE; i++) {
446
- const y = this.state[i] & UPPER_MASK | this.state[(i + 1) % STATE_SIZE] & LOWER_MASK;
447
- let next = this.state[(i + MIDDLE_WORD) % STATE_SIZE] ^ y >>> 1;
448
- if ((y & 1) !== 0) {
449
- next ^= MATRIX_A;
450
- }
451
- this.state[i] = next >>> 0;
452
- }
453
- this.index = 0;
454
- }
455
- getState() {
456
- return {
457
- index: this.index,
458
- state: Array.from(this.state)
459
- };
460
- }
461
- setState(snapshot) {
462
- if (snapshot.state.length !== STATE_SIZE) {
463
- throw new Error(`Expected ${STATE_SIZE} MT state values, received ${snapshot.state.length}`);
464
- }
465
- this.index = snapshot.index;
466
- this.state = Uint32Array.from(snapshot.state, (value) => value >>> 0);
467
- }
468
- };
469
- var RandomGenerator = class {
470
- constructor(options = {}) {
471
- this.mt = new MersenneTwister19937(options.seed);
472
- }
473
- seed(seed) {
474
- this.mt.seed(seed);
475
- }
476
- /** Uniform float in [0, 1). */
477
- frandom() {
478
- return this.mt.nextUint32() / TWO_POW_32;
479
- }
480
- /** Uniform float in [min, max). */
481
- frandomRange(minInclusive, maxExclusive) {
482
- return minInclusive + (maxExclusive - minInclusive) * this.frandom();
483
- }
484
- /** Uniform float in [0, max). */
485
- frandomMax(maxExclusive) {
486
- return this.frandomRange(0, maxExclusive);
487
- }
488
- /** Uniform float in [-1, 1). */
489
- crandom() {
490
- return this.frandomRange(-1, 1);
491
- }
492
- /** Uniform float in (-1, 1). */
493
- crandomOpen() {
494
- const epsilon = Number.EPSILON;
495
- return this.frandomRange(-1 + epsilon, 1);
496
- }
497
- /** Raw uint32 sample. */
498
- irandomUint32() {
499
- return this.mt.nextUint32();
500
- }
501
- /** Uniform integer in [min, max). */
502
- irandomRange(minInclusive, maxExclusive) {
503
- if (maxExclusive - minInclusive <= 1) {
504
- return minInclusive;
505
- }
506
- const span = maxExclusive - minInclusive;
507
- const limit = TWO_POW_32 - TWO_POW_32 % span;
508
- let sample;
509
- do {
510
- sample = this.mt.nextUint32();
511
- } while (sample >= limit);
512
- return minInclusive + sample % span;
513
- }
514
- /** Uniform integer in [0, max). */
515
- irandom(maxExclusive) {
516
- if (maxExclusive <= 0) {
517
- return 0;
518
- }
519
- return this.irandomRange(0, maxExclusive);
520
- }
521
- /** Uniform time in milliseconds [min, max). */
522
- randomTimeRange(minMs, maxMs) {
523
- if (maxMs <= minMs) {
524
- return minMs;
525
- }
526
- return this.irandomRange(minMs, maxMs);
527
- }
528
- /** Uniform time in milliseconds [0, max). */
529
- randomTime(maxMs) {
530
- return this.irandom(maxMs);
531
- }
532
- randomIndex(container) {
533
- return this.irandom(container.length);
534
- }
535
- getState() {
536
- return { mt: this.mt.getState() };
537
- }
538
- setState(snapshot) {
539
- this.mt.setState(snapshot.mt);
540
- }
541
- };
542
255
  function createRandomGenerator(options) {
543
256
  return new RandomGenerator(options);
544
257
  }
545
- var CONTENTS_SOLID = 1 << 0;
546
- var CONTENTS_WINDOW = 1 << 1;
547
- var CONTENTS_AUX = 1 << 2;
548
- var CONTENTS_LAVA = 1 << 3;
549
- var CONTENTS_SLIME = 1 << 4;
550
- var CONTENTS_WATER = 1 << 5;
551
- var CONTENTS_MIST = 1 << 6;
552
- var CONTENTS_NO_WATERJUMP = 1 << 13;
553
- var CONTENTS_PROJECTILECLIP = 1 << 14;
554
- var CONTENTS_AREAPORTAL = 1 << 15;
555
- var CONTENTS_PLAYERCLIP = 1 << 16;
556
- var CONTENTS_MONSTERCLIP = 1 << 17;
557
- var CONTENTS_CURRENT_0 = 1 << 18;
558
- var CONTENTS_CURRENT_90 = 1 << 19;
559
- var CONTENTS_CURRENT_180 = 1 << 20;
560
- var CONTENTS_CURRENT_270 = 1 << 21;
561
- var CONTENTS_CURRENT_UP = 1 << 22;
562
- var CONTENTS_CURRENT_DOWN = 1 << 23;
563
- var CONTENTS_ORIGIN = 1 << 24;
564
- var CONTENTS_MONSTER = 1 << 25;
565
- var CONTENTS_DEADMONSTER = 1 << 26;
566
- var CONTENTS_DETAIL = 1 << 27;
567
- var CONTENTS_TRANSLUCENT = 1 << 28;
568
- var CONTENTS_LADDER = 1 << 29;
569
- var CONTENTS_PLAYER = 1 << 30;
570
- var CONTENTS_PROJECTILE = 1 << 31;
571
- var SURF_LIGHT = 1 << 0;
572
- var SURF_SLICK = 1 << 1;
573
- var SURF_SKY = 1 << 2;
574
- var SURF_WARP = 1 << 3;
575
- var SURF_TRANS33 = 1 << 4;
576
- var SURF_TRANS66 = 1 << 5;
577
- var SURF_FLOWING = 1 << 6;
578
- var SURF_NODRAW = 1 << 7;
579
- var SURF_ALPHATEST = 1 << 25;
580
- var SURF_N64_UV = 1 << 28;
581
- var SURF_N64_SCROLL_X = 1 << 29;
582
- var SURF_N64_SCROLL_Y = 1 << 30;
583
- var SURF_N64_SCROLL_FLIP = 1 << 31;
584
- var MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
585
- var MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
586
- var MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
587
- var MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
588
- var MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
589
- var MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
590
- var MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
591
- var MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
592
- var MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
593
- var MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
594
- var MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
595
- var MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
596
- var MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
597
- var MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;
598
- var CvarFlags = /* @__PURE__ */ ((CvarFlags2) => {
599
- CvarFlags2[CvarFlags2["None"] = 0] = "None";
600
- CvarFlags2[CvarFlags2["Archive"] = 1] = "Archive";
601
- CvarFlags2[CvarFlags2["UserInfo"] = 2] = "UserInfo";
602
- CvarFlags2[CvarFlags2["ServerInfo"] = 4] = "ServerInfo";
603
- CvarFlags2[CvarFlags2["Latch"] = 8] = "Latch";
604
- CvarFlags2[CvarFlags2["Cheat"] = 16] = "Cheat";
605
- return CvarFlags2;
606
- })(CvarFlags || {});
607
- var MAX_CLIENTS = 256;
608
- var MAX_LIGHTSTYLES = 256;
609
- var MAX_MODELS = 8192;
610
- var MAX_SOUNDS = 2048;
611
- var MAX_IMAGES = 512;
612
- var MAX_ITEMS = 256;
613
- var MAX_GENERAL = MAX_CLIENTS * 2;
614
- var MAX_SHADOW_LIGHTS = 256;
615
- var MAX_WHEEL_ITEMS = 32;
616
- var ConfigStringIndex = ((ConfigStringIndex2) => {
617
- ConfigStringIndex2[ConfigStringIndex2["Name"] = 0] = "Name";
618
- ConfigStringIndex2[ConfigStringIndex2["CdTrack"] = 1] = "CdTrack";
619
- ConfigStringIndex2[ConfigStringIndex2["Sky"] = 2] = "Sky";
620
- ConfigStringIndex2[ConfigStringIndex2["SkyAxis"] = 3] = "SkyAxis";
621
- ConfigStringIndex2[ConfigStringIndex2["SkyRotate"] = 4] = "SkyRotate";
622
- ConfigStringIndex2[ConfigStringIndex2["StatusBar"] = 5] = "StatusBar";
623
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_N64_PHYSICS"] = 56] = "CONFIG_N64_PHYSICS";
624
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_CTF_TEAMS"] = 57] = "CONFIG_CTF_TEAMS";
625
- ConfigStringIndex2[ConfigStringIndex2["CONFIG_COOP_RESPAWN_STRING"] = 58] = "CONFIG_COOP_RESPAWN_STRING";
626
- ConfigStringIndex2[ConfigStringIndex2["AirAccel"] = 59] = "AirAccel";
627
- ConfigStringIndex2[ConfigStringIndex2["MaxClients"] = 60] = "MaxClients";
628
- ConfigStringIndex2[ConfigStringIndex2["MapChecksum"] = 61] = "MapChecksum";
629
- ConfigStringIndex2[ConfigStringIndex2["Models"] = 62] = "Models";
630
- ConfigStringIndex2[ConfigStringIndex2["Sounds"] = 62 + MAX_MODELS] = "Sounds";
631
- ConfigStringIndex2[ConfigStringIndex2["Images"] = ConfigStringIndex2.Sounds + MAX_SOUNDS] = "Images";
632
- ConfigStringIndex2[ConfigStringIndex2["Lights"] = ConfigStringIndex2.Images + MAX_IMAGES] = "Lights";
633
- ConfigStringIndex2[ConfigStringIndex2["ShadowLights"] = ConfigStringIndex2.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
634
- ConfigStringIndex2[ConfigStringIndex2["Items"] = ConfigStringIndex2.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
635
- ConfigStringIndex2[ConfigStringIndex2["PlayerSkins"] = ConfigStringIndex2.Items + MAX_ITEMS] = "PlayerSkins";
636
- ConfigStringIndex2[ConfigStringIndex2["General"] = ConfigStringIndex2.PlayerSkins + MAX_CLIENTS] = "General";
637
- ConfigStringIndex2[ConfigStringIndex2["WheelWeapons"] = ConfigStringIndex2.General + MAX_GENERAL] = "WheelWeapons";
638
- ConfigStringIndex2[ConfigStringIndex2["WheelAmmo"] = ConfigStringIndex2.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
639
- ConfigStringIndex2[ConfigStringIndex2["WheelPowerups"] = ConfigStringIndex2.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
640
- ConfigStringIndex2[ConfigStringIndex2["CdLoopCount"] = ConfigStringIndex2.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
641
- ConfigStringIndex2[ConfigStringIndex2["GameStyle"] = ConfigStringIndex2.CdLoopCount + 1] = "GameStyle";
642
- ConfigStringIndex2[ConfigStringIndex2["MaxConfigStrings"] = ConfigStringIndex2.GameStyle + 1] = "MaxConfigStrings";
643
- return ConfigStringIndex2;
644
- })(ConfigStringIndex || {});
645
- var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
646
- var replay_exports = {};
647
- __export2(replay_exports, {
648
- addReplayFrame: () => addReplayFrame,
649
- createReplaySession: () => createReplaySession,
650
- deserializeReplay: () => deserializeReplay,
651
- serializeReplay: () => serializeReplay
652
- });
653
258
  function serializeReplay(session) {
654
259
  return JSON.stringify(session, null, 2);
655
260
  }
@@ -678,13 +283,6 @@ function addReplayFrame(session, cmd, serverFrame, startTime) {
678
283
  timestamp: Date.now() - startTime
679
284
  });
680
285
  }
681
- var WaterLevel = /* @__PURE__ */ ((WaterLevel4) => {
682
- WaterLevel4[WaterLevel4["None"] = 0] = "None";
683
- WaterLevel4[WaterLevel4["Feet"] = 1] = "Feet";
684
- WaterLevel4[WaterLevel4["Waist"] = 2] = "Waist";
685
- WaterLevel4[WaterLevel4["Under"] = 3] = "Under";
686
- return WaterLevel4;
687
- })(WaterLevel || {});
688
286
  function applyPmoveFriction(params) {
689
287
  const {
690
288
  velocity,
@@ -783,111 +381,6 @@ function buildWaterWish(params) {
783
381
  wishspeed
784
382
  };
785
383
  }
786
- var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
787
- var ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
788
- ServerCommand22[ServerCommand22["bad"] = 0] = "bad";
789
- ServerCommand22[ServerCommand22["muzzleflash"] = 1] = "muzzleflash";
790
- ServerCommand22[ServerCommand22["muzzleflash2"] = 2] = "muzzleflash2";
791
- ServerCommand22[ServerCommand22["temp_entity"] = 3] = "temp_entity";
792
- ServerCommand22[ServerCommand22["layout"] = 4] = "layout";
793
- ServerCommand22[ServerCommand22["inventory"] = 5] = "inventory";
794
- ServerCommand22[ServerCommand22["nop"] = 6] = "nop";
795
- ServerCommand22[ServerCommand22["disconnect"] = 7] = "disconnect";
796
- ServerCommand22[ServerCommand22["reconnect"] = 8] = "reconnect";
797
- ServerCommand22[ServerCommand22["sound"] = 9] = "sound";
798
- ServerCommand22[ServerCommand22["print"] = 10] = "print";
799
- ServerCommand22[ServerCommand22["stufftext"] = 11] = "stufftext";
800
- ServerCommand22[ServerCommand22["serverdata"] = 12] = "serverdata";
801
- ServerCommand22[ServerCommand22["configstring"] = 13] = "configstring";
802
- ServerCommand22[ServerCommand22["spawnbaseline"] = 14] = "spawnbaseline";
803
- ServerCommand22[ServerCommand22["centerprint"] = 15] = "centerprint";
804
- ServerCommand22[ServerCommand22["download"] = 16] = "download";
805
- ServerCommand22[ServerCommand22["playerinfo"] = 17] = "playerinfo";
806
- ServerCommand22[ServerCommand22["packetentities"] = 18] = "packetentities";
807
- ServerCommand22[ServerCommand22["deltapacketentities"] = 19] = "deltapacketentities";
808
- ServerCommand22[ServerCommand22["frame"] = 20] = "frame";
809
- ServerCommand22[ServerCommand22["splitclient"] = 21] = "splitclient";
810
- ServerCommand22[ServerCommand22["configblast"] = 22] = "configblast";
811
- ServerCommand22[ServerCommand22["spawnbaselineblast"] = 23] = "spawnbaselineblast";
812
- ServerCommand22[ServerCommand22["level_restart"] = 24] = "level_restart";
813
- ServerCommand22[ServerCommand22["damage"] = 25] = "damage";
814
- ServerCommand22[ServerCommand22["locprint"] = 26] = "locprint";
815
- ServerCommand22[ServerCommand22["fog"] = 27] = "fog";
816
- ServerCommand22[ServerCommand22["waitingforplayers"] = 28] = "waitingforplayers";
817
- ServerCommand22[ServerCommand22["bot_chat"] = 29] = "bot_chat";
818
- ServerCommand22[ServerCommand22["poi"] = 30] = "poi";
819
- ServerCommand22[ServerCommand22["help_path"] = 31] = "help_path";
820
- ServerCommand22[ServerCommand22["muzzleflash3"] = 32] = "muzzleflash3";
821
- ServerCommand22[ServerCommand22["achievement"] = 33] = "achievement";
822
- return ServerCommand22;
823
- })(ServerCommand || {});
824
- var TempEntity = /* @__PURE__ */ ((TempEntity2) => {
825
- TempEntity2[TempEntity2["GUNSHOT"] = 0] = "GUNSHOT";
826
- TempEntity2[TempEntity2["BLOOD"] = 1] = "BLOOD";
827
- TempEntity2[TempEntity2["BLASTER"] = 2] = "BLASTER";
828
- TempEntity2[TempEntity2["RAILTRAIL"] = 3] = "RAILTRAIL";
829
- TempEntity2[TempEntity2["SHOTGUN"] = 4] = "SHOTGUN";
830
- TempEntity2[TempEntity2["EXPLOSION1"] = 5] = "EXPLOSION1";
831
- TempEntity2[TempEntity2["EXPLOSION2"] = 6] = "EXPLOSION2";
832
- TempEntity2[TempEntity2["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
833
- TempEntity2[TempEntity2["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
834
- TempEntity2[TempEntity2["SPARKS"] = 9] = "SPARKS";
835
- TempEntity2[TempEntity2["SPLASH"] = 10] = "SPLASH";
836
- TempEntity2[TempEntity2["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
837
- TempEntity2[TempEntity2["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
838
- TempEntity2[TempEntity2["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
839
- TempEntity2[TempEntity2["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
840
- TempEntity2[TempEntity2["LASER_SPARKS"] = 15] = "LASER_SPARKS";
841
- TempEntity2[TempEntity2["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
842
- TempEntity2[TempEntity2["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
843
- TempEntity2[TempEntity2["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
844
- TempEntity2[TempEntity2["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
845
- TempEntity2[TempEntity2["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
846
- TempEntity2[TempEntity2["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
847
- TempEntity2[TempEntity2["BOSSTPORT"] = 22] = "BOSSTPORT";
848
- TempEntity2[TempEntity2["BFG_LASER"] = 23] = "BFG_LASER";
849
- TempEntity2[TempEntity2["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
850
- TempEntity2[TempEntity2["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
851
- TempEntity2[TempEntity2["GREENBLOOD"] = 26] = "GREENBLOOD";
852
- TempEntity2[TempEntity2["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
853
- TempEntity2[TempEntity2["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
854
- TempEntity2[TempEntity2["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
855
- TempEntity2[TempEntity2["BLASTER2"] = 30] = "BLASTER2";
856
- TempEntity2[TempEntity2["RAILTRAIL2"] = 31] = "RAILTRAIL2";
857
- TempEntity2[TempEntity2["FLAME"] = 32] = "FLAME";
858
- TempEntity2[TempEntity2["LIGHTNING"] = 33] = "LIGHTNING";
859
- TempEntity2[TempEntity2["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
860
- TempEntity2[TempEntity2["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
861
- TempEntity2[TempEntity2["FLASHLIGHT"] = 36] = "FLASHLIGHT";
862
- TempEntity2[TempEntity2["FORCEWALL"] = 37] = "FORCEWALL";
863
- TempEntity2[TempEntity2["HEATBEAM"] = 38] = "HEATBEAM";
864
- TempEntity2[TempEntity2["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
865
- TempEntity2[TempEntity2["STEAM"] = 40] = "STEAM";
866
- TempEntity2[TempEntity2["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
867
- TempEntity2[TempEntity2["MOREBLOOD"] = 42] = "MOREBLOOD";
868
- TempEntity2[TempEntity2["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
869
- TempEntity2[TempEntity2["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
870
- TempEntity2[TempEntity2["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
871
- TempEntity2[TempEntity2["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
872
- TempEntity2[TempEntity2["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
873
- TempEntity2[TempEntity2["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
874
- TempEntity2[TempEntity2["DBALL_GOAL"] = 49] = "DBALL_GOAL";
875
- TempEntity2[TempEntity2["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
876
- TempEntity2[TempEntity2["NUKEBLAST"] = 51] = "NUKEBLAST";
877
- TempEntity2[TempEntity2["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
878
- TempEntity2[TempEntity2["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
879
- TempEntity2[TempEntity2["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
880
- TempEntity2[TempEntity2["FLECHETTE"] = 55] = "FLECHETTE";
881
- TempEntity2[TempEntity2["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
882
- TempEntity2[TempEntity2["BFG_ZAP"] = 57] = "BFG_ZAP";
883
- TempEntity2[TempEntity2["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
884
- TempEntity2[TempEntity2["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
885
- TempEntity2[TempEntity2["POWER_SPLASH"] = 60] = "POWER_SPLASH";
886
- TempEntity2[TempEntity2["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
887
- TempEntity2[TempEntity2["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
888
- TempEntity2[TempEntity2["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
889
- return TempEntity2;
890
- })(TempEntity || {});
891
384
  function toSigned16(val) {
892
385
  return val << 16 >> 16;
893
386
  }
@@ -933,191 +426,6 @@ function setCompressedInteger(stats, startIndex, id, count, bitsPerValue) {
933
426
  const valueToWrite = base & ~mask | count << bitShift & mask;
934
427
  writeUint16LE(stats, startIndex, byteOffset, valueToWrite & 65535);
935
428
  }
936
- var PowerupId = /* @__PURE__ */ ((PowerupId22) => {
937
- PowerupId22["QuadDamage"] = "quad";
938
- PowerupId22["Invulnerability"] = "invulnerability";
939
- PowerupId22["EnviroSuit"] = "enviro_suit";
940
- PowerupId22["Rebreather"] = "rebreather";
941
- PowerupId22["Silencer"] = "silencer";
942
- PowerupId22["PowerScreen"] = "power_screen";
943
- PowerupId22["PowerShield"] = "power_shield";
944
- PowerupId22["QuadFire"] = "quad_fire";
945
- PowerupId22["Invisibility"] = "invisibility";
946
- PowerupId22["Bandolier"] = "bandolier";
947
- PowerupId22["AmmoPack"] = "ammo_pack";
948
- PowerupId22["IRGoggles"] = "ir_goggles";
949
- PowerupId22["DoubleDamage"] = "double_damage";
950
- PowerupId22["SphereVengeance"] = "sphere_vengeance";
951
- PowerupId22["SphereHunter"] = "sphere_hunter";
952
- PowerupId22["SphereDefender"] = "sphere_defender";
953
- PowerupId22["Doppelganger"] = "doppelganger";
954
- PowerupId22["TagToken"] = "tag_token";
955
- PowerupId22["TechResistance"] = "tech_resistance";
956
- PowerupId22["TechStrength"] = "tech_strength";
957
- PowerupId22["TechHaste"] = "tech_haste";
958
- PowerupId22["TechRegeneration"] = "tech_regeneration";
959
- PowerupId22["Flashlight"] = "flashlight";
960
- PowerupId22["Compass"] = "compass";
961
- return PowerupId22;
962
- })(PowerupId || {});
963
- var PlayerStat = /* @__PURE__ */ ((PlayerStat2) => {
964
- PlayerStat2[PlayerStat2["STAT_HEALTH_ICON"] = 0] = "STAT_HEALTH_ICON";
965
- PlayerStat2[PlayerStat2["STAT_HEALTH"] = 1] = "STAT_HEALTH";
966
- PlayerStat2[PlayerStat2["STAT_AMMO_ICON"] = 2] = "STAT_AMMO_ICON";
967
- PlayerStat2[PlayerStat2["STAT_AMMO"] = 3] = "STAT_AMMO";
968
- PlayerStat2[PlayerStat2["STAT_ARMOR_ICON"] = 4] = "STAT_ARMOR_ICON";
969
- PlayerStat2[PlayerStat2["STAT_ARMOR"] = 5] = "STAT_ARMOR";
970
- PlayerStat2[PlayerStat2["STAT_SELECTED_ICON"] = 6] = "STAT_SELECTED_ICON";
971
- PlayerStat2[PlayerStat2["STAT_PICKUP_ICON"] = 7] = "STAT_PICKUP_ICON";
972
- PlayerStat2[PlayerStat2["STAT_PICKUP_STRING"] = 8] = "STAT_PICKUP_STRING";
973
- PlayerStat2[PlayerStat2["STAT_TIMER_ICON"] = 9] = "STAT_TIMER_ICON";
974
- PlayerStat2[PlayerStat2["STAT_TIMER"] = 10] = "STAT_TIMER";
975
- PlayerStat2[PlayerStat2["STAT_HELPICON"] = 11] = "STAT_HELPICON";
976
- PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM"] = 12] = "STAT_SELECTED_ITEM";
977
- PlayerStat2[PlayerStat2["STAT_LAYOUTS"] = 13] = "STAT_LAYOUTS";
978
- PlayerStat2[PlayerStat2["STAT_FRAGS"] = 14] = "STAT_FRAGS";
979
- PlayerStat2[PlayerStat2["STAT_FLASHES"] = 15] = "STAT_FLASHES";
980
- PlayerStat2[PlayerStat2["STAT_CHASE"] = 16] = "STAT_CHASE";
981
- PlayerStat2[PlayerStat2["STAT_SPECTATOR"] = 17] = "STAT_SPECTATOR";
982
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_PIC"] = 18] = "STAT_CTF_TEAM1_PIC";
983
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_CAPS"] = 19] = "STAT_CTF_TEAM1_CAPS";
984
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_PIC"] = 20] = "STAT_CTF_TEAM2_PIC";
985
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_CAPS"] = 21] = "STAT_CTF_TEAM2_CAPS";
986
- PlayerStat2[PlayerStat2["STAT_CTF_FLAG_PIC"] = 22] = "STAT_CTF_FLAG_PIC";
987
- PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM1_PIC"] = 23] = "STAT_CTF_JOINED_TEAM1_PIC";
988
- PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM2_PIC"] = 24] = "STAT_CTF_JOINED_TEAM2_PIC";
989
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_HEADER"] = 25] = "STAT_CTF_TEAM1_HEADER";
990
- PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_HEADER"] = 26] = "STAT_CTF_TEAM2_HEADER";
991
- PlayerStat2[PlayerStat2["STAT_CTF_TECH"] = 27] = "STAT_CTF_TECH";
992
- PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW"] = 28] = "STAT_CTF_ID_VIEW";
993
- PlayerStat2[PlayerStat2["STAT_CTF_MATCH"] = 29] = "STAT_CTF_MATCH";
994
- PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW_COLOR"] = 30] = "STAT_CTF_ID_VIEW_COLOR";
995
- PlayerStat2[PlayerStat2["STAT_CTF_TEAMINFO"] = 31] = "STAT_CTF_TEAMINFO";
996
- PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_1"] = 32] = "STAT_WEAPONS_OWNED_1";
997
- PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_2"] = 33] = "STAT_WEAPONS_OWNED_2";
998
- PlayerStat2[PlayerStat2["STAT_AMMO_INFO_START"] = 34] = "STAT_AMMO_INFO_START";
999
- PlayerStat2[PlayerStat2["STAT_POWERUP_INFO_START"] = 41] = "STAT_POWERUP_INFO_START";
1000
- PlayerStat2[PlayerStat2["STAT_KEY_A"] = 44] = "STAT_KEY_A";
1001
- PlayerStat2[PlayerStat2["STAT_KEY_B"] = 45] = "STAT_KEY_B";
1002
- PlayerStat2[PlayerStat2["STAT_KEY_C"] = 46] = "STAT_KEY_C";
1003
- PlayerStat2[PlayerStat2["STAT_ACTIVE_WHEEL_WEAPON"] = 47] = "STAT_ACTIVE_WHEEL_WEAPON";
1004
- PlayerStat2[PlayerStat2["STAT_COOP_RESPAWN"] = 48] = "STAT_COOP_RESPAWN";
1005
- PlayerStat2[PlayerStat2["STAT_LIVES"] = 49] = "STAT_LIVES";
1006
- PlayerStat2[PlayerStat2["STAT_HIT_MARKER"] = 50] = "STAT_HIT_MARKER";
1007
- PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM_NAME"] = 51] = "STAT_SELECTED_ITEM_NAME";
1008
- PlayerStat2[PlayerStat2["STAT_HEALTH_BARS"] = 52] = "STAT_HEALTH_BARS";
1009
- PlayerStat2[PlayerStat2["STAT_ACTIVE_WEAPON"] = 53] = "STAT_ACTIVE_WEAPON";
1010
- PlayerStat2[PlayerStat2["STAT_LAST"] = 54] = "STAT_LAST";
1011
- return PlayerStat2;
1012
- })(PlayerStat || {});
1013
- var AMMO_MAX = 12;
1014
- var NUM_BITS_FOR_AMMO = 9;
1015
- var NUM_AMMO_STATS = Math.ceil(AMMO_MAX * NUM_BITS_FOR_AMMO / 16);
1016
- var POWERUP_MAX = 23;
1017
- var NUM_BITS_FOR_POWERUP = 2;
1018
- var NUM_POWERUP_STATS = Math.ceil(POWERUP_MAX * NUM_BITS_FOR_POWERUP / 16);
1019
- var POWERUP_STAT_MAP = {
1020
- [
1021
- "power_screen"
1022
- /* PowerScreen */
1023
- ]: 0,
1024
- [
1025
- "power_shield"
1026
- /* PowerShield */
1027
- ]: 1,
1028
- // 2 is POWERUP_AM_BOMB (not in PowerupId?)
1029
- [
1030
- "quad"
1031
- /* QuadDamage */
1032
- ]: 3,
1033
- [
1034
- "quad_fire"
1035
- /* QuadFire */
1036
- ]: 4,
1037
- [
1038
- "invulnerability"
1039
- /* Invulnerability */
1040
- ]: 5,
1041
- [
1042
- "invisibility"
1043
- /* Invisibility */
1044
- ]: 6,
1045
- [
1046
- "silencer"
1047
- /* Silencer */
1048
- ]: 7,
1049
- [
1050
- "rebreather"
1051
- /* Rebreather */
1052
- ]: 8,
1053
- [
1054
- "enviro_suit"
1055
- /* EnviroSuit */
1056
- ]: 9,
1057
- [
1058
- "bandolier"
1059
- /* Bandolier */
1060
- ]: 10,
1061
- // Placeholder/Map mismatch handling?
1062
- [
1063
- "ammo_pack"
1064
- /* AmmoPack */
1065
- ]: 10,
1066
- // Original reused indices or had gaps?
1067
- [
1068
- "ir_goggles"
1069
- /* IRGoggles */
1070
- ]: 11,
1071
- [
1072
- "double_damage"
1073
- /* DoubleDamage */
1074
- ]: 12,
1075
- [
1076
- "sphere_vengeance"
1077
- /* SphereVengeance */
1078
- ]: 13,
1079
- [
1080
- "sphere_hunter"
1081
- /* SphereHunter */
1082
- ]: 14,
1083
- [
1084
- "sphere_defender"
1085
- /* SphereDefender */
1086
- ]: 15,
1087
- [
1088
- "doppelganger"
1089
- /* Doppelganger */
1090
- ]: 16,
1091
- [
1092
- "flashlight"
1093
- /* Flashlight */
1094
- ]: 17,
1095
- [
1096
- "compass"
1097
- /* Compass */
1098
- ]: 18,
1099
- [
1100
- "tech_resistance"
1101
- /* TechResistance */
1102
- ]: 19,
1103
- [
1104
- "tech_strength"
1105
- /* TechStrength */
1106
- ]: 20,
1107
- [
1108
- "tech_haste"
1109
- /* TechHaste */
1110
- ]: 21,
1111
- [
1112
- "tech_regeneration"
1113
- /* TechRegeneration */
1114
- ]: 22,
1115
- // Add missing mappings to avoid runtime lookups failing for new types
1116
- [
1117
- "tag_token"
1118
- /* TagToken */
1119
- ]: -1
1120
- };
1121
429
  function G_SetAmmoStat(stats, ammoId, count) {
1122
430
  if (ammoId < 0 || ammoId >= AMMO_MAX) return;
1123
431
  let val = count;
@@ -1138,228 +446,800 @@ function G_SetPowerupStat(stats, powerupId, val) {
1138
446
  if (safeVal < 0) safeVal = 0;
1139
447
  setCompressedInteger(stats, 41, index, safeVal, NUM_BITS_FOR_POWERUP);
1140
448
  }
1141
- var entityFlags_exports = {};
1142
- __export2(entityFlags_exports, {
1143
- U_ANGLE1: () => U_ANGLE1,
1144
- U_ANGLE2: () => U_ANGLE2,
1145
- U_ANGLE3: () => U_ANGLE3,
1146
- U_EFFECTS: () => U_EFFECTS,
1147
- U_EVENT: () => U_EVENT,
1148
- U_FRAME: () => U_FRAME,
1149
- U_MODEL: () => U_MODEL,
1150
- U_MODEL2: () => U_MODEL2,
1151
- U_MODEL3: () => U_MODEL3,
1152
- U_MODEL4: () => U_MODEL4,
1153
- U_MOREBITS: () => U_MOREBITS,
1154
- U_NUMBER: () => U_NUMBER,
1155
- U_ORIGIN1: () => U_ORIGIN1,
1156
- U_ORIGIN2: () => U_ORIGIN2,
1157
- U_ORIGIN3: () => U_ORIGIN3,
1158
- U_REMOVE: () => U_REMOVE,
1159
- U_RENDERFX: () => U_RENDERFX,
1160
- U_SKIN: () => U_SKIN,
1161
- U_SOLID: () => U_SOLID,
1162
- U_SOUND: () => U_SOUND
449
+ 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;
450
+ var init_esm = __esm({
451
+ "../shared/dist/esm/index.js"() {
452
+ "use strict";
453
+ __defProp2 = Object.defineProperty;
454
+ __export2 = (target, all) => {
455
+ for (var name in all)
456
+ __defProp2(target, name, { get: all[name], enumerable: true });
457
+ };
458
+ ZERO_VEC3 = { x: 0, y: 0, z: 0 };
459
+ STOP_EPSILON = 0.1;
460
+ DEG_TO_RAD = Math.PI / 180;
461
+ PITCH = 0;
462
+ YAW = 1;
463
+ ROLL = 2;
464
+ DEG2RAD_FACTOR = Math.PI / 180;
465
+ RAD2DEG_FACTOR = 180 / Math.PI;
466
+ STATE_SIZE = 624;
467
+ MIDDLE_WORD = 397;
468
+ MATRIX_A = 2567483615;
469
+ UPPER_MASK = 2147483648;
470
+ LOWER_MASK = 2147483647;
471
+ TWO_POW_32 = 4294967296;
472
+ MersenneTwister19937 = class {
473
+ constructor(seed = 5489) {
474
+ this.state = new Uint32Array(STATE_SIZE);
475
+ this.index = STATE_SIZE;
476
+ this.seed(seed);
477
+ }
478
+ seed(seed) {
479
+ this.state[0] = seed >>> 0;
480
+ for (let i = 1; i < STATE_SIZE; i++) {
481
+ const prev = this.state[i - 1] ^ this.state[i - 1] >>> 30;
482
+ const next = Math.imul(prev >>> 0, 1812433253) + i;
483
+ this.state[i] = next >>> 0;
484
+ }
485
+ this.index = STATE_SIZE;
486
+ }
487
+ nextUint32() {
488
+ if (this.index >= STATE_SIZE) {
489
+ this.twist();
490
+ }
491
+ let y = this.state[this.index++];
492
+ y ^= y >>> 11;
493
+ y ^= y << 7 & 2636928640;
494
+ y ^= y << 15 & 4022730752;
495
+ y ^= y >>> 18;
496
+ return y >>> 0;
497
+ }
498
+ twist() {
499
+ for (let i = 0; i < STATE_SIZE; i++) {
500
+ const y = this.state[i] & UPPER_MASK | this.state[(i + 1) % STATE_SIZE] & LOWER_MASK;
501
+ let next = this.state[(i + MIDDLE_WORD) % STATE_SIZE] ^ y >>> 1;
502
+ if ((y & 1) !== 0) {
503
+ next ^= MATRIX_A;
504
+ }
505
+ this.state[i] = next >>> 0;
506
+ }
507
+ this.index = 0;
508
+ }
509
+ getState() {
510
+ return {
511
+ index: this.index,
512
+ state: Array.from(this.state)
513
+ };
514
+ }
515
+ setState(snapshot) {
516
+ if (snapshot.state.length !== STATE_SIZE) {
517
+ throw new Error(`Expected ${STATE_SIZE} MT state values, received ${snapshot.state.length}`);
518
+ }
519
+ this.index = snapshot.index;
520
+ this.state = Uint32Array.from(snapshot.state, (value) => value >>> 0);
521
+ }
522
+ };
523
+ RandomGenerator = class {
524
+ constructor(options = {}) {
525
+ this.mt = new MersenneTwister19937(options.seed);
526
+ }
527
+ seed(seed) {
528
+ this.mt.seed(seed);
529
+ }
530
+ /** Uniform float in [0, 1). */
531
+ frandom() {
532
+ return this.mt.nextUint32() / TWO_POW_32;
533
+ }
534
+ /** Uniform float in [min, max). */
535
+ frandomRange(minInclusive, maxExclusive) {
536
+ return minInclusive + (maxExclusive - minInclusive) * this.frandom();
537
+ }
538
+ /** Uniform float in [0, max). */
539
+ frandomMax(maxExclusive) {
540
+ return this.frandomRange(0, maxExclusive);
541
+ }
542
+ /** Uniform float in [-1, 1). */
543
+ crandom() {
544
+ return this.frandomRange(-1, 1);
545
+ }
546
+ /** Uniform float in (-1, 1). */
547
+ crandomOpen() {
548
+ const epsilon = Number.EPSILON;
549
+ return this.frandomRange(-1 + epsilon, 1);
550
+ }
551
+ /** Raw uint32 sample. */
552
+ irandomUint32() {
553
+ return this.mt.nextUint32();
554
+ }
555
+ /** Uniform integer in [min, max). */
556
+ irandomRange(minInclusive, maxExclusive) {
557
+ if (maxExclusive - minInclusive <= 1) {
558
+ return minInclusive;
559
+ }
560
+ const span = maxExclusive - minInclusive;
561
+ const limit = TWO_POW_32 - TWO_POW_32 % span;
562
+ let sample;
563
+ do {
564
+ sample = this.mt.nextUint32();
565
+ } while (sample >= limit);
566
+ return minInclusive + sample % span;
567
+ }
568
+ /** Uniform integer in [0, max). */
569
+ irandom(maxExclusive) {
570
+ if (maxExclusive <= 0) {
571
+ return 0;
572
+ }
573
+ return this.irandomRange(0, maxExclusive);
574
+ }
575
+ /** Uniform time in milliseconds [min, max). */
576
+ randomTimeRange(minMs, maxMs) {
577
+ if (maxMs <= minMs) {
578
+ return minMs;
579
+ }
580
+ return this.irandomRange(minMs, maxMs);
581
+ }
582
+ /** Uniform time in milliseconds [0, max). */
583
+ randomTime(maxMs) {
584
+ return this.irandom(maxMs);
585
+ }
586
+ randomIndex(container) {
587
+ return this.irandom(container.length);
588
+ }
589
+ getState() {
590
+ return { mt: this.mt.getState() };
591
+ }
592
+ setState(snapshot) {
593
+ this.mt.setState(snapshot.mt);
594
+ }
595
+ };
596
+ CONTENTS_SOLID = 1 << 0;
597
+ CONTENTS_WINDOW = 1 << 1;
598
+ CONTENTS_AUX = 1 << 2;
599
+ CONTENTS_LAVA = 1 << 3;
600
+ CONTENTS_SLIME = 1 << 4;
601
+ CONTENTS_WATER = 1 << 5;
602
+ CONTENTS_MIST = 1 << 6;
603
+ CONTENTS_NO_WATERJUMP = 1 << 13;
604
+ CONTENTS_PROJECTILECLIP = 1 << 14;
605
+ CONTENTS_AREAPORTAL = 1 << 15;
606
+ CONTENTS_PLAYERCLIP = 1 << 16;
607
+ CONTENTS_MONSTERCLIP = 1 << 17;
608
+ CONTENTS_CURRENT_0 = 1 << 18;
609
+ CONTENTS_CURRENT_90 = 1 << 19;
610
+ CONTENTS_CURRENT_180 = 1 << 20;
611
+ CONTENTS_CURRENT_270 = 1 << 21;
612
+ CONTENTS_CURRENT_UP = 1 << 22;
613
+ CONTENTS_CURRENT_DOWN = 1 << 23;
614
+ CONTENTS_ORIGIN = 1 << 24;
615
+ CONTENTS_MONSTER = 1 << 25;
616
+ CONTENTS_DEADMONSTER = 1 << 26;
617
+ CONTENTS_DETAIL = 1 << 27;
618
+ CONTENTS_TRANSLUCENT = 1 << 28;
619
+ CONTENTS_LADDER = 1 << 29;
620
+ CONTENTS_PLAYER = 1 << 30;
621
+ CONTENTS_PROJECTILE = 1 << 31;
622
+ SURF_LIGHT = 1 << 0;
623
+ SURF_SLICK = 1 << 1;
624
+ SURF_SKY = 1 << 2;
625
+ SURF_WARP = 1 << 3;
626
+ SURF_TRANS33 = 1 << 4;
627
+ SURF_TRANS66 = 1 << 5;
628
+ SURF_FLOWING = 1 << 6;
629
+ SURF_NODRAW = 1 << 7;
630
+ SURF_ALPHATEST = 1 << 25;
631
+ SURF_N64_UV = 1 << 28;
632
+ SURF_N64_SCROLL_X = 1 << 29;
633
+ SURF_N64_SCROLL_Y = 1 << 30;
634
+ SURF_N64_SCROLL_FLIP = 1 << 31;
635
+ MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
636
+ MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
637
+ MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
638
+ MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
639
+ MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
640
+ MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
641
+ MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
642
+ MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
643
+ MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
644
+ MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
645
+ MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
646
+ MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
647
+ MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
648
+ MAX_CHECKCOUNT = Number.MAX_SAFE_INTEGER - 1;
649
+ CvarFlags = /* @__PURE__ */ ((CvarFlags2) => {
650
+ CvarFlags2[CvarFlags2["None"] = 0] = "None";
651
+ CvarFlags2[CvarFlags2["Archive"] = 1] = "Archive";
652
+ CvarFlags2[CvarFlags2["UserInfo"] = 2] = "UserInfo";
653
+ CvarFlags2[CvarFlags2["ServerInfo"] = 4] = "ServerInfo";
654
+ CvarFlags2[CvarFlags2["Latch"] = 8] = "Latch";
655
+ CvarFlags2[CvarFlags2["Cheat"] = 16] = "Cheat";
656
+ return CvarFlags2;
657
+ })(CvarFlags || {});
658
+ MAX_CLIENTS = 256;
659
+ MAX_LIGHTSTYLES = 256;
660
+ MAX_MODELS = 8192;
661
+ MAX_SOUNDS = 2048;
662
+ MAX_IMAGES = 512;
663
+ MAX_ITEMS = 256;
664
+ MAX_GENERAL = MAX_CLIENTS * 2;
665
+ MAX_SHADOW_LIGHTS = 256;
666
+ MAX_WHEEL_ITEMS = 32;
667
+ ConfigStringIndex = ((ConfigStringIndex2) => {
668
+ ConfigStringIndex2[ConfigStringIndex2["Name"] = 0] = "Name";
669
+ ConfigStringIndex2[ConfigStringIndex2["CdTrack"] = 1] = "CdTrack";
670
+ ConfigStringIndex2[ConfigStringIndex2["Sky"] = 2] = "Sky";
671
+ ConfigStringIndex2[ConfigStringIndex2["SkyAxis"] = 3] = "SkyAxis";
672
+ ConfigStringIndex2[ConfigStringIndex2["SkyRotate"] = 4] = "SkyRotate";
673
+ ConfigStringIndex2[ConfigStringIndex2["StatusBar"] = 5] = "StatusBar";
674
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_N64_PHYSICS"] = 56] = "CONFIG_N64_PHYSICS";
675
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_CTF_TEAMS"] = 57] = "CONFIG_CTF_TEAMS";
676
+ ConfigStringIndex2[ConfigStringIndex2["CONFIG_COOP_RESPAWN_STRING"] = 58] = "CONFIG_COOP_RESPAWN_STRING";
677
+ ConfigStringIndex2[ConfigStringIndex2["AirAccel"] = 59] = "AirAccel";
678
+ ConfigStringIndex2[ConfigStringIndex2["MaxClients"] = 60] = "MaxClients";
679
+ ConfigStringIndex2[ConfigStringIndex2["MapChecksum"] = 61] = "MapChecksum";
680
+ ConfigStringIndex2[ConfigStringIndex2["Models"] = 62] = "Models";
681
+ ConfigStringIndex2[ConfigStringIndex2["Sounds"] = 62 + MAX_MODELS] = "Sounds";
682
+ ConfigStringIndex2[ConfigStringIndex2["Images"] = ConfigStringIndex2.Sounds + MAX_SOUNDS] = "Images";
683
+ ConfigStringIndex2[ConfigStringIndex2["Lights"] = ConfigStringIndex2.Images + MAX_IMAGES] = "Lights";
684
+ ConfigStringIndex2[ConfigStringIndex2["ShadowLights"] = ConfigStringIndex2.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
685
+ ConfigStringIndex2[ConfigStringIndex2["Items"] = ConfigStringIndex2.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
686
+ ConfigStringIndex2[ConfigStringIndex2["PlayerSkins"] = ConfigStringIndex2.Items + MAX_ITEMS] = "PlayerSkins";
687
+ ConfigStringIndex2[ConfigStringIndex2["General"] = ConfigStringIndex2.PlayerSkins + MAX_CLIENTS] = "General";
688
+ ConfigStringIndex2[ConfigStringIndex2["WheelWeapons"] = ConfigStringIndex2.General + MAX_GENERAL] = "WheelWeapons";
689
+ ConfigStringIndex2[ConfigStringIndex2["WheelAmmo"] = ConfigStringIndex2.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
690
+ ConfigStringIndex2[ConfigStringIndex2["WheelPowerups"] = ConfigStringIndex2.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
691
+ ConfigStringIndex2[ConfigStringIndex2["CdLoopCount"] = ConfigStringIndex2.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
692
+ ConfigStringIndex2[ConfigStringIndex2["GameStyle"] = ConfigStringIndex2.CdLoopCount + 1] = "GameStyle";
693
+ ConfigStringIndex2[ConfigStringIndex2["MaxConfigStrings"] = ConfigStringIndex2.GameStyle + 1] = "MaxConfigStrings";
694
+ return ConfigStringIndex2;
695
+ })(ConfigStringIndex || {});
696
+ MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
697
+ replay_exports = {};
698
+ __export2(replay_exports, {
699
+ addReplayFrame: () => addReplayFrame,
700
+ createReplaySession: () => createReplaySession,
701
+ deserializeReplay: () => deserializeReplay,
702
+ serializeReplay: () => serializeReplay
703
+ });
704
+ WaterLevel = /* @__PURE__ */ ((WaterLevel4) => {
705
+ WaterLevel4[WaterLevel4["None"] = 0] = "None";
706
+ WaterLevel4[WaterLevel4["Feet"] = 1] = "Feet";
707
+ WaterLevel4[WaterLevel4["Waist"] = 2] = "Waist";
708
+ WaterLevel4[WaterLevel4["Under"] = 3] = "Under";
709
+ return WaterLevel4;
710
+ })(WaterLevel || {});
711
+ WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
712
+ ServerCommand = /* @__PURE__ */ ((ServerCommand22) => {
713
+ ServerCommand22[ServerCommand22["bad"] = 0] = "bad";
714
+ ServerCommand22[ServerCommand22["muzzleflash"] = 1] = "muzzleflash";
715
+ ServerCommand22[ServerCommand22["muzzleflash2"] = 2] = "muzzleflash2";
716
+ ServerCommand22[ServerCommand22["temp_entity"] = 3] = "temp_entity";
717
+ ServerCommand22[ServerCommand22["layout"] = 4] = "layout";
718
+ ServerCommand22[ServerCommand22["inventory"] = 5] = "inventory";
719
+ ServerCommand22[ServerCommand22["nop"] = 6] = "nop";
720
+ ServerCommand22[ServerCommand22["disconnect"] = 7] = "disconnect";
721
+ ServerCommand22[ServerCommand22["reconnect"] = 8] = "reconnect";
722
+ ServerCommand22[ServerCommand22["sound"] = 9] = "sound";
723
+ ServerCommand22[ServerCommand22["print"] = 10] = "print";
724
+ ServerCommand22[ServerCommand22["stufftext"] = 11] = "stufftext";
725
+ ServerCommand22[ServerCommand22["serverdata"] = 12] = "serverdata";
726
+ ServerCommand22[ServerCommand22["configstring"] = 13] = "configstring";
727
+ ServerCommand22[ServerCommand22["spawnbaseline"] = 14] = "spawnbaseline";
728
+ ServerCommand22[ServerCommand22["centerprint"] = 15] = "centerprint";
729
+ ServerCommand22[ServerCommand22["download"] = 16] = "download";
730
+ ServerCommand22[ServerCommand22["playerinfo"] = 17] = "playerinfo";
731
+ ServerCommand22[ServerCommand22["packetentities"] = 18] = "packetentities";
732
+ ServerCommand22[ServerCommand22["deltapacketentities"] = 19] = "deltapacketentities";
733
+ ServerCommand22[ServerCommand22["frame"] = 20] = "frame";
734
+ ServerCommand22[ServerCommand22["splitclient"] = 21] = "splitclient";
735
+ ServerCommand22[ServerCommand22["configblast"] = 22] = "configblast";
736
+ ServerCommand22[ServerCommand22["spawnbaselineblast"] = 23] = "spawnbaselineblast";
737
+ ServerCommand22[ServerCommand22["level_restart"] = 24] = "level_restart";
738
+ ServerCommand22[ServerCommand22["damage"] = 25] = "damage";
739
+ ServerCommand22[ServerCommand22["locprint"] = 26] = "locprint";
740
+ ServerCommand22[ServerCommand22["fog"] = 27] = "fog";
741
+ ServerCommand22[ServerCommand22["waitingforplayers"] = 28] = "waitingforplayers";
742
+ ServerCommand22[ServerCommand22["bot_chat"] = 29] = "bot_chat";
743
+ ServerCommand22[ServerCommand22["poi"] = 30] = "poi";
744
+ ServerCommand22[ServerCommand22["help_path"] = 31] = "help_path";
745
+ ServerCommand22[ServerCommand22["muzzleflash3"] = 32] = "muzzleflash3";
746
+ ServerCommand22[ServerCommand22["achievement"] = 33] = "achievement";
747
+ return ServerCommand22;
748
+ })(ServerCommand || {});
749
+ TempEntity = /* @__PURE__ */ ((TempEntity2) => {
750
+ TempEntity2[TempEntity2["GUNSHOT"] = 0] = "GUNSHOT";
751
+ TempEntity2[TempEntity2["BLOOD"] = 1] = "BLOOD";
752
+ TempEntity2[TempEntity2["BLASTER"] = 2] = "BLASTER";
753
+ TempEntity2[TempEntity2["RAILTRAIL"] = 3] = "RAILTRAIL";
754
+ TempEntity2[TempEntity2["SHOTGUN"] = 4] = "SHOTGUN";
755
+ TempEntity2[TempEntity2["EXPLOSION1"] = 5] = "EXPLOSION1";
756
+ TempEntity2[TempEntity2["EXPLOSION2"] = 6] = "EXPLOSION2";
757
+ TempEntity2[TempEntity2["ROCKET_EXPLOSION"] = 7] = "ROCKET_EXPLOSION";
758
+ TempEntity2[TempEntity2["GRENADE_EXPLOSION"] = 8] = "GRENADE_EXPLOSION";
759
+ TempEntity2[TempEntity2["SPARKS"] = 9] = "SPARKS";
760
+ TempEntity2[TempEntity2["SPLASH"] = 10] = "SPLASH";
761
+ TempEntity2[TempEntity2["BUBBLETRAIL"] = 11] = "BUBBLETRAIL";
762
+ TempEntity2[TempEntity2["SCREEN_SPARKS"] = 12] = "SCREEN_SPARKS";
763
+ TempEntity2[TempEntity2["SHIELD_SPARKS"] = 13] = "SHIELD_SPARKS";
764
+ TempEntity2[TempEntity2["BULLET_SPARKS"] = 14] = "BULLET_SPARKS";
765
+ TempEntity2[TempEntity2["LASER_SPARKS"] = 15] = "LASER_SPARKS";
766
+ TempEntity2[TempEntity2["PARASITE_ATTACK"] = 16] = "PARASITE_ATTACK";
767
+ TempEntity2[TempEntity2["ROCKET_EXPLOSION_WATER"] = 17] = "ROCKET_EXPLOSION_WATER";
768
+ TempEntity2[TempEntity2["GRENADE_EXPLOSION_WATER"] = 18] = "GRENADE_EXPLOSION_WATER";
769
+ TempEntity2[TempEntity2["MEDIC_CABLE_ATTACK"] = 19] = "MEDIC_CABLE_ATTACK";
770
+ TempEntity2[TempEntity2["BFG_EXPLOSION"] = 20] = "BFG_EXPLOSION";
771
+ TempEntity2[TempEntity2["BFG_BIGEXPLOSION"] = 21] = "BFG_BIGEXPLOSION";
772
+ TempEntity2[TempEntity2["BOSSTPORT"] = 22] = "BOSSTPORT";
773
+ TempEntity2[TempEntity2["BFG_LASER"] = 23] = "BFG_LASER";
774
+ TempEntity2[TempEntity2["GRAPPLE_CABLE"] = 24] = "GRAPPLE_CABLE";
775
+ TempEntity2[TempEntity2["WELDING_SPARKS"] = 25] = "WELDING_SPARKS";
776
+ TempEntity2[TempEntity2["GREENBLOOD"] = 26] = "GREENBLOOD";
777
+ TempEntity2[TempEntity2["BLUEHYPERBLASTER"] = 27] = "BLUEHYPERBLASTER";
778
+ TempEntity2[TempEntity2["PLASMA_EXPLOSION"] = 28] = "PLASMA_EXPLOSION";
779
+ TempEntity2[TempEntity2["TUNNEL_SPARKS"] = 29] = "TUNNEL_SPARKS";
780
+ TempEntity2[TempEntity2["BLASTER2"] = 30] = "BLASTER2";
781
+ TempEntity2[TempEntity2["RAILTRAIL2"] = 31] = "RAILTRAIL2";
782
+ TempEntity2[TempEntity2["FLAME"] = 32] = "FLAME";
783
+ TempEntity2[TempEntity2["LIGHTNING"] = 33] = "LIGHTNING";
784
+ TempEntity2[TempEntity2["DEBUGTRAIL"] = 34] = "DEBUGTRAIL";
785
+ TempEntity2[TempEntity2["PLAIN_EXPLOSION"] = 35] = "PLAIN_EXPLOSION";
786
+ TempEntity2[TempEntity2["FLASHLIGHT"] = 36] = "FLASHLIGHT";
787
+ TempEntity2[TempEntity2["FORCEWALL"] = 37] = "FORCEWALL";
788
+ TempEntity2[TempEntity2["HEATBEAM"] = 38] = "HEATBEAM";
789
+ TempEntity2[TempEntity2["MONSTER_HEATBEAM"] = 39] = "MONSTER_HEATBEAM";
790
+ TempEntity2[TempEntity2["STEAM"] = 40] = "STEAM";
791
+ TempEntity2[TempEntity2["BUBBLETRAIL2"] = 41] = "BUBBLETRAIL2";
792
+ TempEntity2[TempEntity2["MOREBLOOD"] = 42] = "MOREBLOOD";
793
+ TempEntity2[TempEntity2["HEATBEAM_SPARKS"] = 43] = "HEATBEAM_SPARKS";
794
+ TempEntity2[TempEntity2["HEATBEAM_STEAM"] = 44] = "HEATBEAM_STEAM";
795
+ TempEntity2[TempEntity2["CHAINFIST_SMOKE"] = 45] = "CHAINFIST_SMOKE";
796
+ TempEntity2[TempEntity2["ELECTRIC_SPARKS"] = 46] = "ELECTRIC_SPARKS";
797
+ TempEntity2[TempEntity2["TRACKER_EXPLOSION"] = 47] = "TRACKER_EXPLOSION";
798
+ TempEntity2[TempEntity2["TELEPORT_EFFECT"] = 48] = "TELEPORT_EFFECT";
799
+ TempEntity2[TempEntity2["DBALL_GOAL"] = 49] = "DBALL_GOAL";
800
+ TempEntity2[TempEntity2["WIDOWBEAMOUT"] = 50] = "WIDOWBEAMOUT";
801
+ TempEntity2[TempEntity2["NUKEBLAST"] = 51] = "NUKEBLAST";
802
+ TempEntity2[TempEntity2["WIDOWSPLASH"] = 52] = "WIDOWSPLASH";
803
+ TempEntity2[TempEntity2["EXPLOSION1_BIG"] = 53] = "EXPLOSION1_BIG";
804
+ TempEntity2[TempEntity2["EXPLOSION1_NP"] = 54] = "EXPLOSION1_NP";
805
+ TempEntity2[TempEntity2["FLECHETTE"] = 55] = "FLECHETTE";
806
+ TempEntity2[TempEntity2["BLUEHYPERBLASTER_KEX"] = 56] = "BLUEHYPERBLASTER_KEX";
807
+ TempEntity2[TempEntity2["BFG_ZAP"] = 57] = "BFG_ZAP";
808
+ TempEntity2[TempEntity2["BERSERK_SLAM"] = 58] = "BERSERK_SLAM";
809
+ TempEntity2[TempEntity2["GRAPPLE_CABLE_2"] = 59] = "GRAPPLE_CABLE_2";
810
+ TempEntity2[TempEntity2["POWER_SPLASH"] = 60] = "POWER_SPLASH";
811
+ TempEntity2[TempEntity2["LIGHTNING_BEAM"] = 61] = "LIGHTNING_BEAM";
812
+ TempEntity2[TempEntity2["EXPLOSION1_NL"] = 62] = "EXPLOSION1_NL";
813
+ TempEntity2[TempEntity2["EXPLOSION2_NL"] = 63] = "EXPLOSION2_NL";
814
+ return TempEntity2;
815
+ })(TempEntity || {});
816
+ MZ_BLASTER = 0;
817
+ MZ_MACHINEGUN = 1;
818
+ MZ_SHOTGUN = 2;
819
+ MZ_CHAINGUN1 = 3;
820
+ MZ_RAILGUN = 6;
821
+ MZ_ROCKET = 7;
822
+ MZ_GRENADE = 8;
823
+ MZ_SSHOTGUN = 11;
824
+ MZ_BFG = 12;
825
+ MZ_HYPERBLASTER = 13;
826
+ PowerupId = /* @__PURE__ */ ((PowerupId22) => {
827
+ PowerupId22["QuadDamage"] = "quad";
828
+ PowerupId22["Invulnerability"] = "invulnerability";
829
+ PowerupId22["EnviroSuit"] = "enviro_suit";
830
+ PowerupId22["Rebreather"] = "rebreather";
831
+ PowerupId22["Silencer"] = "silencer";
832
+ PowerupId22["PowerScreen"] = "power_screen";
833
+ PowerupId22["PowerShield"] = "power_shield";
834
+ PowerupId22["QuadFire"] = "quad_fire";
835
+ PowerupId22["Invisibility"] = "invisibility";
836
+ PowerupId22["Bandolier"] = "bandolier";
837
+ PowerupId22["AmmoPack"] = "ammo_pack";
838
+ PowerupId22["IRGoggles"] = "ir_goggles";
839
+ PowerupId22["DoubleDamage"] = "double_damage";
840
+ PowerupId22["SphereVengeance"] = "sphere_vengeance";
841
+ PowerupId22["SphereHunter"] = "sphere_hunter";
842
+ PowerupId22["SphereDefender"] = "sphere_defender";
843
+ PowerupId22["Doppelganger"] = "doppelganger";
844
+ PowerupId22["TagToken"] = "tag_token";
845
+ PowerupId22["TechResistance"] = "tech_resistance";
846
+ PowerupId22["TechStrength"] = "tech_strength";
847
+ PowerupId22["TechHaste"] = "tech_haste";
848
+ PowerupId22["TechRegeneration"] = "tech_regeneration";
849
+ PowerupId22["Flashlight"] = "flashlight";
850
+ PowerupId22["Compass"] = "compass";
851
+ return PowerupId22;
852
+ })(PowerupId || {});
853
+ PlayerStat = /* @__PURE__ */ ((PlayerStat2) => {
854
+ PlayerStat2[PlayerStat2["STAT_HEALTH_ICON"] = 0] = "STAT_HEALTH_ICON";
855
+ PlayerStat2[PlayerStat2["STAT_HEALTH"] = 1] = "STAT_HEALTH";
856
+ PlayerStat2[PlayerStat2["STAT_AMMO_ICON"] = 2] = "STAT_AMMO_ICON";
857
+ PlayerStat2[PlayerStat2["STAT_AMMO"] = 3] = "STAT_AMMO";
858
+ PlayerStat2[PlayerStat2["STAT_ARMOR_ICON"] = 4] = "STAT_ARMOR_ICON";
859
+ PlayerStat2[PlayerStat2["STAT_ARMOR"] = 5] = "STAT_ARMOR";
860
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ICON"] = 6] = "STAT_SELECTED_ICON";
861
+ PlayerStat2[PlayerStat2["STAT_PICKUP_ICON"] = 7] = "STAT_PICKUP_ICON";
862
+ PlayerStat2[PlayerStat2["STAT_PICKUP_STRING"] = 8] = "STAT_PICKUP_STRING";
863
+ PlayerStat2[PlayerStat2["STAT_TIMER_ICON"] = 9] = "STAT_TIMER_ICON";
864
+ PlayerStat2[PlayerStat2["STAT_TIMER"] = 10] = "STAT_TIMER";
865
+ PlayerStat2[PlayerStat2["STAT_HELPICON"] = 11] = "STAT_HELPICON";
866
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM"] = 12] = "STAT_SELECTED_ITEM";
867
+ PlayerStat2[PlayerStat2["STAT_LAYOUTS"] = 13] = "STAT_LAYOUTS";
868
+ PlayerStat2[PlayerStat2["STAT_FRAGS"] = 14] = "STAT_FRAGS";
869
+ PlayerStat2[PlayerStat2["STAT_FLASHES"] = 15] = "STAT_FLASHES";
870
+ PlayerStat2[PlayerStat2["STAT_CHASE"] = 16] = "STAT_CHASE";
871
+ PlayerStat2[PlayerStat2["STAT_SPECTATOR"] = 17] = "STAT_SPECTATOR";
872
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_PIC"] = 18] = "STAT_CTF_TEAM1_PIC";
873
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_CAPS"] = 19] = "STAT_CTF_TEAM1_CAPS";
874
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_PIC"] = 20] = "STAT_CTF_TEAM2_PIC";
875
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_CAPS"] = 21] = "STAT_CTF_TEAM2_CAPS";
876
+ PlayerStat2[PlayerStat2["STAT_CTF_FLAG_PIC"] = 22] = "STAT_CTF_FLAG_PIC";
877
+ PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM1_PIC"] = 23] = "STAT_CTF_JOINED_TEAM1_PIC";
878
+ PlayerStat2[PlayerStat2["STAT_CTF_JOINED_TEAM2_PIC"] = 24] = "STAT_CTF_JOINED_TEAM2_PIC";
879
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM1_HEADER"] = 25] = "STAT_CTF_TEAM1_HEADER";
880
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAM2_HEADER"] = 26] = "STAT_CTF_TEAM2_HEADER";
881
+ PlayerStat2[PlayerStat2["STAT_CTF_TECH"] = 27] = "STAT_CTF_TECH";
882
+ PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW"] = 28] = "STAT_CTF_ID_VIEW";
883
+ PlayerStat2[PlayerStat2["STAT_CTF_MATCH"] = 29] = "STAT_CTF_MATCH";
884
+ PlayerStat2[PlayerStat2["STAT_CTF_ID_VIEW_COLOR"] = 30] = "STAT_CTF_ID_VIEW_COLOR";
885
+ PlayerStat2[PlayerStat2["STAT_CTF_TEAMINFO"] = 31] = "STAT_CTF_TEAMINFO";
886
+ PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_1"] = 32] = "STAT_WEAPONS_OWNED_1";
887
+ PlayerStat2[PlayerStat2["STAT_WEAPONS_OWNED_2"] = 33] = "STAT_WEAPONS_OWNED_2";
888
+ PlayerStat2[PlayerStat2["STAT_AMMO_INFO_START"] = 34] = "STAT_AMMO_INFO_START";
889
+ PlayerStat2[PlayerStat2["STAT_POWERUP_INFO_START"] = 41] = "STAT_POWERUP_INFO_START";
890
+ PlayerStat2[PlayerStat2["STAT_KEY_A"] = 44] = "STAT_KEY_A";
891
+ PlayerStat2[PlayerStat2["STAT_KEY_B"] = 45] = "STAT_KEY_B";
892
+ PlayerStat2[PlayerStat2["STAT_KEY_C"] = 46] = "STAT_KEY_C";
893
+ PlayerStat2[PlayerStat2["STAT_ACTIVE_WHEEL_WEAPON"] = 47] = "STAT_ACTIVE_WHEEL_WEAPON";
894
+ PlayerStat2[PlayerStat2["STAT_COOP_RESPAWN"] = 48] = "STAT_COOP_RESPAWN";
895
+ PlayerStat2[PlayerStat2["STAT_LIVES"] = 49] = "STAT_LIVES";
896
+ PlayerStat2[PlayerStat2["STAT_HIT_MARKER"] = 50] = "STAT_HIT_MARKER";
897
+ PlayerStat2[PlayerStat2["STAT_SELECTED_ITEM_NAME"] = 51] = "STAT_SELECTED_ITEM_NAME";
898
+ PlayerStat2[PlayerStat2["STAT_HEALTH_BARS"] = 52] = "STAT_HEALTH_BARS";
899
+ PlayerStat2[PlayerStat2["STAT_ACTIVE_WEAPON"] = 53] = "STAT_ACTIVE_WEAPON";
900
+ PlayerStat2[PlayerStat2["STAT_LAST"] = 54] = "STAT_LAST";
901
+ return PlayerStat2;
902
+ })(PlayerStat || {});
903
+ AMMO_MAX = 12;
904
+ NUM_BITS_FOR_AMMO = 9;
905
+ NUM_AMMO_STATS = Math.ceil(AMMO_MAX * NUM_BITS_FOR_AMMO / 16);
906
+ POWERUP_MAX = 23;
907
+ NUM_BITS_FOR_POWERUP = 2;
908
+ NUM_POWERUP_STATS = Math.ceil(POWERUP_MAX * NUM_BITS_FOR_POWERUP / 16);
909
+ POWERUP_STAT_MAP = {
910
+ [
911
+ "power_screen"
912
+ /* PowerScreen */
913
+ ]: 0,
914
+ [
915
+ "power_shield"
916
+ /* PowerShield */
917
+ ]: 1,
918
+ // 2 is POWERUP_AM_BOMB (not in PowerupId?)
919
+ [
920
+ "quad"
921
+ /* QuadDamage */
922
+ ]: 3,
923
+ [
924
+ "quad_fire"
925
+ /* QuadFire */
926
+ ]: 4,
927
+ [
928
+ "invulnerability"
929
+ /* Invulnerability */
930
+ ]: 5,
931
+ [
932
+ "invisibility"
933
+ /* Invisibility */
934
+ ]: 6,
935
+ [
936
+ "silencer"
937
+ /* Silencer */
938
+ ]: 7,
939
+ [
940
+ "rebreather"
941
+ /* Rebreather */
942
+ ]: 8,
943
+ [
944
+ "enviro_suit"
945
+ /* EnviroSuit */
946
+ ]: 9,
947
+ [
948
+ "bandolier"
949
+ /* Bandolier */
950
+ ]: 10,
951
+ // Placeholder/Map mismatch handling?
952
+ [
953
+ "ammo_pack"
954
+ /* AmmoPack */
955
+ ]: 10,
956
+ // Original reused indices or had gaps?
957
+ [
958
+ "ir_goggles"
959
+ /* IRGoggles */
960
+ ]: 11,
961
+ [
962
+ "double_damage"
963
+ /* DoubleDamage */
964
+ ]: 12,
965
+ [
966
+ "sphere_vengeance"
967
+ /* SphereVengeance */
968
+ ]: 13,
969
+ [
970
+ "sphere_hunter"
971
+ /* SphereHunter */
972
+ ]: 14,
973
+ [
974
+ "sphere_defender"
975
+ /* SphereDefender */
976
+ ]: 15,
977
+ [
978
+ "doppelganger"
979
+ /* Doppelganger */
980
+ ]: 16,
981
+ [
982
+ "flashlight"
983
+ /* Flashlight */
984
+ ]: 17,
985
+ [
986
+ "compass"
987
+ /* Compass */
988
+ ]: 18,
989
+ [
990
+ "tech_resistance"
991
+ /* TechResistance */
992
+ ]: 19,
993
+ [
994
+ "tech_strength"
995
+ /* TechStrength */
996
+ ]: 20,
997
+ [
998
+ "tech_haste"
999
+ /* TechHaste */
1000
+ ]: 21,
1001
+ [
1002
+ "tech_regeneration"
1003
+ /* TechRegeneration */
1004
+ ]: 22,
1005
+ // Add missing mappings to avoid runtime lookups failing for new types
1006
+ [
1007
+ "tag_token"
1008
+ /* TagToken */
1009
+ ]: -1
1010
+ };
1011
+ RenderFx = /* @__PURE__ */ ((RenderFx2) => {
1012
+ RenderFx2[RenderFx2["MinLight"] = 1] = "MinLight";
1013
+ RenderFx2[RenderFx2["ViewerModel"] = 2] = "ViewerModel";
1014
+ RenderFx2[RenderFx2["WeaponModel"] = 4] = "WeaponModel";
1015
+ RenderFx2[RenderFx2["FullBright"] = 8] = "FullBright";
1016
+ RenderFx2[RenderFx2["DepthHack"] = 16] = "DepthHack";
1017
+ RenderFx2[RenderFx2["Translucent"] = 32] = "Translucent";
1018
+ RenderFx2[RenderFx2["FrameLerp"] = 64] = "FrameLerp";
1019
+ RenderFx2[RenderFx2["Beam"] = 128] = "Beam";
1020
+ RenderFx2[RenderFx2["CustomLight"] = 256] = "CustomLight";
1021
+ RenderFx2[RenderFx2["Glow"] = 512] = "Glow";
1022
+ RenderFx2[RenderFx2["ShellRed"] = 1024] = "ShellRed";
1023
+ RenderFx2[RenderFx2["ShellGreen"] = 2048] = "ShellGreen";
1024
+ RenderFx2[RenderFx2["ShellBlue"] = 4096] = "ShellBlue";
1025
+ RenderFx2[RenderFx2["IrVisible"] = 32768] = "IrVisible";
1026
+ RenderFx2[RenderFx2["ShellDouble"] = 65536] = "ShellDouble";
1027
+ RenderFx2[RenderFx2["ShellHalfDam"] = 131072] = "ShellHalfDam";
1028
+ RenderFx2[RenderFx2["MinLightPlus"] = 262144] = "MinLightPlus";
1029
+ RenderFx2[RenderFx2["ExtraLight"] = 524288] = "ExtraLight";
1030
+ RenderFx2[RenderFx2["BeamLightning"] = 1048576] = "BeamLightning";
1031
+ return RenderFx2;
1032
+ })(RenderFx || {});
1033
+ entityFlags_exports = {};
1034
+ __export2(entityFlags_exports, {
1035
+ U_ANGLE1: () => U_ANGLE1,
1036
+ U_ANGLE2: () => U_ANGLE2,
1037
+ U_ANGLE3: () => U_ANGLE3,
1038
+ U_EFFECTS: () => U_EFFECTS,
1039
+ U_EVENT: () => U_EVENT,
1040
+ U_FRAME: () => U_FRAME,
1041
+ U_MODEL: () => U_MODEL,
1042
+ U_MODEL2: () => U_MODEL2,
1043
+ U_MODEL3: () => U_MODEL3,
1044
+ U_MODEL4: () => U_MODEL4,
1045
+ U_MOREBITS: () => U_MOREBITS,
1046
+ U_NUMBER: () => U_NUMBER,
1047
+ U_ORIGIN1: () => U_ORIGIN1,
1048
+ U_ORIGIN2: () => U_ORIGIN2,
1049
+ U_ORIGIN3: () => U_ORIGIN3,
1050
+ U_REMOVE: () => U_REMOVE,
1051
+ U_RENDERFX: () => U_RENDERFX,
1052
+ U_SKIN: () => U_SKIN,
1053
+ U_SOLID: () => U_SOLID,
1054
+ U_SOUND: () => U_SOUND
1055
+ });
1056
+ U_NUMBER = 1 << 0;
1057
+ U_MODEL = 1 << 1;
1058
+ U_SOUND = 1 << 2;
1059
+ U_ORIGIN1 = 1 << 3;
1060
+ U_ORIGIN2 = 1 << 4;
1061
+ U_ORIGIN3 = 1 << 5;
1062
+ U_ANGLE1 = 1 << 6;
1063
+ U_ANGLE2 = 1 << 7;
1064
+ U_ANGLE3 = 1 << 8;
1065
+ U_FRAME = 1 << 9;
1066
+ U_SKIN = 1 << 10;
1067
+ U_EFFECTS = 1 << 11;
1068
+ U_RENDERFX = 1 << 12;
1069
+ U_SOLID = 1 << 13;
1070
+ U_EVENT = 1 << 14;
1071
+ U_MOREBITS = 1 << 15;
1072
+ U_MODEL2 = 1 << 0;
1073
+ U_MODEL3 = 1 << 1;
1074
+ U_MODEL4 = 1 << 2;
1075
+ U_REMOVE = 32768;
1076
+ FRAMETIME = 0.025;
1077
+ MASK_WATER2 = 33554432;
1078
+ WaterLevel3 = {
1079
+ None: 0,
1080
+ Feet: 1,
1081
+ Waist: 2,
1082
+ Under: 3
1083
+ };
1084
+ categorizePosition2 = (state, trace) => {
1085
+ const point = { ...state.origin };
1086
+ point.z -= 0.25;
1087
+ const traceResult = trace(state.origin, point);
1088
+ return {
1089
+ ...state,
1090
+ onGround: traceResult.fraction < 1
1091
+ };
1092
+ };
1093
+ checkWater = (state, pointContents2) => {
1094
+ const point = { ...state.origin };
1095
+ const { mins, maxs } = state;
1096
+ point.z = state.origin.z + mins.z + 1;
1097
+ const contents = pointContents2(point);
1098
+ if (!(contents & MASK_WATER2)) {
1099
+ return { ...state, waterLevel: WaterLevel3.None };
1100
+ }
1101
+ let waterLevel = WaterLevel3.Feet;
1102
+ const waist = state.origin.z + (mins.z + maxs.z) * 0.5;
1103
+ point.z = waist;
1104
+ const waistContents = pointContents2(point);
1105
+ if (waistContents & MASK_WATER2) {
1106
+ waterLevel = WaterLevel3.Waist;
1107
+ const head = state.origin.z + 22;
1108
+ point.z = head;
1109
+ const headContents = pointContents2(point);
1110
+ if (headContents & MASK_WATER2) {
1111
+ waterLevel = WaterLevel3.Under;
1112
+ }
1113
+ }
1114
+ return { ...state, waterLevel };
1115
+ };
1116
+ applyPmove = (state, cmd, trace, pointContents2) => {
1117
+ let newState = { ...state };
1118
+ newState = categorizePosition2(newState, trace);
1119
+ newState = checkWater(newState, pointContents2);
1120
+ const { origin, velocity, onGround, waterLevel, viewAngles } = newState;
1121
+ const adjustedAngles = waterLevel >= 2 ? viewAngles : {
1122
+ // For ground/air movement, reduce pitch influence (rerelease/p_move.cpp:1689)
1123
+ x: viewAngles.x > 180 ? (viewAngles.x - 360) / 3 : viewAngles.x / 3,
1124
+ y: viewAngles.y,
1125
+ z: viewAngles.z
1126
+ };
1127
+ const { forward, right } = angleVectors(adjustedAngles);
1128
+ const frictionedVelocity = applyPmoveFriction({
1129
+ velocity,
1130
+ frametime: FRAMETIME,
1131
+ onGround,
1132
+ groundIsSlick: false,
1133
+ onLadder: false,
1134
+ waterlevel: waterLevel,
1135
+ pmFriction: 6,
1136
+ pmStopSpeed: 100,
1137
+ pmWaterFriction: 1
1138
+ });
1139
+ const wish = waterLevel >= 2 ? buildWaterWish({
1140
+ forward,
1141
+ right,
1142
+ cmd,
1143
+ maxSpeed: 320
1144
+ }) : buildAirGroundWish({
1145
+ forward,
1146
+ right,
1147
+ cmd,
1148
+ maxSpeed: 320
1149
+ });
1150
+ const finalVelocity = applyPmoveAccelerate({
1151
+ velocity: frictionedVelocity,
1152
+ wishdir: wish.wishdir,
1153
+ wishspeed: wish.wishspeed,
1154
+ // Water movement uses ground acceleration (10), not air acceleration (1)
1155
+ accel: onGround || waterLevel >= 2 ? 10 : 1,
1156
+ frametime: FRAMETIME
1157
+ });
1158
+ const traceResult = trace(origin, {
1159
+ x: origin.x + finalVelocity.x * FRAMETIME,
1160
+ y: origin.y + finalVelocity.y * FRAMETIME,
1161
+ z: origin.z + finalVelocity.z * FRAMETIME
1162
+ });
1163
+ return {
1164
+ ...newState,
1165
+ origin: traceResult.endpos,
1166
+ velocity: finalVelocity
1167
+ };
1168
+ };
1169
+ WeaponId = /* @__PURE__ */ ((WeaponId22) => {
1170
+ WeaponId22["Blaster"] = "blaster";
1171
+ WeaponId22["Shotgun"] = "shotgun";
1172
+ WeaponId22["SuperShotgun"] = "supershotgun";
1173
+ WeaponId22["Machinegun"] = "machinegun";
1174
+ WeaponId22["Chaingun"] = "chaingun";
1175
+ WeaponId22["HandGrenade"] = "grenades";
1176
+ WeaponId22["GrenadeLauncher"] = "grenadelauncher";
1177
+ WeaponId22["RocketLauncher"] = "rocketlauncher";
1178
+ WeaponId22["HyperBlaster"] = "hyperblaster";
1179
+ WeaponId22["Railgun"] = "railgun";
1180
+ WeaponId22["BFG10K"] = "bfg10k";
1181
+ WeaponId22["Grapple"] = "grapple";
1182
+ WeaponId22["ChainFist"] = "chainfist";
1183
+ WeaponId22["EtfRifle"] = "etf_rifle";
1184
+ WeaponId22["ProxLauncher"] = "prox_launcher";
1185
+ WeaponId22["IonRipper"] = "ionripper";
1186
+ WeaponId22["PlasmaBeam"] = "plasmabeam";
1187
+ WeaponId22["Phalanx"] = "phalanx";
1188
+ WeaponId22["Disruptor"] = "disruptor";
1189
+ WeaponId22["Trap"] = "trap";
1190
+ return WeaponId22;
1191
+ })(WeaponId || {});
1192
+ AmmoType = /* @__PURE__ */ ((AmmoType22) => {
1193
+ AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
1194
+ AmmoType22[AmmoType22["Shells"] = 1] = "Shells";
1195
+ AmmoType22[AmmoType22["Rockets"] = 2] = "Rockets";
1196
+ AmmoType22[AmmoType22["Grenades"] = 3] = "Grenades";
1197
+ AmmoType22[AmmoType22["Cells"] = 4] = "Cells";
1198
+ AmmoType22[AmmoType22["Slugs"] = 5] = "Slugs";
1199
+ AmmoType22[AmmoType22["MagSlugs"] = 6] = "MagSlugs";
1200
+ AmmoType22[AmmoType22["Trap"] = 7] = "Trap";
1201
+ AmmoType22[AmmoType22["Flechettes"] = 8] = "Flechettes";
1202
+ AmmoType22[AmmoType22["Tesla"] = 9] = "Tesla";
1203
+ AmmoType22[AmmoType22["Disruptor"] = 10] = "Disruptor";
1204
+ AmmoType22[AmmoType22["Prox"] = 11] = "Prox";
1205
+ AmmoType22[AmmoType22["Nuke"] = 12] = "Nuke";
1206
+ AmmoType22[AmmoType22["Rounds"] = 13] = "Rounds";
1207
+ return AmmoType22;
1208
+ })(AmmoType || {});
1209
+ AMMO_TYPE_COUNT = Object.keys(AmmoType).length / 2;
1210
+ AmmoItemId = /* @__PURE__ */ ((AmmoItemId22) => {
1211
+ AmmoItemId22["Shells"] = "ammo_shells";
1212
+ AmmoItemId22["Bullets"] = "ammo_bullets";
1213
+ AmmoItemId22["Rockets"] = "ammo_rockets";
1214
+ AmmoItemId22["Grenades"] = "ammo_grenades";
1215
+ AmmoItemId22["Cells"] = "ammo_cells";
1216
+ AmmoItemId22["Slugs"] = "ammo_slugs";
1217
+ AmmoItemId22["MagSlugs"] = "ammo_magslug";
1218
+ AmmoItemId22["Flechettes"] = "ammo_flechettes";
1219
+ AmmoItemId22["Disruptor"] = "ammo_disruptor";
1220
+ AmmoItemId22["Tesla"] = "ammo_tesla";
1221
+ AmmoItemId22["Trap"] = "ammo_trap";
1222
+ AmmoItemId22["Prox"] = "ammo_prox";
1223
+ return AmmoItemId22;
1224
+ })(AmmoItemId || {});
1225
+ WEAPON_WHEEL_ORDER = [
1226
+ "blaster",
1227
+ "shotgun",
1228
+ "supershotgun",
1229
+ "machinegun",
1230
+ "chaingun",
1231
+ "grenadelauncher",
1232
+ "rocketlauncher",
1233
+ "grenades",
1234
+ "hyperblaster",
1235
+ "railgun",
1236
+ "bfg10k"
1237
+ /* BFG10K */
1238
+ ];
1239
+ }
1163
1240
  });
1164
- var U_NUMBER = 1 << 0;
1165
- var U_MODEL = 1 << 1;
1166
- var U_SOUND = 1 << 2;
1167
- var U_ORIGIN1 = 1 << 3;
1168
- var U_ORIGIN2 = 1 << 4;
1169
- var U_ORIGIN3 = 1 << 5;
1170
- var U_ANGLE1 = 1 << 6;
1171
- var U_ANGLE2 = 1 << 7;
1172
- var U_ANGLE3 = 1 << 8;
1173
- var U_FRAME = 1 << 9;
1174
- var U_SKIN = 1 << 10;
1175
- var U_EFFECTS = 1 << 11;
1176
- var U_RENDERFX = 1 << 12;
1177
- var U_SOLID = 1 << 13;
1178
- var U_EVENT = 1 << 14;
1179
- var U_MOREBITS = 1 << 15;
1180
- var U_MODEL2 = 1 << 0;
1181
- var U_MODEL3 = 1 << 1;
1182
- var U_MODEL4 = 1 << 2;
1183
- var U_REMOVE = 32768;
1184
- var FRAMETIME = 0.025;
1185
- var MASK_WATER2 = 33554432;
1186
- var WaterLevel3 = {
1187
- None: 0,
1188
- Feet: 1,
1189
- Waist: 2,
1190
- Under: 3
1191
- };
1192
- var categorizePosition2 = (state, trace) => {
1193
- const point = { ...state.origin };
1194
- point.z -= 0.25;
1195
- const traceResult = trace(state.origin, point);
1196
- return {
1197
- ...state,
1198
- onGround: traceResult.fraction < 1
1199
- };
1200
- };
1201
- var checkWater = (state, pointContents2) => {
1202
- const point = { ...state.origin };
1203
- const { mins, maxs } = state;
1204
- point.z = state.origin.z + mins.z + 1;
1205
- const contents = pointContents2(point);
1206
- if (!(contents & MASK_WATER2)) {
1207
- return { ...state, waterLevel: WaterLevel3.None };
1208
- }
1209
- let waterLevel = WaterLevel3.Feet;
1210
- const waist = state.origin.z + (mins.z + maxs.z) * 0.5;
1211
- point.z = waist;
1212
- const waistContents = pointContents2(point);
1213
- if (waistContents & MASK_WATER2) {
1214
- waterLevel = WaterLevel3.Waist;
1215
- const head = state.origin.z + 22;
1216
- point.z = head;
1217
- const headContents = pointContents2(point);
1218
- if (headContents & MASK_WATER2) {
1219
- waterLevel = WaterLevel3.Under;
1220
- }
1221
- }
1222
- return { ...state, waterLevel };
1223
- };
1224
- var applyPmove = (state, cmd, trace, pointContents2) => {
1225
- let newState = { ...state };
1226
- newState = categorizePosition2(newState, trace);
1227
- newState = checkWater(newState, pointContents2);
1228
- const { origin, velocity, onGround, waterLevel, viewAngles } = newState;
1229
- const adjustedAngles = waterLevel >= 2 ? viewAngles : {
1230
- // For ground/air movement, reduce pitch influence (rerelease/p_move.cpp:1689)
1231
- x: viewAngles.x > 180 ? (viewAngles.x - 360) / 3 : viewAngles.x / 3,
1232
- y: viewAngles.y,
1233
- z: viewAngles.z
1234
- };
1235
- const { forward, right } = angleVectors(adjustedAngles);
1236
- const frictionedVelocity = applyPmoveFriction({
1237
- velocity,
1238
- frametime: FRAMETIME,
1239
- onGround,
1240
- groundIsSlick: false,
1241
- onLadder: false,
1242
- waterlevel: waterLevel,
1243
- pmFriction: 6,
1244
- pmStopSpeed: 100,
1245
- pmWaterFriction: 1
1246
- });
1247
- const wish = waterLevel >= 2 ? buildWaterWish({
1248
- forward,
1249
- right,
1250
- cmd,
1251
- maxSpeed: 320
1252
- }) : buildAirGroundWish({
1253
- forward,
1254
- right,
1255
- cmd,
1256
- maxSpeed: 320
1257
- });
1258
- const finalVelocity = applyPmoveAccelerate({
1259
- velocity: frictionedVelocity,
1260
- wishdir: wish.wishdir,
1261
- wishspeed: wish.wishspeed,
1262
- // Water movement uses ground acceleration (10), not air acceleration (1)
1263
- accel: onGround || waterLevel >= 2 ? 10 : 1,
1264
- frametime: FRAMETIME
1265
- });
1266
- const traceResult = trace(origin, {
1267
- x: origin.x + finalVelocity.x * FRAMETIME,
1268
- y: origin.y + finalVelocity.y * FRAMETIME,
1269
- z: origin.z + finalVelocity.z * FRAMETIME
1270
- });
1271
- return {
1272
- ...newState,
1273
- origin: traceResult.endpos,
1274
- velocity: finalVelocity
1275
- };
1276
- };
1277
- var WeaponId = /* @__PURE__ */ ((WeaponId22) => {
1278
- WeaponId22["Blaster"] = "blaster";
1279
- WeaponId22["Shotgun"] = "shotgun";
1280
- WeaponId22["SuperShotgun"] = "supershotgun";
1281
- WeaponId22["Machinegun"] = "machinegun";
1282
- WeaponId22["Chaingun"] = "chaingun";
1283
- WeaponId22["HandGrenade"] = "grenades";
1284
- WeaponId22["GrenadeLauncher"] = "grenadelauncher";
1285
- WeaponId22["RocketLauncher"] = "rocketlauncher";
1286
- WeaponId22["HyperBlaster"] = "hyperblaster";
1287
- WeaponId22["Railgun"] = "railgun";
1288
- WeaponId22["BFG10K"] = "bfg10k";
1289
- WeaponId22["Grapple"] = "grapple";
1290
- WeaponId22["ChainFist"] = "chainfist";
1291
- WeaponId22["EtfRifle"] = "etf_rifle";
1292
- WeaponId22["ProxLauncher"] = "prox_launcher";
1293
- WeaponId22["IonRipper"] = "ionripper";
1294
- WeaponId22["PlasmaBeam"] = "plasmabeam";
1295
- WeaponId22["Phalanx"] = "phalanx";
1296
- WeaponId22["Disruptor"] = "disruptor";
1297
- WeaponId22["Trap"] = "trap";
1298
- return WeaponId22;
1299
- })(WeaponId || {});
1300
- var AmmoType = /* @__PURE__ */ ((AmmoType22) => {
1301
- AmmoType22[AmmoType22["Bullets"] = 0] = "Bullets";
1302
- AmmoType22[AmmoType22["Shells"] = 1] = "Shells";
1303
- AmmoType22[AmmoType22["Rockets"] = 2] = "Rockets";
1304
- AmmoType22[AmmoType22["Grenades"] = 3] = "Grenades";
1305
- AmmoType22[AmmoType22["Cells"] = 4] = "Cells";
1306
- AmmoType22[AmmoType22["Slugs"] = 5] = "Slugs";
1307
- AmmoType22[AmmoType22["MagSlugs"] = 6] = "MagSlugs";
1308
- AmmoType22[AmmoType22["Trap"] = 7] = "Trap";
1309
- AmmoType22[AmmoType22["Flechettes"] = 8] = "Flechettes";
1310
- AmmoType22[AmmoType22["Tesla"] = 9] = "Tesla";
1311
- AmmoType22[AmmoType22["Disruptor"] = 10] = "Disruptor";
1312
- AmmoType22[AmmoType22["Prox"] = 11] = "Prox";
1313
- AmmoType22[AmmoType22["Nuke"] = 12] = "Nuke";
1314
- AmmoType22[AmmoType22["Rounds"] = 13] = "Rounds";
1315
- return AmmoType22;
1316
- })(AmmoType || {});
1317
- var AMMO_TYPE_COUNT = Object.keys(AmmoType).length / 2;
1318
- var AmmoItemId = /* @__PURE__ */ ((AmmoItemId22) => {
1319
- AmmoItemId22["Shells"] = "ammo_shells";
1320
- AmmoItemId22["Bullets"] = "ammo_bullets";
1321
- AmmoItemId22["Rockets"] = "ammo_rockets";
1322
- AmmoItemId22["Grenades"] = "ammo_grenades";
1323
- AmmoItemId22["Cells"] = "ammo_cells";
1324
- AmmoItemId22["Slugs"] = "ammo_slugs";
1325
- AmmoItemId22["MagSlugs"] = "ammo_magslug";
1326
- AmmoItemId22["Flechettes"] = "ammo_flechettes";
1327
- AmmoItemId22["Disruptor"] = "ammo_disruptor";
1328
- AmmoItemId22["Tesla"] = "ammo_tesla";
1329
- AmmoItemId22["Trap"] = "ammo_trap";
1330
- AmmoItemId22["Prox"] = "ammo_prox";
1331
- return AmmoItemId22;
1332
- })(AmmoItemId || {});
1333
- var WEAPON_WHEEL_ORDER = [
1334
- "blaster",
1335
- "shotgun",
1336
- "supershotgun",
1337
- "machinegun",
1338
- "chaingun",
1339
- "grenadelauncher",
1340
- "rocketlauncher",
1341
- "grenades",
1342
- "hyperblaster",
1343
- "railgun",
1344
- "bfg10k"
1345
- /* BFG10K */
1346
- ];
1347
1241
 
1348
1242
  // src/inventory/ammo.ts
1349
- var AMMO_ITEM_DEFINITIONS = {
1350
- [AmmoItemId.Shells]: { id: AmmoItemId.Shells, ammoType: AmmoType.Shells, quantity: 10, weaponAmmo: false },
1351
- [AmmoItemId.Bullets]: { id: AmmoItemId.Bullets, ammoType: AmmoType.Bullets, quantity: 50, weaponAmmo: false },
1352
- [AmmoItemId.Rockets]: { id: AmmoItemId.Rockets, ammoType: AmmoType.Rockets, quantity: 5, weaponAmmo: false },
1353
- [AmmoItemId.Grenades]: { id: AmmoItemId.Grenades, ammoType: AmmoType.Grenades, quantity: 5, weaponAmmo: true },
1354
- [AmmoItemId.Cells]: { id: AmmoItemId.Cells, ammoType: AmmoType.Cells, quantity: 50, weaponAmmo: false },
1355
- [AmmoItemId.Slugs]: { id: AmmoItemId.Slugs, ammoType: AmmoType.Slugs, quantity: 10, weaponAmmo: false },
1356
- [AmmoItemId.MagSlugs]: { id: AmmoItemId.MagSlugs, ammoType: AmmoType.MagSlugs, quantity: 10, weaponAmmo: false },
1357
- [AmmoItemId.Flechettes]: { id: AmmoItemId.Flechettes, ammoType: AmmoType.Flechettes, quantity: 50, weaponAmmo: false },
1358
- [AmmoItemId.Disruptor]: { id: AmmoItemId.Disruptor, ammoType: AmmoType.Disruptor, quantity: 15, weaponAmmo: false },
1359
- [AmmoItemId.Tesla]: { id: AmmoItemId.Tesla, ammoType: AmmoType.Tesla, quantity: 5, weaponAmmo: false },
1360
- [AmmoItemId.Trap]: { id: AmmoItemId.Trap, ammoType: AmmoType.Trap, quantity: 5, weaponAmmo: false },
1361
- [AmmoItemId.Prox]: { id: AmmoItemId.Prox, ammoType: AmmoType.Prox, quantity: 5, weaponAmmo: false }
1362
- };
1363
1243
  function getAmmoItemDefinition(id) {
1364
1244
  return AMMO_ITEM_DEFINITIONS[id];
1365
1245
  }
@@ -1413,54 +1293,55 @@ function pickupAmmo(inventory, itemId, options = {}) {
1413
1293
  const amount = options.countOverride ?? def.quantity;
1414
1294
  return addAmmo(inventory, def.ammoType, amount);
1415
1295
  }
1296
+ var AMMO_ITEM_DEFINITIONS;
1297
+ var init_ammo = __esm({
1298
+ "src/inventory/ammo.ts"() {
1299
+ "use strict";
1300
+ init_esm();
1301
+ AMMO_ITEM_DEFINITIONS = {
1302
+ [AmmoItemId.Shells]: { id: AmmoItemId.Shells, ammoType: AmmoType.Shells, quantity: 10, weaponAmmo: false },
1303
+ [AmmoItemId.Bullets]: { id: AmmoItemId.Bullets, ammoType: AmmoType.Bullets, quantity: 50, weaponAmmo: false },
1304
+ [AmmoItemId.Rockets]: { id: AmmoItemId.Rockets, ammoType: AmmoType.Rockets, quantity: 5, weaponAmmo: false },
1305
+ [AmmoItemId.Grenades]: { id: AmmoItemId.Grenades, ammoType: AmmoType.Grenades, quantity: 5, weaponAmmo: true },
1306
+ [AmmoItemId.Cells]: { id: AmmoItemId.Cells, ammoType: AmmoType.Cells, quantity: 50, weaponAmmo: false },
1307
+ [AmmoItemId.Slugs]: { id: AmmoItemId.Slugs, ammoType: AmmoType.Slugs, quantity: 10, weaponAmmo: false },
1308
+ [AmmoItemId.MagSlugs]: { id: AmmoItemId.MagSlugs, ammoType: AmmoType.MagSlugs, quantity: 10, weaponAmmo: false },
1309
+ [AmmoItemId.Flechettes]: { id: AmmoItemId.Flechettes, ammoType: AmmoType.Flechettes, quantity: 50, weaponAmmo: false },
1310
+ [AmmoItemId.Disruptor]: { id: AmmoItemId.Disruptor, ammoType: AmmoType.Disruptor, quantity: 15, weaponAmmo: false },
1311
+ [AmmoItemId.Tesla]: { id: AmmoItemId.Tesla, ammoType: AmmoType.Tesla, quantity: 5, weaponAmmo: false },
1312
+ [AmmoItemId.Trap]: { id: AmmoItemId.Trap, ammoType: AmmoType.Trap, quantity: 5, weaponAmmo: false },
1313
+ [AmmoItemId.Prox]: { id: AmmoItemId.Prox, ammoType: AmmoType.Prox, quantity: 5, weaponAmmo: false }
1314
+ };
1315
+ }
1316
+ });
1416
1317
 
1417
1318
  // src/combat/damageFlags.ts
1418
- var DamageFlags = /* @__PURE__ */ ((DamageFlags2) => {
1419
- DamageFlags2[DamageFlags2["NONE"] = 0] = "NONE";
1420
- DamageFlags2[DamageFlags2["RADIUS"] = 1] = "RADIUS";
1421
- DamageFlags2[DamageFlags2["NO_ARMOR"] = 2] = "NO_ARMOR";
1422
- DamageFlags2[DamageFlags2["ENERGY"] = 4] = "ENERGY";
1423
- DamageFlags2[DamageFlags2["NO_KNOCKBACK"] = 8] = "NO_KNOCKBACK";
1424
- DamageFlags2[DamageFlags2["BULLET"] = 16] = "BULLET";
1425
- DamageFlags2[DamageFlags2["NO_PROTECTION"] = 32] = "NO_PROTECTION";
1426
- DamageFlags2[DamageFlags2["DESTROY_ARMOR"] = 64] = "DESTROY_ARMOR";
1427
- DamageFlags2[DamageFlags2["NO_REG_ARMOR"] = 128] = "NO_REG_ARMOR";
1428
- DamageFlags2[DamageFlags2["NO_POWER_ARMOR"] = 256] = "NO_POWER_ARMOR";
1429
- DamageFlags2[DamageFlags2["NO_INDICATOR"] = 512] = "NO_INDICATOR";
1430
- DamageFlags2[DamageFlags2["NO_DAMAGE_EFFECTS"] = 1024] = "NO_DAMAGE_EFFECTS";
1431
- return DamageFlags2;
1432
- })(DamageFlags || {});
1433
1319
  function hasAnyDamageFlag(flags, mask) {
1434
1320
  return (flags & mask) !== 0;
1435
1321
  }
1322
+ var DamageFlags;
1323
+ var init_damageFlags = __esm({
1324
+ "src/combat/damageFlags.ts"() {
1325
+ "use strict";
1326
+ DamageFlags = /* @__PURE__ */ ((DamageFlags2) => {
1327
+ DamageFlags2[DamageFlags2["NONE"] = 0] = "NONE";
1328
+ DamageFlags2[DamageFlags2["RADIUS"] = 1] = "RADIUS";
1329
+ DamageFlags2[DamageFlags2["NO_ARMOR"] = 2] = "NO_ARMOR";
1330
+ DamageFlags2[DamageFlags2["ENERGY"] = 4] = "ENERGY";
1331
+ DamageFlags2[DamageFlags2["NO_KNOCKBACK"] = 8] = "NO_KNOCKBACK";
1332
+ DamageFlags2[DamageFlags2["BULLET"] = 16] = "BULLET";
1333
+ DamageFlags2[DamageFlags2["NO_PROTECTION"] = 32] = "NO_PROTECTION";
1334
+ DamageFlags2[DamageFlags2["DESTROY_ARMOR"] = 64] = "DESTROY_ARMOR";
1335
+ DamageFlags2[DamageFlags2["NO_REG_ARMOR"] = 128] = "NO_REG_ARMOR";
1336
+ DamageFlags2[DamageFlags2["NO_POWER_ARMOR"] = 256] = "NO_POWER_ARMOR";
1337
+ DamageFlags2[DamageFlags2["NO_INDICATOR"] = 512] = "NO_INDICATOR";
1338
+ DamageFlags2[DamageFlags2["NO_DAMAGE_EFFECTS"] = 1024] = "NO_DAMAGE_EFFECTS";
1339
+ return DamageFlags2;
1340
+ })(DamageFlags || {});
1341
+ }
1342
+ });
1436
1343
 
1437
1344
  // src/combat/armor.ts
1438
- var ArmorType = /* @__PURE__ */ ((ArmorType2) => {
1439
- ArmorType2["BODY"] = "body";
1440
- ArmorType2["COMBAT"] = "combat";
1441
- ArmorType2["JACKET"] = "jacket";
1442
- return ArmorType2;
1443
- })(ArmorType || {});
1444
- var ARMOR_INFO = {
1445
- ["jacket" /* JACKET */]: {
1446
- baseCount: 25,
1447
- maxCount: 50,
1448
- normalProtection: 0.3,
1449
- energyProtection: 0
1450
- },
1451
- ["combat" /* COMBAT */]: {
1452
- baseCount: 50,
1453
- maxCount: 100,
1454
- normalProtection: 0.6,
1455
- energyProtection: 0.3
1456
- },
1457
- ["body" /* BODY */]: {
1458
- baseCount: 100,
1459
- maxCount: 200,
1460
- normalProtection: 0.8,
1461
- energyProtection: 0.6
1462
- }
1463
- };
1464
1345
  function applyRegularArmor(damage, flags, state) {
1465
1346
  if (damage <= 0 || hasAnyDamageFlag(flags, 2 /* NO_ARMOR */ | 128 /* NO_REG_ARMOR */) || !state.armorType || state.armorCount <= 0) {
1466
1347
  return { saved: 0, remainingArmor: state.armorCount };
@@ -1524,28 +1405,42 @@ function applyPowerArmor(damage, flags, hitPoint, _hitNormal, state, options = {
1524
1405
  const remainingCells = Math.max(0, state.cellCount - cellsSpent);
1525
1406
  return { saved, remainingCells };
1526
1407
  }
1408
+ var ArmorType, ARMOR_INFO;
1409
+ var init_armor = __esm({
1410
+ "src/combat/armor.ts"() {
1411
+ "use strict";
1412
+ init_esm();
1413
+ init_damageFlags();
1414
+ ArmorType = /* @__PURE__ */ ((ArmorType2) => {
1415
+ ArmorType2["BODY"] = "body";
1416
+ ArmorType2["COMBAT"] = "combat";
1417
+ ArmorType2["JACKET"] = "jacket";
1418
+ return ArmorType2;
1419
+ })(ArmorType || {});
1420
+ ARMOR_INFO = {
1421
+ ["jacket" /* JACKET */]: {
1422
+ baseCount: 25,
1423
+ maxCount: 50,
1424
+ normalProtection: 0.3,
1425
+ energyProtection: 0
1426
+ },
1427
+ ["combat" /* COMBAT */]: {
1428
+ baseCount: 50,
1429
+ maxCount: 100,
1430
+ normalProtection: 0.6,
1431
+ energyProtection: 0.3
1432
+ },
1433
+ ["body" /* BODY */]: {
1434
+ baseCount: 100,
1435
+ maxCount: 200,
1436
+ normalProtection: 0.8,
1437
+ energyProtection: 0.6
1438
+ }
1439
+ };
1440
+ }
1441
+ });
1527
1442
 
1528
1443
  // src/inventory/playerInventory.ts
1529
- var KeyId = /* @__PURE__ */ ((KeyId2) => {
1530
- KeyId2["Blue"] = "key_blue";
1531
- KeyId2["Red"] = "key_red";
1532
- KeyId2["Green"] = "key_green";
1533
- KeyId2["Yellow"] = "key_yellow";
1534
- KeyId2["DataCD"] = "key_data_cd";
1535
- KeyId2["PowerCube"] = "key_power_cube";
1536
- KeyId2["ExplosiveCharges"] = "key_explosive_charges";
1537
- KeyId2["PowerCore"] = "key_power_core";
1538
- KeyId2["Pyramid"] = "key_pyramid";
1539
- KeyId2["DataSpinner"] = "key_data_spinner";
1540
- KeyId2["Pass"] = "key_pass";
1541
- KeyId2["CommanderHead"] = "key_commander_head";
1542
- KeyId2["Airstrike"] = "key_airstrike";
1543
- KeyId2["NukeContainer"] = "key_nuke_container";
1544
- KeyId2["Nuke"] = "key_nuke";
1545
- KeyId2["RedFlag"] = "key_red_flag";
1546
- KeyId2["BlueFlag"] = "key_blue_flag";
1547
- return KeyId2;
1548
- })(KeyId || {});
1549
1444
  function createPlayerInventory(init = {}) {
1550
1445
  const ammoCaps = init.ammoCaps;
1551
1446
  const inv = {
@@ -1818,8 +1713,291 @@ function deserializePlayerInventory(serialized, options = {}) {
1818
1713
  items: new Set(serialized.items)
1819
1714
  };
1820
1715
  }
1716
+ var KeyId;
1717
+ var init_playerInventory = __esm({
1718
+ "src/inventory/playerInventory.ts"() {
1719
+ "use strict";
1720
+ init_ammo();
1721
+ init_esm();
1722
+ init_armor();
1723
+ KeyId = /* @__PURE__ */ ((KeyId2) => {
1724
+ KeyId2["Blue"] = "key_blue";
1725
+ KeyId2["Red"] = "key_red";
1726
+ KeyId2["Green"] = "key_green";
1727
+ KeyId2["Yellow"] = "key_yellow";
1728
+ KeyId2["DataCD"] = "key_data_cd";
1729
+ KeyId2["PowerCube"] = "key_power_cube";
1730
+ KeyId2["ExplosiveCharges"] = "key_explosive_charges";
1731
+ KeyId2["PowerCore"] = "key_power_core";
1732
+ KeyId2["Pyramid"] = "key_pyramid";
1733
+ KeyId2["DataSpinner"] = "key_data_spinner";
1734
+ KeyId2["Pass"] = "key_pass";
1735
+ KeyId2["CommanderHead"] = "key_commander_head";
1736
+ KeyId2["Airstrike"] = "key_airstrike";
1737
+ KeyId2["NukeContainer"] = "key_nuke_container";
1738
+ KeyId2["Nuke"] = "key_nuke";
1739
+ KeyId2["RedFlag"] = "key_red_flag";
1740
+ KeyId2["BlueFlag"] = "key_blue_flag";
1741
+ return KeyId2;
1742
+ })(KeyId || {});
1743
+ }
1744
+ });
1745
+
1746
+ // src/combat/weapons/state.ts
1747
+ function createPlayerWeaponStates() {
1748
+ return {
1749
+ states: /* @__PURE__ */ new Map()
1750
+ };
1751
+ }
1752
+ function getWeaponState(playerStates, weaponId) {
1753
+ let state = playerStates.states.get(weaponId);
1754
+ if (!state) {
1755
+ state = { lastFireTime: 0 };
1756
+ playerStates.states.set(weaponId, state);
1757
+ }
1758
+ return state;
1759
+ }
1760
+ var WeaponStateEnum;
1761
+ var init_state = __esm({
1762
+ "src/combat/weapons/state.ts"() {
1763
+ "use strict";
1764
+ WeaponStateEnum = /* @__PURE__ */ ((WeaponStateEnum2) => {
1765
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_READY"] = 0] = "WEAPON_READY";
1766
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_ACTIVATING"] = 1] = "WEAPON_ACTIVATING";
1767
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_DROPPING"] = 2] = "WEAPON_DROPPING";
1768
+ WeaponStateEnum2[WeaponStateEnum2["WEAPON_FIRING"] = 3] = "WEAPON_FIRING";
1769
+ return WeaponStateEnum2;
1770
+ })(WeaponStateEnum || {});
1771
+ }
1772
+ });
1773
+
1774
+ // src/combat/weapons/switching.ts
1775
+ var switching_exports = {};
1776
+ __export(switching_exports, {
1777
+ ChangeWeapon: () => ChangeWeapon,
1778
+ NoAmmoWeaponChange: () => NoAmmoWeaponChange,
1779
+ setInstantSwitch: () => setInstantSwitch,
1780
+ switchToBestWeapon: () => switchToBestWeapon
1781
+ });
1782
+ function setInstantSwitch(enabled) {
1783
+ instantSwitch = enabled;
1784
+ }
1785
+ function ChangeWeapon(ent, weaponId) {
1786
+ if (!ent.client) return;
1787
+ const client = ent.client;
1788
+ if (client.weaponstate === 2 /* WEAPON_DROPPING */) {
1789
+ return;
1790
+ }
1791
+ if (weaponId) {
1792
+ selectWeapon(client.inventory, weaponId);
1793
+ client.weaponstate = 1 /* WEAPON_ACTIVATING */;
1794
+ client.gun_frame = 0;
1795
+ if (instantSwitch) {
1796
+ client.weaponstate = 0 /* WEAPON_READY */;
1797
+ client.weapon_think_time = 0;
1798
+ return;
1799
+ }
1800
+ client.weapon_think_time = 0;
1801
+ }
1802
+ }
1803
+ function NoAmmoWeaponChange(ent) {
1804
+ if (!ent.client) return;
1805
+ switchToBestWeapon(ent);
1806
+ }
1807
+ function switchToBestWeapon(player) {
1808
+ if (!player.client) {
1809
+ return;
1810
+ }
1811
+ const inventory = player.client.inventory;
1812
+ let bestWeapon = null;
1813
+ if (inventory.ownedWeapons.has(WeaponId.BFG10K) && inventory.ammo.counts[AmmoType.Cells] >= 50) {
1814
+ bestWeapon = WeaponId.BFG10K;
1815
+ } else if (inventory.ownedWeapons.has(WeaponId.RocketLauncher) && inventory.ammo.counts[AmmoType.Rockets] >= 1) {
1816
+ bestWeapon = WeaponId.RocketLauncher;
1817
+ } else if (inventory.ownedWeapons.has(WeaponId.Railgun) && inventory.ammo.counts[AmmoType.Slugs] >= 1) {
1818
+ bestWeapon = WeaponId.Railgun;
1819
+ } else if (inventory.ownedWeapons.has(WeaponId.Chaingun) && inventory.ammo.counts[AmmoType.Bullets] >= 1) {
1820
+ bestWeapon = WeaponId.Chaingun;
1821
+ } else if (inventory.ownedWeapons.has(WeaponId.SuperShotgun) && inventory.ammo.counts[AmmoType.Shells] >= 2) {
1822
+ bestWeapon = WeaponId.SuperShotgun;
1823
+ } else if (inventory.ownedWeapons.has(WeaponId.Machinegun) && inventory.ammo.counts[AmmoType.Bullets] >= 1) {
1824
+ bestWeapon = WeaponId.Machinegun;
1825
+ } else if (inventory.ownedWeapons.has(WeaponId.Shotgun) && inventory.ammo.counts[AmmoType.Shells] >= 1) {
1826
+ bestWeapon = WeaponId.Shotgun;
1827
+ } else {
1828
+ bestWeapon = WeaponId.Blaster;
1829
+ }
1830
+ if (bestWeapon && bestWeapon !== inventory.currentWeapon) {
1831
+ selectWeapon(inventory, bestWeapon);
1832
+ player.client.weaponstate = 1 /* WEAPON_ACTIVATING */;
1833
+ player.client.gun_frame = 0;
1834
+ if (instantSwitch) {
1835
+ player.client.weaponstate = 0 /* WEAPON_READY */;
1836
+ }
1837
+ player.client.weapon_think_time = 0;
1838
+ }
1839
+ }
1840
+ var instantSwitch;
1841
+ var init_switching = __esm({
1842
+ "src/combat/weapons/switching.ts"() {
1843
+ "use strict";
1844
+ init_playerInventory();
1845
+ init_ammo();
1846
+ instantSwitch = false;
1847
+ }
1848
+ });
1849
+
1850
+ // src/index.ts
1851
+ var index_exports = {};
1852
+ __export(index_exports, {
1853
+ AIFlags: () => AIFlags,
1854
+ AMMO_TYPE_COUNT: () => AMMO_TYPE_COUNT,
1855
+ ARMOR_INFO: () => ARMOR_INFO,
1856
+ ARMOR_ITEMS: () => ARMOR_ITEMS,
1857
+ AmmoItemId: () => AmmoItemId,
1858
+ AmmoType: () => AmmoType,
1859
+ ArmorType: () => ArmorType,
1860
+ AttackState: () => AttackState,
1861
+ CheckGround: () => CheckGround,
1862
+ DamageFlags: () => DamageFlags,
1863
+ DamageMod: () => DamageMod,
1864
+ DeadFlag: () => DeadFlag,
1865
+ ENTITY_FIELD_METADATA: () => ENTITY_FIELD_METADATA,
1866
+ Entity: () => Entity,
1867
+ EntityDamageFlags: () => EntityDamageFlags,
1868
+ EntitySystem: () => EntitySystem,
1869
+ EnvironmentalFlags: () => EnvironmentalFlags,
1870
+ FL_NOTARGET: () => FL_NOTARGET,
1871
+ FL_NOVISIBLE: () => FL_NOVISIBLE,
1872
+ HEALTH_ITEMS: () => HEALTH_ITEMS,
1873
+ KEY_ITEMS: () => KEY_ITEMS,
1874
+ KeyId: () => KeyId,
1875
+ M_CheckBottom: () => M_CheckBottom,
1876
+ M_MoveFrame: () => M_MoveFrame,
1877
+ M_walkmove: () => M_walkmove,
1878
+ MoveType: () => MoveType,
1879
+ MulticastType: () => MulticastType,
1880
+ ORDERED_DAMAGE_MODS: () => ORDERED_DAMAGE_MODS,
1881
+ PNOISE_IMPACT: () => PNOISE_IMPACT,
1882
+ PNOISE_SELF: () => PNOISE_SELF,
1883
+ PNOISE_WEAPON: () => PNOISE_WEAPON,
1884
+ POWERUP_ITEMS: () => POWERUP_ITEMS,
1885
+ POWER_ARMOR_ITEMS: () => POWER_ARMOR_ITEMS,
1886
+ PlayerNoise: () => PlayerNoise,
1887
+ PowerupId: () => PowerupId,
1888
+ RANGE_MELEE: () => RANGE_MELEE,
1889
+ RANGE_MID: () => RANGE_MID,
1890
+ RANGE_NEAR: () => RANGE_NEAR,
1891
+ Range: () => RangeCategory,
1892
+ RangeCategory: () => RangeCategory,
1893
+ SAVE_FORMAT_VERSION: () => SAVE_FORMAT_VERSION,
1894
+ SPAWNFLAG_MONSTER_AMBUSH: () => SPAWNFLAG_MONSTER_AMBUSH,
1895
+ SV_NewChaseDir: () => SV_NewChaseDir,
1896
+ SV_StepDirection: () => SV_StepDirection,
1897
+ SaveStorage: () => SaveStorage,
1898
+ ServerFlags: () => ServerFlags,
1899
+ Solid: () => Solid,
1900
+ SpawnRegistry: () => SpawnRegistry,
1901
+ T_Damage: () => T_Damage,
1902
+ T_RadiusDamage: () => T_RadiusDamage,
1903
+ TraceMask: () => TraceMask,
1904
+ WEAPONS: () => WEAPONS,
1905
+ WEAPON_ITEMS: () => WEAPON_ITEMS,
1906
+ WeaponId: () => WeaponId,
1907
+ WeaponStateEnum: () => WeaponStateEnum,
1908
+ WeaponType: () => WeaponType,
1909
+ addAmmo: () => addAmmo,
1910
+ addKey: () => addKey,
1911
+ addPowerup: () => addPowerup,
1912
+ ai_charge: () => ai_charge,
1913
+ ai_face: () => ai_face,
1914
+ ai_move: () => ai_move,
1915
+ ai_run: () => ai_run,
1916
+ ai_stand: () => ai_stand,
1917
+ ai_turn: () => ai_turn,
1918
+ ai_walk: () => ai_walk,
1919
+ applyCrushDamage: () => applyCrushDamage,
1920
+ applyEntityKeyValues: () => applyEntityKeyValues,
1921
+ applyEnvironmentalDamage: () => applyEnvironmentalDamage,
1922
+ applyFallingDamage: () => applyFallingDamage,
1923
+ applyPowerArmor: () => applyPowerArmor,
1924
+ applyRegularArmor: () => applyRegularArmor,
1925
+ applySaveFile: () => applySaveFile,
1926
+ calculateFallingDamage: () => calculateFallingDamage,
1927
+ calculateSaveChecksum: () => calculateSaveChecksum,
1928
+ canPickupHealth: () => canPickupHealth,
1929
+ changeYaw: () => changeYaw,
1930
+ clampAmmoCounts: () => clampAmmoCounts,
1931
+ classifyRange: () => classifyRange,
1932
+ clearExpiredPowerups: () => clearExpiredPowerups,
1933
+ convertGameSaveToRereleaseLevel: () => convertGameSaveToRereleaseLevel,
1934
+ convertRereleaseLevelToGameSave: () => convertRereleaseLevelToGameSave,
1935
+ convertRereleaseSaveToGameSave: () => convertRereleaseSaveToGameSave,
1936
+ createAmmoInventory: () => createAmmoInventory,
1937
+ createAmmoPickupEntity: () => createAmmoPickupEntity,
1938
+ createArmorPickupEntity: () => createArmorPickupEntity,
1939
+ createBaseAmmoCaps: () => createBaseAmmoCaps,
1940
+ createCallbackRegistry: () => createCallbackRegistry,
1941
+ createDefaultSpawnRegistry: () => createDefaultSpawnRegistry,
1942
+ createGame: () => createGame,
1943
+ createHealthPickupEntity: () => createHealthPickupEntity,
1944
+ createKeyPickupEntity: () => createKeyPickupEntity,
1945
+ createPlayerInventory: () => createPlayerInventory,
1946
+ createPlayerWeaponStates: () => createPlayerWeaponStates,
1947
+ createPowerupPickupEntity: () => createPowerupPickupEntity,
1948
+ createSaveFile: () => createSaveFile,
1949
+ createWeaponPickupEntity: () => createWeaponPickupEntity,
1950
+ damageModName: () => damageModName,
1951
+ deserializePlayerInventory: () => deserializePlayerInventory,
1952
+ equipArmor: () => equipArmor,
1953
+ facingIdeal: () => facingIdeal,
1954
+ findTarget: () => findTarget,
1955
+ foundTarget: () => foundTarget,
1956
+ getAmmoItemDefinition: () => getAmmoItemDefinition,
1957
+ getWeaponState: () => getWeaponState,
1958
+ giveAmmoItem: () => giveAmmoItem,
1959
+ giveWeapon: () => giveWeapon,
1960
+ hasAnyDamageFlag: () => hasAnyDamageFlag,
1961
+ hasItem: () => hasItem,
1962
+ hasKey: () => hasKey,
1963
+ hasPowerup: () => hasPowerup,
1964
+ hasWeapon: () => hasWeapon,
1965
+ hashEntitySystem: () => hashEntitySystem,
1966
+ hashGameState: () => hashGameState,
1967
+ huntTarget: () => huntTarget,
1968
+ infront: () => infront,
1969
+ isZeroVector: () => isZeroVector,
1970
+ killBox: () => killBox,
1971
+ monster_think: () => monster_think,
1972
+ parseEntityLump: () => parseEntityLump,
1973
+ parseRereleaseSave: () => parseRereleaseSave,
1974
+ parseSaveFile: () => parseSaveFile,
1975
+ pickupAmmo: () => pickupAmmo,
1976
+ pickupArmor: () => pickupArmor,
1977
+ pickupKey: () => pickupKey,
1978
+ pickupPowerArmor: () => pickupPowerArmor,
1979
+ pickupPowerup: () => pickupPowerup,
1980
+ pickupWeapon: () => pickupWeapon,
1981
+ range: () => rangeTo,
1982
+ rangeTo: () => rangeTo,
1983
+ registerCallback: () => registerCallback,
1984
+ registerDefaultSpawns: () => registerDefaultSpawns,
1985
+ selectWeapon: () => selectWeapon,
1986
+ serializePlayerInventory: () => serializePlayerInventory,
1987
+ serializeRereleaseSave: () => serializeRereleaseSave,
1988
+ setMovedir: () => setMovedir,
1989
+ spawnEntitiesFromText: () => spawnEntitiesFromText,
1990
+ spawnEntityFromDictionary: () => spawnEntityFromDictionary,
1991
+ summarizeRereleaseSave: () => summarizeRereleaseSave,
1992
+ visible: () => visible,
1993
+ walkMove: () => walkMove
1994
+ });
1995
+ module.exports = __toCommonJS(index_exports);
1821
1996
 
1822
1997
  // src/entities/entity.ts
1998
+ init_esm();
1999
+ init_playerInventory();
2000
+ init_ammo();
1823
2001
  var MoveType = /* @__PURE__ */ ((MoveType3) => {
1824
2002
  MoveType3[MoveType3["None"] = 0] = "None";
1825
2003
  MoveType3[MoveType3["Noclip"] = 1] = "Noclip";
@@ -2205,6 +2383,16 @@ var ENTITY_FIELD_METADATA = [
2205
2383
  // Added
2206
2384
  ];
2207
2385
 
2386
+ // src/entities/system.ts
2387
+ init_esm();
2388
+
2389
+ // src/physics/movement.ts
2390
+ init_esm();
2391
+
2392
+ // src/ai/movement.ts
2393
+ init_esm();
2394
+ init_esm();
2395
+
2208
2396
  // src/ai/constants.ts
2209
2397
  var RANGE_MELEE = 20;
2210
2398
  var RANGE_NEAR = 440;
@@ -2247,6 +2435,8 @@ var TraceMask = /* @__PURE__ */ ((TraceMask2) => {
2247
2435
  })(TraceMask || {});
2248
2436
 
2249
2437
  // src/ai/perception.ts
2438
+ init_esm();
2439
+ init_esm();
2250
2440
  var RangeCategory = /* @__PURE__ */ ((RangeCategory4) => {
2251
2441
  RangeCategory4["Melee"] = "melee";
2252
2442
  RangeCategory4["Near"] = "near";
@@ -2307,6 +2497,7 @@ function visible(self, other, trace, options) {
2307
2497
  }
2308
2498
 
2309
2499
  // src/ai/targeting.ts
2500
+ init_esm();
2310
2501
  function setIdealYawTowards(self, other) {
2311
2502
  const delta = {
2312
2503
  x: other.origin.x - self.origin.x,
@@ -2965,6 +3156,7 @@ function runPush(pusher, system, imports, frametime) {
2965
3156
  }
2966
3157
 
2967
3158
  // src/physics/fluid.ts
3159
+ init_esm();
2968
3160
  function checkWater2(ent, system, imports) {
2969
3161
  const origin = ent.origin;
2970
3162
  const mins = ent.mins;
@@ -3267,6 +3459,7 @@ var ThinkScheduler = class {
3267
3459
  };
3268
3460
 
3269
3461
  // src/entities/system.ts
3462
+ init_esm();
3270
3463
  function computeBounds(entity) {
3271
3464
  return {
3272
3465
  min: {
@@ -3399,6 +3592,9 @@ var EntitySystem = class {
3399
3592
  get pointcontents() {
3400
3593
  return this.imports.pointcontents;
3401
3594
  }
3595
+ get game() {
3596
+ return this._game;
3597
+ }
3402
3598
  get world() {
3403
3599
  return this.pool.world;
3404
3600
  }
@@ -3919,6 +4115,15 @@ function damageModName(mod) {
3919
4115
  return `MOD_${DamageMod[mod]}`;
3920
4116
  }
3921
4117
 
4118
+ // src/entities/misc.ts
4119
+ init_esm();
4120
+
4121
+ // src/combat/damage.ts
4122
+ init_esm();
4123
+ init_armor();
4124
+ init_damageFlags();
4125
+ init_esm();
4126
+
3922
4127
  // src/imports.ts
3923
4128
  var MulticastType = /* @__PURE__ */ ((MulticastType2) => {
3924
4129
  MulticastType2[MulticastType2["All"] = 0] = "All";
@@ -4172,7 +4377,11 @@ function registerMiscSpawns(registry) {
4172
4377
  registry.register("func_object", func_object);
4173
4378
  }
4174
4379
 
4380
+ // src/entities/targets.ts
4381
+ init_esm();
4382
+
4175
4383
  // src/entities/utils.ts
4384
+ init_esm();
4176
4385
  var VEC_UP = { x: 0, y: -1, z: 0 };
4177
4386
  var MOVEDIR_UP = { x: 0, y: 0, z: 1 };
4178
4387
  var VEC_DOWN = { x: 0, y: -2, z: 0 };
@@ -4194,6 +4403,7 @@ function setMovedir(angles) {
4194
4403
  }
4195
4404
 
4196
4405
  // src/entities/projectiles.ts
4406
+ init_esm();
4197
4407
  function createRocket(sys, owner, start, dir, damage, radiusDamage, speed, flashtype = 0) {
4198
4408
  const rocket = sys.spawn();
4199
4409
  rocket.classname = "rocket";
@@ -4649,6 +4859,7 @@ function useTargetSpawner(self, other, activator, context, registry) {
4649
4859
  warn: context.warn,
4650
4860
  free: context.free
4651
4861
  };
4862
+ ent.monsterinfo.aiflags |= 1024 /* DoNotCount */;
4652
4863
  spawnFunc(ent, spawnContext);
4653
4864
  context.entities.finalizeSpawn(ent);
4654
4865
  context.entities.linkentity(ent);
@@ -4656,6 +4867,7 @@ function useTargetSpawner(self, other, activator, context, registry) {
4656
4867
  if (self.speed) {
4657
4868
  ent.velocity = { ...self.movedir };
4658
4869
  }
4870
+ ent.renderfx |= RenderFx.IrVisible;
4659
4871
  }
4660
4872
  var SPAWNFLAG_BLASTER_NOTRAIL = 1;
4661
4873
  var SPAWNFLAG_BLASTER_NOEFFECTS = 2;
@@ -5041,6 +5253,7 @@ function registerTargetSpawns(registry) {
5041
5253
  }
5042
5254
 
5043
5255
  // src/entities/triggers.ts
5256
+ init_esm();
5044
5257
  var FRAME_TIME_SECONDS = 1 / 40;
5045
5258
  var THINK_INTERVAL = 0.1;
5046
5259
  var HURT_INTERVAL = 0.1;
@@ -5483,151 +5696,809 @@ function registerTriggerGravity(registry) {
5483
5696
  self.touch = self.solid === 1 /* Trigger */ ? touchHandler : void 0;
5484
5697
  };
5485
5698
  }
5486
- });
5487
- }
5488
- function monsterJumpTouch(self, other) {
5489
- if (!other) {
5699
+ });
5700
+ }
5701
+ function monsterJumpTouch(self, other) {
5702
+ if (!other) {
5703
+ return;
5704
+ }
5705
+ if ((other.flags & (1 /* Fly */ | 2 /* Swim */)) !== 0) {
5706
+ return;
5707
+ }
5708
+ if (other.svflags & 2 /* DeadMonster */) {
5709
+ return;
5710
+ }
5711
+ if ((other.svflags & 4 /* Monster */) === 0) {
5712
+ return;
5713
+ }
5714
+ other.velocity = {
5715
+ x: self.movedir.x * self.speed,
5716
+ y: self.movedir.y * self.speed,
5717
+ z: other.velocity.z
5718
+ };
5719
+ if (!other.groundentity) {
5720
+ return;
5721
+ }
5722
+ other.groundentity = null;
5723
+ other.velocity = { x: other.velocity.x, y: other.velocity.y, z: self.movedir.z };
5724
+ }
5725
+ function triggerElevatorUse(self, other, entities, warn) {
5726
+ if (!self.movetarget) {
5727
+ return;
5728
+ }
5729
+ if (self.movetarget.nextthink > 0) {
5730
+ return;
5731
+ }
5732
+ if (!other?.pathtarget) {
5733
+ warn("trigger_elevator used with no pathtarget");
5734
+ return;
5735
+ }
5736
+ const target = entities.pickTarget(other.pathtarget);
5737
+ if (!target) {
5738
+ warn(`trigger_elevator used with bad pathtarget: ${other.pathtarget}`);
5739
+ return;
5740
+ }
5741
+ self.movetarget.target_ent = target;
5742
+ trainResume(self.movetarget, entities);
5743
+ }
5744
+ function triggerElevatorInit(self, entities, warn) {
5745
+ if (!self.target) {
5746
+ warn("trigger_elevator has no target");
5747
+ return;
5748
+ }
5749
+ const target = entities.pickTarget(self.target);
5750
+ if (!target) {
5751
+ warn(`trigger_elevator unable to find target ${self.target}`);
5752
+ return;
5753
+ }
5754
+ self.movetarget = target;
5755
+ if (target.classname !== "func_train") {
5756
+ warn(`trigger_elevator target ${self.target} is not a train`);
5757
+ return;
5758
+ }
5759
+ self.use = (entity, other, activator) => triggerElevatorUse(entity, other ?? activator ?? null, entities, warn);
5760
+ self.svflags |= 1 /* NoClient */;
5761
+ }
5762
+ function registerTriggerElevator(registry) {
5763
+ registry.register("trigger_elevator", (entity, context) => {
5764
+ entity.think = (self) => triggerElevatorInit(self, context.entities, context.warn);
5765
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + FRAME_TIME_SECONDS);
5766
+ });
5767
+ }
5768
+ function registerTriggerMonsterJump(registry) {
5769
+ registry.register("trigger_monsterjump", (entity, context) => {
5770
+ const heightText = context.keyValues.height;
5771
+ const height = heightText ? Number.parseFloat(heightText) || 0 : 200;
5772
+ if (entity.angles.y === 0) {
5773
+ entity.angles = { ...entity.angles, y: 360 };
5774
+ }
5775
+ if (!entity.speed) {
5776
+ entity.speed = 200;
5777
+ }
5778
+ initTrigger(entity);
5779
+ entity.movedir = { ...entity.movedir, z: height };
5780
+ const touchHandler = (self, other) => monsterJumpTouch(self, other);
5781
+ entity.touch = touchHandler;
5782
+ if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.StartOff) {
5783
+ entity.solid = 0 /* Not */;
5784
+ entity.touch = void 0;
5785
+ }
5786
+ if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.Toggle) {
5787
+ entity.use = (self) => {
5788
+ toggleSolid(self);
5789
+ self.touch = self.solid === 1 /* Trigger */ ? touchHandler : void 0;
5790
+ };
5791
+ }
5792
+ });
5793
+ }
5794
+ function registerTriggerSpawns(registry) {
5795
+ registerTriggerMultiple(registry);
5796
+ registerTriggerOnce(registry);
5797
+ registerTriggerRelay(registry);
5798
+ registerTriggerAlways(registry);
5799
+ registerTriggerCounter(registry);
5800
+ registerTriggerKey(registry);
5801
+ registerTriggerPush(registry);
5802
+ registerTriggerHurt(registry);
5803
+ registerTriggerTeleport(registry);
5804
+ registerTriggerGravity(registry);
5805
+ registerTriggerElevator(registry);
5806
+ registerTriggerMonsterJump(registry);
5807
+ }
5808
+
5809
+ // src/inventory/items.ts
5810
+ init_ammo();
5811
+ init_playerInventory();
5812
+
5813
+ // src/combat/weapons/chaingun.ts
5814
+ init_state();
5815
+ init_playerInventory();
5816
+
5817
+ // src/buttons.ts
5818
+ var BUTTON_ATTACK = 1;
5819
+
5820
+ // src/combat/weapons/animation.ts
5821
+ init_playerInventory();
5822
+
5823
+ // src/combat/weapons/firing.ts
5824
+ init_state();
5825
+ init_playerInventory();
5826
+ init_ammo();
5827
+ init_esm();
5828
+
5829
+ // src/combat/weapons/projectSource.ts
5830
+ init_esm();
5831
+ var VIEW_HEIGHT = 22;
5832
+ function P_ProjectSource(game, ent, offset, forward, right, up) {
5833
+ const origin = copyVec3(ent.origin);
5834
+ const eye = { ...origin, z: origin.z + (ent.viewheight ?? VIEW_HEIGHT) };
5835
+ const f = scaleVec3(forward, offset.x);
5836
+ const r = scaleVec3(right, offset.y);
5837
+ const u = scaleVec3(up, offset.z);
5838
+ const point = addVec3(addVec3(addVec3(eye, f), r), u);
5839
+ const tr = game.trace(eye, null, null, point, ent, MASK_SOLID);
5840
+ if (tr.fraction < 1) {
5841
+ return { x: tr.endpos.x - forward.x, y: tr.endpos.y - forward.y, z: tr.endpos.z - forward.z };
5842
+ }
5843
+ return point;
5844
+ }
5845
+
5846
+ // src/combat/weapons/frames.ts
5847
+ var FRAME_SHOTGUN_ACTIVATE_LAST = 7;
5848
+ var FRAME_SHOTGUN_FIRE_LAST = 18;
5849
+ var FRAME_SHOTGUN_IDLE_LAST = 36;
5850
+ var FRAME_SHOTGUN_DEACTIVATE_LAST = 39;
5851
+ var FRAME_SSHOTGUN_ACTIVATE_LAST = 5;
5852
+ var FRAME_SSHOTGUN_FIRE_LAST = 28;
5853
+ var FRAME_SSHOTGUN_IDLE_LAST = 52;
5854
+ var FRAME_SSHOTGUN_DEACTIVATE_LAST = 57;
5855
+ var FRAME_MACHINEGUN_ACTIVATE_LAST = 3;
5856
+ var FRAME_MACHINEGUN_FIRE_LAST = 23;
5857
+ var FRAME_MACHINEGUN_IDLE_LAST = 52;
5858
+ var FRAME_MACHINEGUN_DEACTIVATE_LAST = 61;
5859
+ var FRAME_CHAINGUN_FIRE_FRAME = 5;
5860
+ var FRAME_CHAINGUN_FIRE_LAST = 21;
5861
+ var FRAME_CHAINGUN_IDLE_LAST = 52;
5862
+ var FRAME_CHAINGUN_DEACTIVATE_LAST = 61;
5863
+ var FRAME_RAILGUN_ACTIVATE_LAST = 3;
5864
+ var FRAME_RAILGUN_FIRE_LAST = 18;
5865
+ var FRAME_RAILGUN_IDLE_LAST = 51;
5866
+ var FRAME_RAILGUN_DEACTIVATE_LAST = 56;
5867
+ var FRAME_ROCKET_ACTIVATE_LAST = 3;
5868
+ var FRAME_ROCKET_FIRE_LAST = 12;
5869
+ var FRAME_ROCKET_IDLE_LAST = 34;
5870
+ var FRAME_ROCKET_DEACTIVATE_LAST = 38;
5871
+ var FRAME_HYPERBLASTER_FIRE_FRAME = 6;
5872
+ var FRAME_HYPERBLASTER_FIRE_LAST = 9;
5873
+ var FRAME_HYPERBLASTER_IDLE_LAST = 28;
5874
+ var FRAME_HYPERBLASTER_DEACTIVATE_LAST = 32;
5875
+ var FRAME_BFG_ACTIVATE_LAST = 8;
5876
+ var FRAME_BFG_FIRE_LAST = 32;
5877
+ var FRAME_BFG_IDLE_LAST = 54;
5878
+ var FRAME_BFG_DEACTIVATE_LAST = 58;
5879
+ var FRAME_GRENADELAUNCHER_ACTIVATE_LAST = 5;
5880
+ var FRAME_GRENADELAUNCHER_FIRE_LAST = 16;
5881
+ var FRAME_GRENADELAUNCHER_IDLE_LAST = 36;
5882
+ var FRAME_GRENADELAUNCHER_DEACTIVATE_LAST = 39;
5883
+ var FRAME_BLASTER_ACTIVATE_LAST = 4;
5884
+ var FRAME_BLASTER_FIRE_LAST = 8;
5885
+ var FRAME_BLASTER_IDLE_LAST = 52;
5886
+ var FRAME_BLASTER_DEACTIVATE_LAST = 55;
5887
+
5888
+ // src/entities/player_anim.ts
5889
+ var FRAME_stand01 = 0;
5890
+ var FRAME_stand40 = 39;
5891
+ var FRAME_run1 = 40;
5892
+ var FRAME_run6 = 45;
5893
+ var FRAME_attack1 = 46;
5894
+ var FRAME_attack8 = 53;
5895
+ var FRAME_pain101 = 54;
5896
+ var FRAME_pain104 = 57;
5897
+ var FRAME_pain201 = 58;
5898
+ var FRAME_pain204 = 61;
5899
+ var FRAME_pain301 = 62;
5900
+ var FRAME_pain304 = 65;
5901
+ var FRAME_death101 = 66;
5902
+ var FRAME_death106 = 71;
5903
+ var FRAME_death201 = 72;
5904
+ var FRAME_death206 = 77;
5905
+ var FRAME_death301 = 78;
5906
+ var FRAME_death306 = 83;
5907
+ var FRAME_crattak1 = 109;
5908
+ var FRAME_crattak9 = 117;
5909
+ var ANIM_BASIC = 0;
5910
+ var ANIM_ATTACK = 1;
5911
+ var ANIM_PAIN = 2;
5912
+ var ANIM_DEATH = 3;
5913
+
5914
+ // src/combat/weapons/firing.ts
5915
+ var random2 = createRandomGenerator();
5916
+ function applyKick(player, pitch, yaw = 0, kickOrigin = 0) {
5917
+ if (player.client) {
5918
+ player.client.kick_angles = { x: pitch, y: yaw, z: 0 };
5919
+ player.client.kick_origin = { x: kickOrigin, y: 0, z: 0 };
5920
+ }
5921
+ }
5922
+ function setPlayerAttackAnim(player) {
5923
+ if (!player.client) return;
5924
+ const ducked = (player.client.pm_flags & 2) !== 0;
5925
+ player.client.anim_priority = ANIM_ATTACK;
5926
+ if (ducked) {
5927
+ player.frame = FRAME_crattak1 - 1;
5928
+ player.client.anim_end = FRAME_crattak9;
5929
+ } else {
5930
+ player.frame = FRAME_attack1 - 1;
5931
+ player.client.anim_end = FRAME_attack8;
5932
+ }
5933
+ }
5934
+ function fireHitscan(game, player, start, forward, damage, knockback, mod) {
5935
+ const end = { x: start.x + forward.x * 8192, y: start.y + forward.y * 8192, z: start.z + forward.z * 8192 };
5936
+ const trace = game.trace(
5937
+ start,
5938
+ null,
5939
+ null,
5940
+ end,
5941
+ player,
5942
+ 0
5943
+ );
5944
+ if (trace.ent && trace.ent.takedamage) {
5945
+ T_Damage(
5946
+ trace.ent,
5947
+ player,
5948
+ player,
5949
+ ZERO_VEC3,
5950
+ trace.endpos,
5951
+ trace.plane ? trace.plane.normal : ZERO_VEC3,
5952
+ damage,
5953
+ knockback,
5954
+ 16 /* BULLET */,
5955
+ mod,
5956
+ game.time,
5957
+ game.multicast
5958
+ );
5959
+ } else {
5960
+ if (trace.plane) {
5961
+ game.multicast(trace.endpos, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.GUNSHOT, trace.endpos, trace.plane.normal);
5962
+ }
5963
+ }
5964
+ }
5965
+ function fireMultiplePellets(game, player, start, forward, right, up, count, damage, knockback, hspread, vspread, mod) {
5966
+ for (let i = 0; i < count; i++) {
5967
+ const spread = addVec3(scaleVec3(right, random2.crandom() * hspread), scaleVec3(up, random2.crandom() * vspread));
5968
+ const dir = addVec3(forward, spread);
5969
+ const end = { x: start.x + dir.x * 8192, y: start.y + dir.y * 8192, z: start.z + dir.z * 8192 };
5970
+ const trace = game.trace(start, null, null, end, player, 0);
5971
+ if (trace.ent && trace.ent.takedamage) {
5972
+ T_Damage(
5973
+ trace.ent,
5974
+ player,
5975
+ player,
5976
+ ZERO_VEC3,
5977
+ trace.endpos,
5978
+ trace.plane ? trace.plane.normal : ZERO_VEC3,
5979
+ damage,
5980
+ knockback,
5981
+ 16 /* BULLET */,
5982
+ mod,
5983
+ game.time,
5984
+ game.multicast
5985
+ );
5986
+ } else if (trace.plane) {
5987
+ if (random2.frandom() > 0.9) {
5988
+ game.multicast(trace.endpos, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.GUNSHOT, trace.endpos, trace.plane.normal);
5989
+ }
5990
+ }
5991
+ }
5992
+ }
5993
+ function fireRailgun(game, player, start, forward, damage, knockback) {
5994
+ const originalStart = { ...start };
5995
+ let currentStart = { ...start };
5996
+ const end = { x: start.x + forward.x * 8192, y: start.y + forward.y * 8192, z: start.z + forward.z * 8192 };
5997
+ let ignore = player;
5998
+ let count = 0;
5999
+ let finalEnd = end;
6000
+ while (count < 16) {
6001
+ count++;
6002
+ const trace = game.trace(currentStart, null, null, end, ignore, 0);
6003
+ finalEnd = trace.endpos;
6004
+ if (trace.fraction >= 1) {
6005
+ break;
6006
+ }
6007
+ if (trace.ent && trace.ent.takedamage) {
6008
+ T_Damage(
6009
+ trace.ent,
6010
+ player,
6011
+ player,
6012
+ ZERO_VEC3,
6013
+ trace.endpos,
6014
+ trace.plane ? trace.plane.normal : ZERO_VEC3,
6015
+ damage,
6016
+ knockback,
6017
+ 4 /* ENERGY */,
6018
+ 11 /* RAILGUN */,
6019
+ game.time,
6020
+ game.multicast
6021
+ );
6022
+ }
6023
+ ignore = trace.ent;
6024
+ currentStart = trace.endpos;
6025
+ if (!trace.ent || trace.ent === game.entities.world) {
6026
+ break;
6027
+ }
6028
+ }
6029
+ game.multicast(originalStart, 2 /* Phs */, ServerCommand.temp_entity, TempEntity.RAILTRAIL, originalStart, finalEnd);
6030
+ }
6031
+ function fireShotgun(game, player) {
6032
+ if (!player.client) return;
6033
+ const inventory = player.client.inventory;
6034
+ if (inventory.ammo.counts[AmmoType.Shells] < 1) {
6035
+ return;
6036
+ }
6037
+ inventory.ammo.counts[AmmoType.Shells]--;
6038
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_SHOTGUN);
6039
+ applyKick(player, -2, 0, -2);
6040
+ setPlayerAttackAnim(player);
6041
+ const { forward, right, up } = angleVectors(player.angles);
6042
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6043
+ fireMultiplePellets(game, player, source, forward, right, up, 12, 4, 1, 500, 500, 2 /* SHOTGUN */);
6044
+ }
6045
+ function fireSuperShotgun(game, player) {
6046
+ if (!player.client) return;
6047
+ const inventory = player.client.inventory;
6048
+ if (inventory.ammo.counts[AmmoType.Shells] < 2) {
6049
+ return;
6050
+ }
6051
+ inventory.ammo.counts[AmmoType.Shells] -= 2;
6052
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_SSHOTGUN);
6053
+ applyKick(player, -4, 0, -4);
6054
+ setPlayerAttackAnim(player);
6055
+ const { forward, right, up } = angleVectors(player.angles);
6056
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6057
+ const { forward: forward1, right: right1, up: up1 } = angleVectors({ ...player.angles, y: player.angles.y - 5 });
6058
+ fireMultiplePellets(game, player, source, forward1, right1, up1, 10, 6, 1, 700, 700, 3 /* SSHOTGUN */);
6059
+ const { forward: forward2, right: right2, up: up2 } = angleVectors({ ...player.angles, y: player.angles.y + 5 });
6060
+ fireMultiplePellets(game, player, source, forward2, right2, up2, 10, 6, 1, 700, 700, 3 /* SSHOTGUN */);
6061
+ }
6062
+ function fireMachinegun(game, player) {
6063
+ if (!player.client) return;
6064
+ const inventory = player.client.inventory;
6065
+ if (inventory.ammo.counts[AmmoType.Bullets] < 1) {
6066
+ return;
6067
+ }
6068
+ inventory.ammo.counts[AmmoType.Bullets]--;
6069
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_MACHINEGUN);
6070
+ applyKick(player, -1, random2.crandom() * 0.5, 0);
6071
+ setPlayerAttackAnim(player);
6072
+ const { forward, right, up } = angleVectors(player.angles);
6073
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6074
+ fireHitscan(game, player, source, forward, 8, 1, 4 /* MACHINEGUN */);
6075
+ }
6076
+ function fireChaingun(game, player) {
6077
+ if (!player.client) return;
6078
+ const inventory = player.client.inventory;
6079
+ const weaponState = getWeaponState(player.client.weaponStates, WeaponId.Chaingun);
6080
+ if (game.time - weaponState.lastFireTime > 200) {
6081
+ weaponState.spinupCount = 0;
6082
+ }
6083
+ const spinupCount = (weaponState.spinupCount || 0) + 1;
6084
+ weaponState.spinupCount = spinupCount;
6085
+ let shots;
6086
+ if (spinupCount <= 5) {
6087
+ shots = 1;
6088
+ if (spinupCount === 1) {
6089
+ game.sound(player, 0, "weapons/chngnu1a.wav", 1, 0, 0);
6090
+ }
6091
+ } else {
6092
+ if (spinupCount <= 10) {
6093
+ shots = 2;
6094
+ } else {
6095
+ shots = 3;
6096
+ }
6097
+ game.sound(player, 0, "weapons/chngnl1a.wav", 1, 0, 0);
6098
+ }
6099
+ if (inventory.ammo.counts[AmmoType.Bullets] < shots) {
6100
+ shots = inventory.ammo.counts[AmmoType.Bullets];
6101
+ }
6102
+ if (shots === 0) {
5490
6103
  return;
5491
6104
  }
5492
- if ((other.flags & (1 /* Fly */ | 2 /* Swim */)) !== 0) {
6105
+ inventory.ammo.counts[AmmoType.Bullets] -= shots;
6106
+ const damage = game.deathmatch ? 6 : 8;
6107
+ const knockback = 1;
6108
+ applyKick(player, -0.5, random2.crandom() * (0.5 + shots * 0.15), 0);
6109
+ setPlayerAttackAnim(player);
6110
+ const { forward, right, up } = angleVectors(player.angles);
6111
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6112
+ for (let i = 0; i < shots; i++) {
6113
+ const spread = addVec3(scaleVec3(right, random2.crandom() * 4), scaleVec3(up, random2.crandom() * 4));
6114
+ const dir = addVec3(forward, spread);
6115
+ fireHitscan(game, player, source, dir, damage, knockback, 5 /* CHAINGUN */);
6116
+ }
6117
+ const flash = MZ_CHAINGUN1 + shots - 1;
6118
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, flash);
6119
+ }
6120
+ function fireRailgunShot(game, player) {
6121
+ if (!player.client) return;
6122
+ const inventory = player.client.inventory;
6123
+ if (inventory.ammo.counts[AmmoType.Slugs] < 1) {
5493
6124
  return;
5494
6125
  }
5495
- if (other.svflags & 2 /* DeadMonster */) {
6126
+ inventory.ammo.counts[AmmoType.Slugs]--;
6127
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_RAILGUN);
6128
+ applyKick(player, -3, 0, -3);
6129
+ setPlayerAttackAnim(player);
6130
+ const { forward, right, up } = angleVectors(player.angles);
6131
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6132
+ const damage = game.deathmatch ? 100 : 125;
6133
+ const knockback = game.deathmatch ? 200 : 225;
6134
+ fireRailgun(game, player, source, forward, damage, knockback);
6135
+ }
6136
+ function fireHyperBlaster(game, player) {
6137
+ if (!player.client) return;
6138
+ const inventory = player.client.inventory;
6139
+ if (inventory.ammo.counts[AmmoType.Cells] < 1) {
5496
6140
  return;
5497
6141
  }
5498
- if ((other.svflags & 4 /* Monster */) === 0) {
6142
+ inventory.ammo.counts[AmmoType.Cells]--;
6143
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_HYPERBLASTER);
6144
+ applyKick(player, -0.5, 0, 0);
6145
+ setPlayerAttackAnim(player);
6146
+ const { forward, right, up } = angleVectors(player.angles);
6147
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6148
+ const damage = game.deathmatch ? 15 : 20;
6149
+ createBlasterBolt(game.entities, player, source, forward, damage, 1e3, 10 /* HYPERBLASTER */);
6150
+ }
6151
+ function fireBlaster(game, player) {
6152
+ if (!player.client) return;
6153
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_BLASTER);
6154
+ applyKick(player, -0.5, 0, 0);
6155
+ setPlayerAttackAnim(player);
6156
+ const { forward, right, up } = angleVectors(player.angles);
6157
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6158
+ createBlasterBolt(game.entities, player, source, forward, 15, 1500, 1 /* BLASTER */);
6159
+ }
6160
+ function fireRocket(game, player) {
6161
+ if (!player.client) return;
6162
+ const inventory = player.client.inventory;
6163
+ if (inventory.ammo.counts[AmmoType.Rockets] < 1) {
5499
6164
  return;
5500
6165
  }
5501
- other.velocity = {
5502
- x: self.movedir.x * self.speed,
5503
- y: self.movedir.y * self.speed,
5504
- z: other.velocity.z
5505
- };
5506
- if (!other.groundentity) {
6166
+ inventory.ammo.counts[AmmoType.Rockets]--;
6167
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_ROCKET);
6168
+ applyKick(player, -2, 0, -2);
6169
+ setPlayerAttackAnim(player);
6170
+ const { forward, right, up } = angleVectors(player.angles);
6171
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6172
+ const damage = 100 + game.random.irandom(21);
6173
+ const radiusDamage = 120;
6174
+ createRocket(game.entities, player, source, forward, damage, radiusDamage, 650);
6175
+ }
6176
+ function fireGrenadeLauncher(game, player) {
6177
+ if (!player.client) return;
6178
+ const inventory = player.client.inventory;
6179
+ if (inventory.ammo.counts[AmmoType.Grenades] < 1) {
5507
6180
  return;
5508
6181
  }
5509
- other.groundentity = null;
5510
- other.velocity = { x: other.velocity.x, y: other.velocity.y, z: self.movedir.z };
6182
+ inventory.ammo.counts[AmmoType.Grenades]--;
6183
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_GRENADE);
6184
+ applyKick(player, -2, 0, -2);
6185
+ setPlayerAttackAnim(player);
6186
+ const { forward, right, up } = angleVectors(player.angles);
6187
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6188
+ createGrenade(game.entities, player, source, forward, 120, 600);
5511
6189
  }
5512
- function triggerElevatorUse(self, other, entities, warn) {
5513
- if (!self.movetarget) {
5514
- return;
6190
+ function fireBFG(game, player) {
6191
+ if (!player.client) return;
6192
+ const inventory = player.client.inventory;
6193
+ const gun_frame = player.client.gun_frame;
6194
+ const isPrimeFrame = gun_frame === 9 || gun_frame === 0 || gun_frame === void 0;
6195
+ const isFireFrame = gun_frame === 22 || gun_frame === 0 || gun_frame === void 0;
6196
+ if (isPrimeFrame) {
6197
+ if (inventory.ammo.counts[AmmoType.Cells] < 50) {
6198
+ return;
6199
+ }
6200
+ inventory.ammo.counts[AmmoType.Cells] -= 50;
6201
+ game.sound(player, 0, "weapons/bfg__f1y.wav", 1, 0, 0);
5515
6202
  }
5516
- if (self.movetarget.nextthink > 0) {
5517
- return;
6203
+ if (isFireFrame) {
6204
+ game.multicast(player.origin, 1 /* Pvs */, ServerCommand.muzzleflash, player.index, MZ_BFG);
6205
+ applyKick(player, -5, 0, -2);
6206
+ setPlayerAttackAnim(player);
6207
+ const { forward, right, up } = angleVectors(player.angles);
6208
+ const source = P_ProjectSource(game, player, { x: 8, y: 8, z: -8 }, forward, right, up);
6209
+ const damage = game.deathmatch ? 200 : 500;
6210
+ createBfgBall(game.entities, player, source, forward, damage, 400, 200);
6211
+ } else if (gun_frame === void 0 || gun_frame === 0) {
5518
6212
  }
5519
- if (!other?.pathtarget) {
5520
- warn("trigger_elevator used with no pathtarget");
5521
- return;
6213
+ }
6214
+
6215
+ // src/combat/weapons/animation.ts
6216
+ function Weapon_AnimationTime(ent) {
6217
+ let time = 0.1;
6218
+ if (ent.client?.inventory.powerups.has(PowerupId.TechHaste)) {
6219
+ time *= 0.5;
5522
6220
  }
5523
- const target = entities.pickTarget(other.pathtarget);
5524
- if (!target) {
5525
- warn(`trigger_elevator used with bad pathtarget: ${other.pathtarget}`);
5526
- return;
6221
+ if (ent.client?.inventory.powerups.has(PowerupId.QuadFire)) {
6222
+ time *= 0.25;
5527
6223
  }
5528
- self.movetarget.target_ent = target;
5529
- trainResume(self.movetarget, entities);
6224
+ return time;
5530
6225
  }
5531
- function triggerElevatorInit(self, entities, warn) {
5532
- if (!self.target) {
5533
- warn("trigger_elevator has no target");
6226
+ function Weapon_Generic(ent, FRAME_ACTIVATE_LAST, FRAME_FIRE_LAST, FRAME_IDLE_LAST, FRAME_DEACTIVATE_LAST, pause_frames, fire_frames, fire, sys) {
6227
+ if (!ent.client) return;
6228
+ const client = ent.client;
6229
+ const time = sys.timeSeconds;
6230
+ if (client.weapon_think_time && client.weapon_think_time <= time) {
6231
+ client.weapon_think_time = 0;
6232
+ }
6233
+ if (client.weapon_think_time && client.weapon_think_time > time) {
5534
6234
  return;
5535
6235
  }
5536
- const target = entities.pickTarget(self.target);
5537
- if (!target) {
5538
- warn(`trigger_elevator unable to find target ${self.target}`);
6236
+ if (client.weaponstate === 1 /* WEAPON_ACTIVATING */) {
6237
+ if (client.gun_frame < FRAME_ACTIVATE_LAST) {
6238
+ client.gun_frame++;
6239
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6240
+ return;
6241
+ }
6242
+ client.weaponstate = 0 /* WEAPON_READY */;
6243
+ client.gun_frame = FRAME_FIRE_LAST + 1;
6244
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
5539
6245
  return;
5540
6246
  }
5541
- self.movetarget = target;
5542
- if (target.classname !== "func_train") {
5543
- warn(`trigger_elevator target ${self.target} is not a train`);
6247
+ if (client.weaponstate === 2 /* WEAPON_DROPPING */) {
6248
+ if (client.gun_frame < FRAME_DEACTIVATE_LAST) {
6249
+ client.gun_frame++;
6250
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6251
+ return;
6252
+ }
6253
+ Promise.resolve().then(() => (init_switching(), switching_exports)).then(({ ChangeWeapon: ChangeWeapon2 }) => {
6254
+ ChangeWeapon2(ent);
6255
+ });
5544
6256
  return;
5545
6257
  }
5546
- self.use = (entity, other, activator) => triggerElevatorUse(entity, other ?? activator ?? null, entities, warn);
5547
- self.svflags |= 1 /* NoClient */;
5548
- }
5549
- function registerTriggerElevator(registry) {
5550
- registry.register("trigger_elevator", (entity, context) => {
5551
- entity.think = (self) => triggerElevatorInit(self, context.entities, context.warn);
5552
- context.entities.scheduleThink(entity, context.entities.timeSeconds + FRAME_TIME_SECONDS);
5553
- });
5554
- }
5555
- function registerTriggerMonsterJump(registry) {
5556
- registry.register("trigger_monsterjump", (entity, context) => {
5557
- const heightText = context.keyValues.height;
5558
- const height = heightText ? Number.parseFloat(heightText) || 0 : 200;
5559
- if (entity.angles.y === 0) {
5560
- entity.angles = { ...entity.angles, y: 360 };
6258
+ if (client.weaponstate === 0 /* WEAPON_READY */) {
6259
+ if (client.buttons & 1) {
6260
+ client.weaponstate = 3 /* WEAPON_FIRING */;
6261
+ client.gun_frame = FRAME_ACTIVATE_LAST + 1;
6262
+ return;
5561
6263
  }
5562
- if (!entity.speed) {
5563
- entity.speed = 200;
6264
+ if (client.gun_frame < FRAME_IDLE_LAST) {
6265
+ client.gun_frame++;
6266
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6267
+ if (pause_frames) {
6268
+ for (const frame of pause_frames) {
6269
+ if (client.gun_frame === frame) {
6270
+ if (random2.frandom() < 0.5) {
6271
+ return;
6272
+ }
6273
+ }
6274
+ }
6275
+ }
6276
+ return;
5564
6277
  }
5565
- initTrigger(entity);
5566
- entity.movedir = { ...entity.movedir, z: height };
5567
- const touchHandler = (self, other) => monsterJumpTouch(self, other);
5568
- entity.touch = touchHandler;
5569
- if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.StartOff) {
5570
- entity.solid = 0 /* Not */;
5571
- entity.touch = void 0;
6278
+ client.gun_frame = FRAME_FIRE_LAST + 1;
6279
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6280
+ return;
6281
+ }
6282
+ if (client.weaponstate === 3 /* WEAPON_FIRING */) {
6283
+ if (fire_frames) {
6284
+ for (const frame of fire_frames) {
6285
+ if (client.gun_frame === frame) {
6286
+ if (fire) fire(ent);
6287
+ break;
6288
+ }
6289
+ }
5572
6290
  }
5573
- if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.Toggle) {
5574
- entity.use = (self) => {
5575
- toggleSolid(self);
5576
- self.touch = self.solid === 1 /* Trigger */ ? touchHandler : void 0;
5577
- };
6291
+ if (client.gun_frame < FRAME_FIRE_LAST) {
6292
+ client.gun_frame++;
6293
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6294
+ return;
5578
6295
  }
5579
- });
5580
- }
5581
- function registerTriggerSpawns(registry) {
5582
- registerTriggerMultiple(registry);
5583
- registerTriggerOnce(registry);
5584
- registerTriggerRelay(registry);
5585
- registerTriggerAlways(registry);
5586
- registerTriggerCounter(registry);
5587
- registerTriggerKey(registry);
5588
- registerTriggerPush(registry);
5589
- registerTriggerHurt(registry);
5590
- registerTriggerTeleport(registry);
5591
- registerTriggerGravity(registry);
5592
- registerTriggerElevator(registry);
5593
- registerTriggerMonsterJump(registry);
5594
- }
5595
-
5596
- // src/combat/weapons/state.ts
5597
- var WeaponStateEnum = /* @__PURE__ */ ((WeaponStateEnum2) => {
5598
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_READY"] = 0] = "WEAPON_READY";
5599
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_ACTIVATING"] = 1] = "WEAPON_ACTIVATING";
5600
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_DROPPING"] = 2] = "WEAPON_DROPPING";
5601
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_FIRING"] = 3] = "WEAPON_FIRING";
5602
- return WeaponStateEnum2;
5603
- })(WeaponStateEnum || {});
5604
- function createPlayerWeaponStates() {
5605
- return {
5606
- states: /* @__PURE__ */ new Map()
5607
- };
6296
+ client.weaponstate = 0 /* WEAPON_READY */;
6297
+ client.gun_frame = FRAME_FIRE_LAST + 1;
6298
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6299
+ return;
6300
+ }
5608
6301
  }
5609
- function getWeaponState(playerStates, weaponId) {
5610
- let state = playerStates.states.get(weaponId);
5611
- if (!state) {
5612
- state = { lastFireTime: 0 };
5613
- playerStates.states.set(weaponId, state);
6302
+ function Weapon_Repeating(ent, FRAME_FIRE_FRAME, FRAME_FIRE_LAST, FRAME_IDLE_LAST, FRAME_PAUSE, FRAME_NOOP, fire, sys) {
6303
+ if (!ent.client) return;
6304
+ const client = ent.client;
6305
+ if (client.weaponstate === 3 /* WEAPON_FIRING */) {
6306
+ if (client.gun_frame === FRAME_FIRE_LAST || client.gun_frame === FRAME_IDLE_LAST) {
6307
+ client.gun_frame = FRAME_FIRE_FRAME;
6308
+ } else {
6309
+ client.gun_frame++;
6310
+ }
6311
+ if (fire) {
6312
+ fire(ent);
6313
+ }
6314
+ if (!(client.buttons & 1)) {
6315
+ client.gun_frame = FRAME_IDLE_LAST + 1;
6316
+ client.weaponstate = 0 /* WEAPON_READY */;
6317
+ }
6318
+ } else {
6319
+ Weapon_Generic(
6320
+ ent,
6321
+ FRAME_FIRE_FRAME - 1,
6322
+ FRAME_FIRE_LAST,
6323
+ FRAME_IDLE_LAST,
6324
+ FRAME_PAUSE,
6325
+ null,
6326
+ null,
6327
+ fire,
6328
+ sys
6329
+ );
5614
6330
  }
5615
- return state;
5616
6331
  }
5617
6332
 
5618
- // src/buttons.ts
5619
- var BUTTON_ATTACK = 1;
5620
-
5621
6333
  // src/combat/weapons/chaingun.ts
5622
6334
  function chaingunThink(player, sys) {
5623
- if (!player.client) {
5624
- return;
5625
- }
5626
6335
  const weaponState = getWeaponState(player.client.weaponStates, WeaponId.Chaingun);
5627
6336
  if (!(player.client.buttons & BUTTON_ATTACK) && weaponState.spinupCount && weaponState.spinupCount > 0) {
5628
6337
  sys.sound(player, 0, "weapons/chngnd1a.wav", 1, 0, 0);
5629
6338
  weaponState.spinupCount = 0;
5630
6339
  }
6340
+ Weapon_Repeating(
6341
+ player,
6342
+ FRAME_CHAINGUN_FIRE_FRAME,
6343
+ FRAME_CHAINGUN_FIRE_LAST,
6344
+ FRAME_CHAINGUN_IDLE_LAST,
6345
+ FRAME_CHAINGUN_DEACTIVATE_LAST,
6346
+ 0,
6347
+ // FRAME_NOOP
6348
+ (ent) => fireChaingun(sys.game, ent),
6349
+ sys
6350
+ );
6351
+ }
6352
+
6353
+ // src/combat/weapons/shotgun.ts
6354
+ var SHOTGUN_PAUSE_FRAMES = [22, 28, 34];
6355
+ var SHOTGUN_FIRE_FRAMES = [8];
6356
+ function shotgunThink(player, sys) {
6357
+ Weapon_Generic(
6358
+ player,
6359
+ FRAME_SHOTGUN_ACTIVATE_LAST,
6360
+ FRAME_SHOTGUN_FIRE_LAST,
6361
+ FRAME_SHOTGUN_IDLE_LAST,
6362
+ FRAME_SHOTGUN_DEACTIVATE_LAST,
6363
+ SHOTGUN_PAUSE_FRAMES,
6364
+ SHOTGUN_FIRE_FRAMES,
6365
+ (ent) => fireShotgun(sys.game, ent),
6366
+ sys
6367
+ );
6368
+ }
6369
+
6370
+ // src/combat/weapons/supershotgun.ts
6371
+ var SSHOTGUN_PAUSE_FRAMES = [29, 42, 57];
6372
+ var SSHOTGUN_FIRE_FRAMES = [22, 28];
6373
+ function superShotgunThink(player, sys) {
6374
+ Weapon_Generic(
6375
+ player,
6376
+ FRAME_SSHOTGUN_ACTIVATE_LAST,
6377
+ FRAME_SSHOTGUN_FIRE_LAST,
6378
+ FRAME_SSHOTGUN_IDLE_LAST,
6379
+ FRAME_SSHOTGUN_DEACTIVATE_LAST,
6380
+ SSHOTGUN_PAUSE_FRAMES,
6381
+ SSHOTGUN_FIRE_FRAMES,
6382
+ (ent) => fireSuperShotgun(sys.game, ent),
6383
+ sys
6384
+ );
6385
+ }
6386
+
6387
+ // src/combat/weapons/machinegun.ts
6388
+ var MACHINEGUN_PAUSE_FRAMES = [23, 45];
6389
+ var MACHINEGUN_FIRE_FRAMES = [4, 5, 30, 31];
6390
+ function machinegunThink(player, sys) {
6391
+ Weapon_Generic(
6392
+ player,
6393
+ FRAME_MACHINEGUN_ACTIVATE_LAST,
6394
+ FRAME_MACHINEGUN_FIRE_LAST,
6395
+ FRAME_MACHINEGUN_IDLE_LAST,
6396
+ FRAME_MACHINEGUN_DEACTIVATE_LAST,
6397
+ MACHINEGUN_PAUSE_FRAMES,
6398
+ MACHINEGUN_FIRE_FRAMES,
6399
+ (ent) => fireMachinegun(sys.game, ent),
6400
+ sys
6401
+ );
6402
+ }
6403
+
6404
+ // src/combat/weapons/rocket.ts
6405
+ var ROCKET_PAUSE_FRAMES = [25, 33];
6406
+ var ROCKET_FIRE_FRAMES = [4];
6407
+ function rocketLauncherThink(player, sys) {
6408
+ Weapon_Generic(
6409
+ player,
6410
+ FRAME_ROCKET_ACTIVATE_LAST,
6411
+ FRAME_ROCKET_FIRE_LAST,
6412
+ FRAME_ROCKET_IDLE_LAST,
6413
+ FRAME_ROCKET_DEACTIVATE_LAST,
6414
+ ROCKET_PAUSE_FRAMES,
6415
+ ROCKET_FIRE_FRAMES,
6416
+ (ent) => fireRocket(sys.game, ent),
6417
+ sys
6418
+ );
6419
+ }
6420
+
6421
+ // src/combat/weapons/hyperblaster.ts
6422
+ function hyperBlasterThink(player, sys) {
6423
+ Weapon_Repeating(
6424
+ player,
6425
+ FRAME_HYPERBLASTER_FIRE_FRAME,
6426
+ FRAME_HYPERBLASTER_FIRE_LAST,
6427
+ FRAME_HYPERBLASTER_IDLE_LAST,
6428
+ FRAME_HYPERBLASTER_DEACTIVATE_LAST,
6429
+ 0,
6430
+ // FRAME_NOOP
6431
+ (ent) => fireHyperBlaster(sys.game, ent),
6432
+ sys
6433
+ );
6434
+ }
6435
+
6436
+ // src/combat/weapons/railgun.ts
6437
+ var RAILGUN_PAUSE_FRAMES = [56];
6438
+ var RAILGUN_FIRE_FRAMES = [4];
6439
+ function railgunThink(player, sys) {
6440
+ Weapon_Generic(
6441
+ player,
6442
+ FRAME_RAILGUN_ACTIVATE_LAST,
6443
+ FRAME_RAILGUN_FIRE_LAST,
6444
+ FRAME_RAILGUN_IDLE_LAST,
6445
+ FRAME_RAILGUN_DEACTIVATE_LAST,
6446
+ RAILGUN_PAUSE_FRAMES,
6447
+ RAILGUN_FIRE_FRAMES,
6448
+ (ent) => fireRailgunShot(sys.game, ent),
6449
+ sys
6450
+ );
6451
+ }
6452
+
6453
+ // src/combat/weapons/bfg.ts
6454
+ var BFG_PAUSE_FRAMES = [39, 45, 50, 54];
6455
+ var BFG_FIRE_FRAMES = [9, 22];
6456
+ function bfgThink2(player, sys) {
6457
+ Weapon_Generic(
6458
+ player,
6459
+ FRAME_BFG_ACTIVATE_LAST,
6460
+ FRAME_BFG_FIRE_LAST,
6461
+ FRAME_BFG_IDLE_LAST,
6462
+ FRAME_BFG_DEACTIVATE_LAST,
6463
+ BFG_PAUSE_FRAMES,
6464
+ BFG_FIRE_FRAMES,
6465
+ (ent) => fireBFG(sys.game, ent),
6466
+ sys
6467
+ );
6468
+ }
6469
+
6470
+ // src/combat/weapons/grenadelauncher.ts
6471
+ var GRENADELAUNCHER_PAUSE_FRAMES = [34, 51, 59];
6472
+ var GRENADELAUNCHER_FIRE_FRAMES = [6];
6473
+ function grenadeLauncherThink(player, sys) {
6474
+ Weapon_Generic(
6475
+ player,
6476
+ FRAME_GRENADELAUNCHER_ACTIVATE_LAST,
6477
+ FRAME_GRENADELAUNCHER_FIRE_LAST,
6478
+ FRAME_GRENADELAUNCHER_IDLE_LAST,
6479
+ FRAME_GRENADELAUNCHER_DEACTIVATE_LAST,
6480
+ GRENADELAUNCHER_PAUSE_FRAMES,
6481
+ GRENADELAUNCHER_FIRE_FRAMES,
6482
+ (ent) => fireGrenadeLauncher(sys.game, ent),
6483
+ sys
6484
+ );
6485
+ }
6486
+
6487
+ // src/combat/weapons/blaster.ts
6488
+ var BLASTER_PAUSE_FRAMES = [19, 32];
6489
+ var BLASTER_FIRE_FRAMES = [5];
6490
+ function blasterThink(player, sys) {
6491
+ Weapon_Generic(
6492
+ player,
6493
+ FRAME_BLASTER_ACTIVATE_LAST,
6494
+ FRAME_BLASTER_FIRE_LAST,
6495
+ FRAME_BLASTER_IDLE_LAST,
6496
+ FRAME_BLASTER_DEACTIVATE_LAST,
6497
+ BLASTER_PAUSE_FRAMES,
6498
+ BLASTER_FIRE_FRAMES,
6499
+ (ent) => fireBlaster(sys.game, ent),
6500
+ sys
6501
+ );
5631
6502
  }
5632
6503
 
5633
6504
  // src/inventory/items.ts
@@ -5640,7 +6511,8 @@ var WEAPON_ITEMS = {
5640
6511
  ammoType: null,
5641
6512
  initialAmmo: 0,
5642
6513
  pickupAmmo: 0,
5643
- fireRate: 0.5
6514
+ fireRate: 0.5,
6515
+ think: blasterThink
5644
6516
  },
5645
6517
  "weapon_shotgun": {
5646
6518
  type: "weapon",
@@ -5650,7 +6522,8 @@ var WEAPON_ITEMS = {
5650
6522
  ammoType: AmmoType.Shells,
5651
6523
  initialAmmo: 10,
5652
6524
  pickupAmmo: 10,
5653
- fireRate: 1
6525
+ fireRate: 1,
6526
+ think: shotgunThink
5654
6527
  },
5655
6528
  "weapon_supershotgun": {
5656
6529
  type: "weapon",
@@ -5660,7 +6533,8 @@ var WEAPON_ITEMS = {
5660
6533
  ammoType: AmmoType.Shells,
5661
6534
  initialAmmo: 10,
5662
6535
  pickupAmmo: 10,
5663
- fireRate: 1
6536
+ fireRate: 1,
6537
+ think: superShotgunThink
5664
6538
  },
5665
6539
  "weapon_machinegun": {
5666
6540
  type: "weapon",
@@ -5671,7 +6545,7 @@ var WEAPON_ITEMS = {
5671
6545
  initialAmmo: 50,
5672
6546
  pickupAmmo: 50,
5673
6547
  fireRate: 0.1,
5674
- think: chaingunThink
6548
+ think: machinegunThink
5675
6549
  },
5676
6550
  "weapon_chaingun": {
5677
6551
  type: "weapon",
@@ -5681,7 +6555,8 @@ var WEAPON_ITEMS = {
5681
6555
  ammoType: AmmoType.Bullets,
5682
6556
  initialAmmo: 50,
5683
6557
  pickupAmmo: 50,
5684
- fireRate: 0.1
6558
+ fireRate: 0.1,
6559
+ think: chaingunThink
5685
6560
  },
5686
6561
  "weapon_grenades": {
5687
6562
  type: "weapon",
@@ -5701,7 +6576,8 @@ var WEAPON_ITEMS = {
5701
6576
  ammoType: AmmoType.Grenades,
5702
6577
  initialAmmo: 10,
5703
6578
  pickupAmmo: 10,
5704
- fireRate: 1
6579
+ fireRate: 1,
6580
+ think: grenadeLauncherThink
5705
6581
  },
5706
6582
  "weapon_rocketlauncher": {
5707
6583
  type: "weapon",
@@ -5711,7 +6587,8 @@ var WEAPON_ITEMS = {
5711
6587
  ammoType: AmmoType.Rockets,
5712
6588
  initialAmmo: 5,
5713
6589
  pickupAmmo: 5,
5714
- fireRate: 1
6590
+ fireRate: 1,
6591
+ think: rocketLauncherThink
5715
6592
  },
5716
6593
  "weapon_hyperblaster": {
5717
6594
  type: "weapon",
@@ -5721,7 +6598,8 @@ var WEAPON_ITEMS = {
5721
6598
  ammoType: AmmoType.Cells,
5722
6599
  initialAmmo: 50,
5723
6600
  pickupAmmo: 50,
5724
- fireRate: 0.1
6601
+ fireRate: 0.1,
6602
+ think: hyperBlasterThink
5725
6603
  },
5726
6604
  "weapon_railgun": {
5727
6605
  type: "weapon",
@@ -5731,7 +6609,8 @@ var WEAPON_ITEMS = {
5731
6609
  ammoType: AmmoType.Slugs,
5732
6610
  initialAmmo: 10,
5733
6611
  pickupAmmo: 10,
5734
- fireRate: 1.5
6612
+ fireRate: 1.5,
6613
+ think: railgunThink
5735
6614
  },
5736
6615
  "weapon_bfg": {
5737
6616
  type: "weapon",
@@ -5741,7 +6620,8 @@ var WEAPON_ITEMS = {
5741
6620
  ammoType: AmmoType.Cells,
5742
6621
  initialAmmo: 50,
5743
6622
  pickupAmmo: 50,
5744
- fireRate: 1
6623
+ fireRate: 1,
6624
+ think: bfgThink2
5745
6625
  },
5746
6626
  // Rogue Weapons
5747
6627
  "weapon_boomer": {
@@ -5796,7 +6676,6 @@ var WEAPON_ITEMS = {
5796
6676
  fireRate: 0.8
5797
6677
  // Guessing fire rate, refine if needed
5798
6678
  }
5799
- // ... add others as we implement them
5800
6679
  };
5801
6680
  var HEALTH_ITEMS = {
5802
6681
  "item_health_small": {
@@ -6056,6 +6935,7 @@ function createKeyPickupEntity(game, keyItem) {
6056
6935
  }
6057
6936
 
6058
6937
  // src/entities/items/ammo.ts
6938
+ init_ammo();
6059
6939
  function createAmmoPickupEntity(game, itemId) {
6060
6940
  const def = getAmmoItemDefinition(itemId);
6061
6941
  const respawn = (self) => {
@@ -6110,6 +6990,7 @@ function createPowerArmorPickupEntity(game, item) {
6110
6990
  }
6111
6991
 
6112
6992
  // src/entities/items.ts
6993
+ init_ammo();
6113
6994
  function registerItemSpawns(game, registry) {
6114
6995
  for (const weaponItem of Object.values(WEAPON_ITEMS)) {
6115
6996
  registry.register(weaponItem.id, (entity) => {
@@ -6148,37 +7029,41 @@ function registerItemSpawns(game, registry) {
6148
7029
  }
6149
7030
  }
6150
7031
 
7032
+ // src/entities/funcs.ts
7033
+ init_esm();
7034
+
6151
7035
  // src/entities/gibs.ts
6152
- var random2 = createRandomGenerator();
7036
+ init_esm();
7037
+ var random3 = createRandomGenerator();
6153
7038
  var GIB_METALLIC = 1;
6154
7039
  var GIB_DEBRIS = 2;
6155
7040
  function spawnGib(sys, origin, damage, model, type) {
6156
7041
  const gib = sys.spawn();
6157
7042
  gib.classname = "gib";
6158
7043
  gib.origin = {
6159
- x: origin.x + (random2.frandom() - 0.5) * 20,
6160
- y: origin.y + (random2.frandom() - 0.5) * 20,
6161
- z: origin.z + (random2.frandom() - 0.5) * 20
7044
+ x: origin.x + (random3.frandom() - 0.5) * 20,
7045
+ y: origin.y + (random3.frandom() - 0.5) * 20,
7046
+ z: origin.z + (random3.frandom() - 0.5) * 20
6162
7047
  };
6163
7048
  gib.velocity = {
6164
- x: (random2.frandom() - 0.5) * 300,
6165
- y: (random2.frandom() - 0.5) * 300,
6166
- z: 200 + random2.frandom() * 100
7049
+ x: (random3.frandom() - 0.5) * 300,
7050
+ y: (random3.frandom() - 0.5) * 300,
7051
+ z: 200 + random3.frandom() * 100
6167
7052
  };
6168
7053
  gib.movetype = 9 /* Bounce */;
6169
7054
  gib.solid = 0 /* Not */;
6170
7055
  gib.clipmask = 1;
6171
7056
  gib.avelocity = {
6172
- x: random2.crandom() * 600,
6173
- y: random2.crandom() * 600,
6174
- z: random2.crandom() * 600
7057
+ x: random3.crandom() * 600,
7058
+ y: random3.crandom() * 600,
7059
+ z: random3.crandom() * 600
6175
7060
  };
6176
7061
  const defaultModels = [
6177
7062
  "models/objects/gibs/bone/tris.md2",
6178
7063
  "models/objects/gibs/meat/tris.md2",
6179
7064
  "models/objects/gibs/sm_meat/tris.md2"
6180
7065
  ];
6181
- const modelName = model || defaultModels[Math.floor(random2.frandom() * defaultModels.length)];
7066
+ const modelName = model || defaultModels[Math.floor(random3.frandom() * defaultModels.length)];
6182
7067
  gib.modelindex = sys.modelIndex(modelName);
6183
7068
  gib.mins = { x: -2, y: -2, z: -2 };
6184
7069
  gib.maxs = { x: 2, y: 2, z: 2 };
@@ -6187,14 +7072,14 @@ function spawnGib(sys, origin, damage, model, type) {
6187
7072
  gib.think = (self) => {
6188
7073
  sys.free(self);
6189
7074
  };
6190
- sys.scheduleThink(gib, sys.timeSeconds + 10 + random2.frandom() * 10);
7075
+ sys.scheduleThink(gib, sys.timeSeconds + 10 + random3.frandom() * 10);
6191
7076
  sys.finalizeSpawn(gib);
6192
7077
  return gib;
6193
7078
  }
6194
7079
  function throwGibs(sys, origin, damageOrDefs) {
6195
7080
  if (typeof damageOrDefs === "number") {
6196
7081
  const damage = damageOrDefs;
6197
- const count = 4 + Math.floor(random2.frandom() * 4);
7082
+ const count = 4 + Math.floor(random3.frandom() * 4);
6198
7083
  for (let i = 0; i < count; i++) {
6199
7084
  spawnGib(sys, origin, damage);
6200
7085
  }
@@ -7041,6 +7926,9 @@ function registerLightSpawns(registry) {
7041
7926
  });
7042
7927
  }
7043
7928
 
7929
+ // src/entities/monsters/berserk.ts
7930
+ init_esm();
7931
+
7044
7932
  // src/ai/monster.ts
7045
7933
  function M_MoveFrame(self, context) {
7046
7934
  const move = self.monsterinfo.current_move;
@@ -7084,15 +7972,15 @@ function monster_think(self, context) {
7084
7972
  var MONSTER_TICK = 0.1;
7085
7973
  var MELEE_DISTANCE = 80;
7086
7974
  var SPAWNFLAG_BERSERK_NOJUMPING = 16;
7087
- var random3 = createRandomGenerator();
7975
+ var random4 = createRandomGenerator();
7088
7976
  function frandom() {
7089
- return random3.frandom();
7977
+ return random4.frandom();
7090
7978
  }
7091
7979
  function brandom() {
7092
- return random3.frandom() > 0.5;
7980
+ return random4.frandom() > 0.5;
7093
7981
  }
7094
7982
  function irandom(min, max) {
7095
- return Math.floor(random3.frandom() * (max - min + 1) + min);
7983
+ return Math.floor(random4.frandom() * (max - min + 1) + min);
7096
7984
  }
7097
7985
  function monster_ai_stand(self, dist, context) {
7098
7986
  ai_stand(self, MONSTER_TICK, context);
@@ -7588,6 +8476,7 @@ function registerBerserkSpawns(registry) {
7588
8476
  }
7589
8477
 
7590
8478
  // src/entities/monsters/attack.ts
8479
+ init_esm();
7591
8480
  function crandom() {
7592
8481
  return 2 * Math.random() - 1;
7593
8482
  }
@@ -7778,6 +8667,7 @@ function monster_fire_dabeam(self, damage, secondary, update_func, context) {
7778
8667
  }
7779
8668
 
7780
8669
  // src/entities/monsters/boss2.ts
8670
+ init_esm();
7781
8671
  var MONSTER_TICK2 = 0.1;
7782
8672
  var BOSS2_ROCKET_OFFSET_1 = { x: 0, y: 30, z: -15 };
7783
8673
  var BOSS2_ROCKET_OFFSET_2 = { x: 0, y: 15, z: 0 };
@@ -7965,9 +8855,10 @@ function registerBoss2Spawns(registry) {
7965
8855
  }
7966
8856
 
7967
8857
  // src/entities/monsters/brain.ts
8858
+ init_esm();
7968
8859
  var MONSTER_TICK3 = 0.1;
7969
8860
  var MELEE_DISTANCE2 = 80;
7970
- var random4 = Math.random;
8861
+ var random5 = Math.random;
7971
8862
  function monster_ai_stand3(self, dist, context) {
7972
8863
  ai_stand(self, MONSTER_TICK3, context);
7973
8864
  }
@@ -8020,7 +8911,7 @@ function brain_swing_right(self, context) {
8020
8911
  }
8021
8912
  function brain_hit_right(self, context) {
8022
8913
  const aim = { x: MELEE_DISTANCE2, y: self.maxs.x, z: 8 };
8023
- if (monster_fire_hit(self, aim, 15 + Math.floor(random4() * 5), 40, context)) {
8914
+ if (monster_fire_hit(self, aim, 15 + Math.floor(random5() * 5), 40, context)) {
8024
8915
  context.engine.sound?.(self, 0, "brain/melee3.wav", 1, 1, 0);
8025
8916
  } else {
8026
8917
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -8031,7 +8922,7 @@ function brain_swing_left(self, context) {
8031
8922
  }
8032
8923
  function brain_hit_left(self, context) {
8033
8924
  const aim = { x: MELEE_DISTANCE2, y: self.mins.x, z: 8 };
8034
- if (monster_fire_hit(self, aim, 15 + Math.floor(random4() * 5), 40, context)) {
8925
+ if (monster_fire_hit(self, aim, 15 + Math.floor(random5() * 5), 40, context)) {
8035
8926
  context.engine.sound?.(self, 0, "brain/melee3.wav", 1, 1, 0);
8036
8927
  } else {
8037
8928
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -8044,7 +8935,7 @@ function brain_chest_open(self, context) {
8044
8935
  }
8045
8936
  function brain_tentacle_attack(self, context) {
8046
8937
  const aim = { x: MELEE_DISTANCE2, y: 0, z: 8 };
8047
- if (monster_fire_hit(self, aim, 10 + Math.floor(random4() * 5), -600, context)) {
8938
+ if (monster_fire_hit(self, aim, 10 + Math.floor(random5() * 5), -600, context)) {
8048
8939
  self.count = 1;
8049
8940
  } else {
8050
8941
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -8059,7 +8950,7 @@ function brain_chest_closed(self) {
8059
8950
  }
8060
8951
  }
8061
8952
  function brain_melee(self) {
8062
- if (random4() <= 0.5) {
8953
+ if (random5() <= 0.5) {
8063
8954
  self.monsterinfo.current_move = attack1_move;
8064
8955
  } else {
8065
8956
  self.monsterinfo.current_move = attack2_move;
@@ -8142,7 +9033,7 @@ function brain_laserbeam(self, context) {
8142
9033
  monster_fire_dabeam(self, 1, true, brain_left_eye_laser_update, context);
8143
9034
  }
8144
9035
  function brain_laserbeam_reattack(self) {
8145
- if (random4() < 0.5) {
9036
+ if (random5() < 0.5) {
8146
9037
  if (self.enemy && self.enemy.health > 0) {
8147
9038
  self.frame = 0;
8148
9039
  }
@@ -8151,7 +9042,7 @@ function brain_laserbeam_reattack(self) {
8151
9042
  function brain_attack(self, context) {
8152
9043
  const r = rangeTo(self, self.enemy);
8153
9044
  if (r <= RANGE_NEAR) {
8154
- if (random4() < 0.5) {
9045
+ if (random5() < 0.5) {
8155
9046
  self.monsterinfo.current_move = attack3_move;
8156
9047
  } else {
8157
9048
  self.monsterinfo.current_move = attack4_move;
@@ -8171,7 +9062,7 @@ function brain_duck_up(self) {
8171
9062
  self.monsterinfo.aiflags &= ~16;
8172
9063
  }
8173
9064
  function brain_dodge(self, attacker, eta) {
8174
- if (random4() > 0.25) return;
9065
+ if (random5() > 0.25) return;
8175
9066
  if (!self.enemy) self.enemy = attacker;
8176
9067
  self.monsterinfo.pausetime = self.timestamp + eta + 0.5;
8177
9068
  self.monsterinfo.current_move = duck_move;
@@ -8427,7 +9318,7 @@ function brain_pain(self, other, kick, damage, context) {
8427
9318
  return;
8428
9319
  }
8429
9320
  self.pain_debounce_time = self.timestamp + 3;
8430
- const r = random4();
9321
+ const r = random5();
8431
9322
  if (r < 0.33) {
8432
9323
  context.engine.sound?.(self, 0, "brain/brnpain1.wav", 1, 1, 0);
8433
9324
  self.monsterinfo.current_move = pain1_move;
@@ -8451,7 +9342,7 @@ function brain_die(self, inflictor, attacker, damage, point, context) {
8451
9342
  context.engine.sound?.(self, 0, "brain/brndeth1.wav", 1, 1, 0);
8452
9343
  self.deadflag = 2 /* Dead */;
8453
9344
  self.takedamage = true;
8454
- if (random4() <= 0.5) {
9345
+ if (random5() <= 0.5) {
8455
9346
  self.monsterinfo.current_move = death1_move;
8456
9347
  } else {
8457
9348
  self.monsterinfo.current_move = death2_move;
@@ -8488,7 +9379,7 @@ function SP_monster_brain(self, context) {
8488
9379
  context.entities.sound?.(s, 2, "brain/brnsght1.wav", 1, 1, 0);
8489
9380
  };
8490
9381
  self.monsterinfo.search = (s) => {
8491
- if (random4() < 0.5) {
9382
+ if (random5() < 0.5) {
8492
9383
  context.entities.sound?.(s, 2, "brain/brnidle2.wav", 1, 1, 0);
8493
9384
  } else {
8494
9385
  context.entities.sound?.(s, 2, "brain/brnsrch1.wav", 1, 1, 0);
@@ -8506,9 +9397,10 @@ function registerBrainSpawns(registry) {
8506
9397
  }
8507
9398
 
8508
9399
  // src/entities/monsters/chick.ts
9400
+ init_esm();
8509
9401
  var MONSTER_TICK4 = 0.1;
8510
9402
  var MELEE_DISTANCE3 = 80;
8511
- var random5 = Math.random;
9403
+ var random6 = Math.random;
8512
9404
  function monster_ai_stand4(self, dist, context) {
8513
9405
  ai_stand(self, MONSTER_TICK4, context);
8514
9406
  }
@@ -8556,12 +9448,12 @@ function chick_run(self) {
8556
9448
  function chick_fidget(self) {
8557
9449
  if (self.monsterinfo.aiflags & 4) return;
8558
9450
  if (self.enemy) return;
8559
- if (random5() <= 0.3) {
9451
+ if (random6() <= 0.3) {
8560
9452
  self.monsterinfo.current_move = fidget_move;
8561
9453
  }
8562
9454
  }
8563
9455
  function ChickMoan(self, context) {
8564
- if (random5() < 0.5) {
9456
+ if (random6() < 0.5) {
8565
9457
  context.engine.sound?.(self, 2, "chick/chkidle1.wav", 1, 0, 0);
8566
9458
  } else {
8567
9459
  context.engine.sound?.(self, 2, "chick/chkidle2.wav", 1, 0, 0);
@@ -8570,7 +9462,7 @@ function ChickMoan(self, context) {
8570
9462
  function chick_slash(self, context) {
8571
9463
  const aim = { x: MELEE_DISTANCE3, y: self.mins.x, z: 10 };
8572
9464
  context.engine.sound?.(self, 0, "chick/chkatck3.wav", 1, 1, 0);
8573
- monster_fire_hit(self, aim, 10 + Math.floor(random5() * 6), 100, context);
9465
+ monster_fire_hit(self, aim, 10 + Math.floor(random6() * 6), 100, context);
8574
9466
  }
8575
9467
  function chick_rocket(self, context) {
8576
9468
  const { forward, right } = angleVectors(self.angles);
@@ -8591,7 +9483,7 @@ function chick_rocket(self, context) {
8591
9483
  }
8592
9484
  let dir = subtractVec3(target, finalStart);
8593
9485
  if (!blindfire && self.enemy) {
8594
- if (random5() < 0.33 || finalStart.z < self.enemy.absmin.z) {
9486
+ if (random6() < 0.33 || finalStart.z < self.enemy.absmin.z) {
8595
9487
  const tempDir = { ...dir, z: dir.z + self.enemy.viewheight };
8596
9488
  dir = tempDir;
8597
9489
  } else {
@@ -8626,7 +9518,7 @@ function chick_rerocket(self) {
8626
9518
  return;
8627
9519
  }
8628
9520
  if (self.enemy && self.enemy.health > 0) {
8629
- if (random5() <= 0.6) {
9521
+ if (random6() <= 0.6) {
8630
9522
  self.monsterinfo.current_move = attack1_move2;
8631
9523
  return;
8632
9524
  }
@@ -8635,7 +9527,7 @@ function chick_rerocket(self) {
8635
9527
  }
8636
9528
  function chick_reslash(self) {
8637
9529
  if (self.enemy && self.enemy.health > 0) {
8638
- if (random5() <= 0.9) {
9530
+ if (random6() <= 0.9) {
8639
9531
  self.monsterinfo.current_move = slash_move;
8640
9532
  return;
8641
9533
  }
@@ -8713,7 +9605,7 @@ function chick_pain(self, other, kick, damage, context) {
8713
9605
  }
8714
9606
  if (self.timestamp < (self.pain_debounce_time || 0)) return;
8715
9607
  self.pain_debounce_time = self.timestamp + 3;
8716
- const r = random5();
9608
+ const r = random6();
8717
9609
  if (r < 0.33) context.engine.sound?.(self, 0, "chick/chkpain1.wav", 1, 1, 0);
8718
9610
  else if (r < 0.66) context.engine.sound?.(self, 0, "chick/chkpain2.wav", 1, 1, 0);
8719
9611
  else context.engine.sound?.(self, 0, "chick/chkpain3.wav", 1, 1, 0);
@@ -8742,7 +9634,7 @@ function chick_die(self, inflictor, attacker, damage, point, context) {
8742
9634
  if (self.deadflag === 2 /* Dead */) return;
8743
9635
  self.deadflag = 2 /* Dead */;
8744
9636
  self.takedamage = true;
8745
- if (random5() <= 0.5) {
9637
+ if (random6() <= 0.5) {
8746
9638
  self.monsterinfo.current_move = death1_move2;
8747
9639
  context.engine.sound?.(self, 0, "chick/chkdeth1.wav", 1, 1, 0);
8748
9640
  } else {
@@ -8862,7 +9754,7 @@ function registerChickSpawns(registry) {
8862
9754
  var MONSTER_TICK5 = 0.1;
8863
9755
  var MELEE_DISTANCE4 = 80;
8864
9756
  var FLIPPER_RUN_SPEED = 24;
8865
- var random6 = Math.random;
9757
+ var random7 = Math.random;
8866
9758
  function monster_ai_stand5(self, dist, context) {
8867
9759
  ai_stand(self, MONSTER_TICK5, context);
8868
9760
  }
@@ -8979,7 +9871,7 @@ function flipper_pain(self, other, kick, damage, context) {
8979
9871
  return;
8980
9872
  }
8981
9873
  self.pain_debounce_time = self.timestamp + 3;
8982
- if (random6() < 0.5) {
9874
+ if (random7() < 0.5) {
8983
9875
  context.engine.sound?.(self, 0, "flipper/flppain1.wav", 1, 1, 0);
8984
9876
  self.monsterinfo.current_move = pain1_move3;
8985
9877
  } else {
@@ -9087,6 +9979,7 @@ function registerFlipperSpawns(registry) {
9087
9979
  }
9088
9980
 
9089
9981
  // src/entities/monsters/floater.ts
9982
+ init_esm();
9090
9983
  var MONSTER_TICK6 = 0.1;
9091
9984
  function monster_ai_stand6(self, dist, context) {
9092
9985
  ai_stand(self, MONSTER_TICK6, context);
@@ -9244,6 +10137,7 @@ function registerFloaterSpawns(registry) {
9244
10137
  }
9245
10138
 
9246
10139
  // src/entities/monsters/flyer.ts
10140
+ init_esm();
9247
10141
  var MONSTER_TICK7 = 0.1;
9248
10142
  function monster_ai_stand7(self, dist, context) {
9249
10143
  ai_stand(self, MONSTER_TICK7, context);
@@ -9422,6 +10316,7 @@ function registerFlyerSpawns(registry) {
9422
10316
  }
9423
10317
 
9424
10318
  // src/entities/monsters/gladiator.ts
10319
+ init_esm();
9425
10320
  var MONSTER_TICK8 = 0.1;
9426
10321
  function monster_ai_stand8(self, dist, context) {
9427
10322
  ai_stand(self, MONSTER_TICK8, context);
@@ -9621,6 +10516,7 @@ function registerGladiatorSpawns(registry) {
9621
10516
  }
9622
10517
 
9623
10518
  // src/entities/monsters/gunner.ts
10519
+ init_esm();
9624
10520
  var MONSTER_TICK9 = 0.1;
9625
10521
  function monster_ai_stand9(self, dist, context) {
9626
10522
  ai_stand(self, MONSTER_TICK9, context);
@@ -10043,6 +10939,7 @@ function registerGunnerSpawns(registry) {
10043
10939
  }
10044
10940
 
10045
10941
  // src/entities/monsters/hover.ts
10942
+ init_esm();
10046
10943
  var MONSTER_TICK10 = 0.1;
10047
10944
  function monster_ai_stand10(self, dist, context) {
10048
10945
  ai_stand(self, MONSTER_TICK10, context);
@@ -10200,6 +11097,7 @@ function registerHoverSpawns(registry) {
10200
11097
  }
10201
11098
 
10202
11099
  // src/entities/monsters/icarus.ts
11100
+ init_esm();
10203
11101
  var MONSTER_TICK11 = 0.1;
10204
11102
  function monster_ai_stand11(self, dist, context) {
10205
11103
  ai_stand(self, MONSTER_TICK11, context);
@@ -10357,6 +11255,7 @@ function registerIcarusSpawns(registry) {
10357
11255
  }
10358
11256
 
10359
11257
  // src/entities/monsters/infantry.ts
11258
+ init_esm();
10360
11259
  var MONSTER_TICK12 = 0.1;
10361
11260
  function monster_ai_stand12(self, dist, context) {
10362
11261
  ai_stand(self, MONSTER_TICK12, context);
@@ -10557,6 +11456,7 @@ function registerInfantrySpawns(registry) {
10557
11456
  }
10558
11457
 
10559
11458
  // src/entities/monsters/makron.ts
11459
+ init_esm();
10560
11460
  var MONSTER_TICK13 = 0.1;
10561
11461
  var MAKRON_BFG_OFFSET = { x: 30, y: 28, z: 24 };
10562
11462
  var MAKRON_BLASTER_OFFSET_1 = { x: 26, y: 16, z: 24 };
@@ -10802,6 +11702,7 @@ function registerMakronSpawns(registry) {
10802
11702
  }
10803
11703
 
10804
11704
  // src/entities/monsters/jorg.ts
11705
+ init_esm();
10805
11706
  var MONSTER_TICK14 = 0.1;
10806
11707
  var JORG_MACHINEGUN_R1_OFFSET = { x: 40, y: -20, z: 20 };
10807
11708
  var JORG_MACHINEGUN_L1_OFFSET = { x: 40, y: 20, z: 20 };
@@ -11025,7 +11926,7 @@ var SPAWNFLAG_INSANE_STAND_GROUND = 16;
11025
11926
  var SPAWNFLAG_INSANE_ALWAYS_STAND = 32;
11026
11927
  var SPAWNFLAG_INSANE_QUIET = 64;
11027
11928
  var FRAME_stand1 = 0;
11028
- var FRAME_stand40 = 39;
11929
+ var FRAME_stand402 = 39;
11029
11930
  var FRAME_stand41 = 40;
11030
11931
  var FRAME_stand59 = 58;
11031
11932
  var FRAME_stand60 = 59;
@@ -11287,7 +12188,7 @@ var frames_uptodown = [
11287
12188
  ];
11288
12189
  insane_move_uptodown = {
11289
12190
  firstframe: FRAME_stand1,
11290
- lastframe: FRAME_stand40,
12191
+ lastframe: FRAME_stand402,
11291
12192
  frames: frames_uptodown,
11292
12193
  endfunc: insane_onground
11293
12194
  };
@@ -11652,7 +12553,7 @@ function SP_misc_insane(self, context) {
11652
12553
  return;
11653
12554
  }
11654
12555
  const frame = self2.frame;
11655
- if (frame >= FRAME_crawl1 && frame <= FRAME_crawl9 || frame >= FRAME_stand100 && frame <= FRAME_stand160 || frame >= FRAME_stand1 && frame <= FRAME_stand40) {
12556
+ if (frame >= FRAME_crawl1 && frame <= FRAME_crawl9 || frame >= FRAME_stand100 && frame <= FRAME_stand160 || frame >= FRAME_stand1 && frame <= FRAME_stand402) {
11656
12557
  self2.monsterinfo.current_move = insane_move_crawl_pain;
11657
12558
  } else {
11658
12559
  self2.monsterinfo.current_move = insane_move_stand_pain;
@@ -11711,6 +12612,8 @@ function registerInsaneSpawns(registry) {
11711
12612
  }
11712
12613
 
11713
12614
  // src/entities/monsters/actor.ts
12615
+ init_esm();
12616
+ init_esm();
11714
12617
  var MONSTER_TICK16 = 0.1;
11715
12618
  var MZ2_ACTOR_MACHINEGUN_1 = 0;
11716
12619
  var actor_names = [
@@ -11729,19 +12632,19 @@ var FRAME_walk01 = 40;
11729
12632
  var FRAME_walk08 = 47;
11730
12633
  var FRAME_run02 = 48;
11731
12634
  var FRAME_run07 = 53;
11732
- var FRAME_pain101 = 54;
12635
+ var FRAME_pain1012 = 54;
11733
12636
  var FRAME_pain103 = 56;
11734
- var FRAME_pain201 = 57;
12637
+ var FRAME_pain2012 = 57;
11735
12638
  var FRAME_pain203 = 59;
11736
- var FRAME_pain301 = 60;
12639
+ var FRAME_pain3012 = 60;
11737
12640
  var FRAME_pain303 = 62;
11738
12641
  var FRAME_flip01 = 63;
11739
12642
  var FRAME_flip14 = 76;
11740
12643
  var FRAME_taunt01 = 77;
11741
12644
  var FRAME_taunt17 = 93;
11742
- var FRAME_death101 = 94;
12645
+ var FRAME_death1012 = 94;
11743
12646
  var FRAME_death107 = 100;
11744
- var FRAME_death201 = 101;
12647
+ var FRAME_death2012 = 101;
11745
12648
  var FRAME_death213 = 113;
11746
12649
  var FRAME_attak01 = 114;
11747
12650
  var FRAME_attak04 = 117;
@@ -11991,7 +12894,7 @@ var frames_pain1 = [
11991
12894
  m2(ai_move, 1)
11992
12895
  ];
11993
12896
  actor_move_pain1 = {
11994
- firstframe: FRAME_pain101,
12897
+ firstframe: FRAME_pain1012,
11995
12898
  lastframe: FRAME_pain103,
11996
12899
  frames: frames_pain1,
11997
12900
  endfunc: actor_run
@@ -12002,7 +12905,7 @@ var frames_pain2 = [
12002
12905
  m2(ai_move)
12003
12906
  ];
12004
12907
  actor_move_pain2 = {
12005
- firstframe: FRAME_pain201,
12908
+ firstframe: FRAME_pain2012,
12006
12909
  lastframe: FRAME_pain203,
12007
12910
  frames: frames_pain2,
12008
12911
  endfunc: actor_run
@@ -12013,7 +12916,7 @@ var frames_pain3 = [
12013
12916
  m2(ai_move, 0)
12014
12917
  ];
12015
12918
  actor_move_pain3 = {
12016
- firstframe: FRAME_pain301,
12919
+ firstframe: FRAME_pain3012,
12017
12920
  lastframe: FRAME_pain303,
12018
12921
  frames: frames_pain3,
12019
12922
  endfunc: actor_run
@@ -12075,7 +12978,7 @@ var frames_death1 = [
12075
12978
  m2(ai_move, 1)
12076
12979
  ];
12077
12980
  actor_move_death1 = {
12078
- firstframe: FRAME_death101,
12981
+ firstframe: FRAME_death1012,
12079
12982
  lastframe: FRAME_death107,
12080
12983
  frames: frames_death1,
12081
12984
  endfunc: actor_dead
@@ -12096,7 +12999,7 @@ var frames_death2 = [
12096
12999
  m2(ai_move)
12097
13000
  ];
12098
13001
  actor_move_death2 = {
12099
- firstframe: FRAME_death201,
13002
+ firstframe: FRAME_death2012,
12100
13003
  lastframe: FRAME_death213,
12101
13004
  frames: frames_death2,
12102
13005
  endfunc: actor_dead
@@ -12251,6 +13154,8 @@ function registerActorSpawns(registry) {
12251
13154
  }
12252
13155
 
12253
13156
  // src/entities/monsters/medic.ts
13157
+ init_esm();
13158
+ init_esm();
12254
13159
  var MONSTER_TICK17 = 0.1;
12255
13160
  function monster_ai_stand15(self, dist, context) {
12256
13161
  if (self.classname === "monster_medic") {
@@ -12627,8 +13532,9 @@ function registerMedicSpawns(registry) {
12627
13532
  }
12628
13533
 
12629
13534
  // src/entities/monsters/mutant.ts
13535
+ init_esm();
12630
13536
  var MONSTER_TICK18 = 0.1;
12631
- var random7 = () => Math.random();
13537
+ var random8 = () => Math.random();
12632
13538
  function monster_ai_stand16(self, dist, context) {
12633
13539
  ai_stand(self, MONSTER_TICK18, context);
12634
13540
  }
@@ -12741,11 +13647,11 @@ function mutant_check_attack(self, context) {
12741
13647
  if (self.enemy && self.enemy.health > 0) {
12742
13648
  const diff = subtractVec3(self.enemy.origin, self.origin);
12743
13649
  const dist = lengthVec3(diff);
12744
- if (dist < 128 && random7() < 0.5) {
13650
+ if (dist < 128 && random8() < 0.5) {
12745
13651
  self.monsterinfo.current_move = attack_move7;
12746
13652
  return true;
12747
13653
  }
12748
- if (dist >= 128 && dist < 512 && random7() < 0.3) {
13654
+ if (dist >= 128 && dist < 512 && random8() < 0.3) {
12749
13655
  self.monsterinfo.current_move = jump_move2;
12750
13656
  return true;
12751
13657
  }
@@ -12758,10 +13664,10 @@ function mutant_pain_func(self, other, kick, damage, context) {
12758
13664
  }
12759
13665
  if (self.timestamp < (self.pain_finished_time || 0)) return;
12760
13666
  self.pain_finished_time = self.timestamp + 3;
12761
- if (random7() < 0.5) {
13667
+ if (random8() < 0.5) {
12762
13668
  context.engine.sound?.(self, 0, "mutant/mutpain1.wav", 1, 1, 0);
12763
13669
  self.monsterinfo.current_move = pain1_move6;
12764
- } else if (random7() < 0.5) {
13670
+ } else if (random8() < 0.5) {
12765
13671
  context.engine.sound?.(self, 0, "mutant/mutpain2.wav", 1, 1, 0);
12766
13672
  self.monsterinfo.current_move = pain2_move6;
12767
13673
  } else {
@@ -13016,8 +13922,9 @@ function registerMutantSpawns(registry) {
13016
13922
  }
13017
13923
 
13018
13924
  // src/entities/monsters/parasite.ts
13925
+ init_esm();
13019
13926
  var MONSTER_TICK19 = 0.1;
13020
- var random8 = () => Math.random();
13927
+ var random9 = () => Math.random();
13021
13928
  function monster_ai_stand17(self, dist, context) {
13022
13929
  ai_stand(self, MONSTER_TICK19, context);
13023
13930
  }
@@ -13062,7 +13969,7 @@ function parasite_do_fidget(self) {
13062
13969
  self.monsterinfo.current_move = fidget_move3;
13063
13970
  }
13064
13971
  function parasite_refidget(self) {
13065
- if (random8() <= 0.8) {
13972
+ if (random9() <= 0.8) {
13066
13973
  self.monsterinfo.current_move = fidget_move3;
13067
13974
  } else {
13068
13975
  self.monsterinfo.current_move = end_fidget_move;
@@ -13175,7 +14082,7 @@ function parasite_pain_func(self, other, kick, damage, context) {
13175
14082
  }
13176
14083
  if (self.timestamp < (self.pain_finished_time || 0)) return;
13177
14084
  self.pain_finished_time = self.timestamp + 3;
13178
- if (random8() < 0.5) {
14085
+ if (random9() < 0.5) {
13179
14086
  context.engine.sound?.(self, 0, "parasite/parpain1.wav", 1, 1, 0);
13180
14087
  } else {
13181
14088
  context.engine.sound?.(self, 0, "parasite/parpain2.wav", 1, 1, 0);
@@ -13412,6 +14319,7 @@ function registerParasiteSpawns(registry) {
13412
14319
  }
13413
14320
 
13414
14321
  // src/entities/monsters/soldier.ts
14322
+ init_esm();
13415
14323
  var MONSTER_TICK20 = 0.1;
13416
14324
  var SOLDIER_LIGHT = 1;
13417
14325
  var SOLDIER_SSG = 2;
@@ -13750,6 +14658,7 @@ function registerMonsterSpawns(registry) {
13750
14658
  }
13751
14659
 
13752
14660
  // src/entities/monsters/supertank.ts
14661
+ init_esm();
13753
14662
  var MONSTER_TICK21 = 0.1;
13754
14663
  var SUPERTANK_MACHINEGUN_OFFSET = { x: 30, y: 30, z: 40 };
13755
14664
  var SUPERTANK_ROCKET_OFFSET = { x: 30, y: -30, z: 40 };
@@ -13974,6 +14883,7 @@ function registerSupertankSpawns(registry) {
13974
14883
  }
13975
14884
 
13976
14885
  // src/entities/monsters/tank.ts
14886
+ init_esm();
13977
14887
  var MONSTER_TICK22 = 0.1;
13978
14888
  function M_AdjustBlindfireTarget(self, start, target, right, context) {
13979
14889
  const tr = context.trace(start, target, ZERO_VEC3, ZERO_VEC3, self, MASK_SHOT);
@@ -14344,6 +15254,7 @@ function registerTankCommanderSpawns(registry) {
14344
15254
  }
14345
15255
 
14346
15256
  // src/entities/monsters/turret.ts
15257
+ init_esm();
14347
15258
  var MONSTER_TICK23 = 0.1;
14348
15259
  function monster_ai_stand21(self, dist, context) {
14349
15260
  ai_stand(self, MONSTER_TICK23, context);
@@ -14495,8 +15406,9 @@ function registerTurretSpawns(registry) {
14495
15406
  }
14496
15407
 
14497
15408
  // src/entities/monsters/gekk.ts
15409
+ init_esm();
14498
15410
  var MONSTER_TICK24 = 0.1;
14499
- var random9 = () => Math.random();
15411
+ var random10 = () => Math.random();
14500
15412
  var frandom2 = () => Math.random();
14501
15413
  var irandom2 = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
14502
15414
  function monster_ai_stand22(self, dist, context) {
@@ -15005,7 +15917,7 @@ function gekk_pain(self, other, kick, damage, context) {
15005
15917
  }
15006
15918
  self.monsterinfo.current_move = gekk_move_pain;
15007
15919
  } else {
15008
- if (random9() > 0.5) self.monsterinfo.current_move = gekk_move_pain1;
15920
+ if (random10() > 0.5) self.monsterinfo.current_move = gekk_move_pain1;
15009
15921
  else self.monsterinfo.current_move = gekk_move_pain2;
15010
15922
  }
15011
15923
  }
@@ -15137,8 +16049,9 @@ function registerGekkSpawns(registry) {
15137
16049
  }
15138
16050
 
15139
16051
  // src/entities/monsters/fixbot.ts
16052
+ init_esm();
15140
16053
  var MONSTER_TICK25 = 0.1;
15141
- var random10 = () => Math.random();
16054
+ var random11 = () => Math.random();
15142
16055
  var frandom3 = () => Math.random();
15143
16056
  function monster_ai_walk21(self, dist, context) {
15144
16057
  ai_walk(self, dist, MONSTER_TICK25, context);
@@ -15201,7 +16114,7 @@ function fixbot_search(self, context) {
15201
16114
  fixbot_run(self);
15202
16115
  fixbot_set_fly_parameters(self, true, false);
15203
16116
  } else {
15204
- if (random10() < 0.1) {
16117
+ if (random11() < 0.1) {
15205
16118
  context.engine.sound?.(self, 0, "flyer/flysght1.wav", 1, 1, 0);
15206
16119
  }
15207
16120
  }
@@ -15860,6 +16773,9 @@ var LevelClock = class {
15860
16773
  }
15861
16774
  };
15862
16775
 
16776
+ // src/save/save.ts
16777
+ init_esm();
16778
+
15863
16779
  // src/checksum.ts
15864
16780
  var FNV_OFFSET_BASIS = 2166136261;
15865
16781
  var FNV_PRIME = 16777619;
@@ -16322,6 +17238,7 @@ function applySaveFile(save, targets) {
16322
17238
  }
16323
17239
 
16324
17240
  // src/save/rerelease.ts
17241
+ init_esm();
16325
17242
  function ensureObject2(value, label) {
16326
17243
  if (!value || typeof value !== "object" || Array.isArray(value)) {
16327
17244
  throw new Error(`${label} must be an object`);
@@ -16734,6 +17651,9 @@ _SaveStorage.DEFAULT_STORE = "saves";
16734
17651
  _SaveStorage.QUICK_SLOT = "quicksave";
16735
17652
  var SaveStorage = _SaveStorage;
16736
17653
 
17654
+ // src/index.ts
17655
+ init_esm();
17656
+
16737
17657
  // src/ai/noise.ts
16738
17658
  var PNOISE_SELF = 0;
16739
17659
  var PNOISE_WEAPON = 1;
@@ -16759,8 +17679,13 @@ function PlayerNoise(who, where, type, context) {
16759
17679
  }
16760
17680
  }
16761
17681
 
17682
+ // src/entities/player.ts
17683
+ init_playerInventory();
17684
+
16762
17685
  // src/combat/obituary.ts
16763
- var random11 = createRandomGenerator();
17686
+ init_esm();
17687
+ init_esm();
17688
+ var random12 = createRandomGenerator();
16764
17689
  var PRINT_MEDIUM = 1;
16765
17690
  function getGender(ent) {
16766
17691
  return "male";
@@ -16901,30 +17826,6 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
16901
17826
  }
16902
17827
  }
16903
17828
 
16904
- // src/entities/player_anim.ts
16905
- var FRAME_stand01 = 0;
16906
- var FRAME_stand402 = 39;
16907
- var FRAME_run1 = 40;
16908
- var FRAME_run6 = 45;
16909
- var FRAME_pain1012 = 54;
16910
- var FRAME_pain104 = 57;
16911
- var FRAME_pain2012 = 58;
16912
- var FRAME_pain204 = 61;
16913
- var FRAME_pain3012 = 62;
16914
- var FRAME_pain304 = 65;
16915
- var FRAME_death1012 = 66;
16916
- var FRAME_death106 = 71;
16917
- var FRAME_death2012 = 72;
16918
- var FRAME_death206 = 77;
16919
- var FRAME_death301 = 78;
16920
- var FRAME_death306 = 83;
16921
- var ANIM_BASIC = 0;
16922
- var ANIM_PAIN = 2;
16923
- var ANIM_DEATH = 3;
16924
-
16925
- // src/combat/weapons/firing.ts
16926
- var random12 = createRandomGenerator();
16927
-
16928
17829
  // src/entities/player.ts
16929
17830
  function P_PlayerThink(ent, sys) {
16930
17831
  if (!ent.client) return;
@@ -16943,9 +17844,9 @@ function P_PlayerThink(ent, sys) {
16943
17844
  animChanged = true;
16944
17845
  }
16945
17846
  } else {
16946
- if (ent.frame >= FRAME_run1 && ent.frame <= FRAME_run6 || client.anim_priority === ANIM_BASIC && client.anim_end !== FRAME_stand402 || client.anim_priority === void 0) {
17847
+ if (ent.frame >= FRAME_run1 && ent.frame <= FRAME_run6 || client.anim_priority === ANIM_BASIC && client.anim_end !== FRAME_stand40 || client.anim_priority === void 0) {
16947
17848
  ent.frame = FRAME_stand01;
16948
- client.anim_end = FRAME_stand402;
17849
+ client.anim_end = FRAME_stand40;
16949
17850
  client.anim_priority = ANIM_BASIC;
16950
17851
  animChanged = true;
16951
17852
  }
@@ -16964,7 +17865,7 @@ function P_PlayerThink(ent, sys) {
16964
17865
  } else if (client.anim_end === ent.frame) {
16965
17866
  if (client.anim_priority === ANIM_BASIC) {
16966
17867
  if (ent.frame === FRAME_run6) ent.frame = FRAME_run1;
16967
- else if (ent.frame === FRAME_stand402) ent.frame = FRAME_stand01;
17868
+ else if (ent.frame === FRAME_stand40) ent.frame = FRAME_stand01;
16968
17869
  } else {
16969
17870
  if (client.anim_priority !== ANIM_DEATH) {
16970
17871
  client.anim_priority = ANIM_BASIC;
@@ -16980,15 +17881,15 @@ function player_pain(self, damage) {
16980
17881
  return;
16981
17882
  }
16982
17883
  self.client.anim_priority = ANIM_PAIN;
16983
- const r = random12.frandom();
17884
+ const r = random2.frandom();
16984
17885
  if (r < 0.33) {
16985
- self.frame = FRAME_pain1012;
17886
+ self.frame = FRAME_pain101;
16986
17887
  self.client.anim_end = FRAME_pain104;
16987
17888
  } else if (r < 0.66) {
16988
- self.frame = FRAME_pain2012;
17889
+ self.frame = FRAME_pain201;
16989
17890
  self.client.anim_end = FRAME_pain204;
16990
17891
  } else {
16991
- self.frame = FRAME_pain3012;
17892
+ self.frame = FRAME_pain301;
16992
17893
  self.client.anim_end = FRAME_pain304;
16993
17894
  }
16994
17895
  }
@@ -17003,12 +17904,12 @@ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
17003
17904
  }
17004
17905
  if (self.client) {
17005
17906
  self.client.anim_priority = ANIM_DEATH;
17006
- const r = random12.frandom();
17907
+ const r = random2.frandom();
17007
17908
  if (r < 0.33) {
17008
- self.frame = FRAME_death1012;
17909
+ self.frame = FRAME_death101;
17009
17910
  self.client.anim_end = FRAME_death106;
17010
17911
  } else if (r < 0.66) {
17011
- self.frame = FRAME_death2012;
17912
+ self.frame = FRAME_death201;
17012
17913
  self.client.anim_end = FRAME_death206;
17013
17914
  } else {
17014
17915
  self.frame = FRAME_death301;
@@ -17056,6 +17957,8 @@ function player_think(self, sys) {
17056
17957
  }
17057
17958
 
17058
17959
  // src/entities/playerStats.ts
17960
+ init_esm();
17961
+ init_playerInventory();
17059
17962
  var POWERUP_TIMERS = [
17060
17963
  { id: PowerupId.QuadDamage, priority: 1 },
17061
17964
  { id: PowerupId.Invulnerability, priority: 2 },
@@ -17121,7 +18024,11 @@ function populatePlayerStats(player, timeSeconds) {
17121
18024
  return statArray;
17122
18025
  }
17123
18026
 
18027
+ // src/index.ts
18028
+ init_esm();
18029
+
17124
18030
  // src/combat/specialDamage.ts
18031
+ init_esm();
17125
18032
  var ZERO2 = { x: 0, y: 0, z: 0 };
17126
18033
  var EnvironmentalFlags = /* @__PURE__ */ ((EnvironmentalFlags2) => {
17127
18034
  EnvironmentalFlags2[EnvironmentalFlags2["IN_WATER"] = 1] = "IN_WATER";
@@ -17442,6 +18349,13 @@ function createGame(imports, engine, options) {
17442
18349
  configstring
17443
18350
  };
17444
18351
  const entities = new EntitySystem(engine, systemImports, gravity, void 0, void 0, deathmatch);
18352
+ entities._game = {
18353
+ // Lazy proxy or partial implementation of GameExports needed by EntitySystem consumers (like weapons)
18354
+ // This is circular, so we must be careful.
18355
+ // We will assign the full gameExports object later?
18356
+ // No, gameExports is const defined below.
18357
+ // We can use a getter or assign properties later.
18358
+ };
17445
18359
  frameLoop.addStage("prep", (context) => {
17446
18360
  levelClock.tick(context);
17447
18361
  entities.beginFrame(levelClock.current.timeSeconds);
@@ -17728,6 +18642,7 @@ function createGame(imports, engine, options) {
17728
18642
  };
17729
18643
  const spawnRegistry = createDefaultSpawnRegistry(gameExports);
17730
18644
  entities.setSpawnRegistry(spawnRegistry);
18645
+ entities._game = gameExports;
17731
18646
  return gameExports;
17732
18647
  }
17733
18648
  // Annotate the CommonJS export names for ESM import in node: