quake2ts 0.0.276 → 0.0.281

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +13 -13
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs.map +1 -1
  5. package/packages/client/dist/esm/index.js.map +1 -1
  6. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  7. package/packages/engine/dist/browser/index.global.js +9 -9
  8. package/packages/engine/dist/browser/index.global.js.map +1 -1
  9. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  10. package/packages/engine/dist/esm/index.js.map +1 -1
  11. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  12. package/packages/game/dist/browser/index.global.js +3 -3
  13. package/packages/game/dist/browser/index.global.js.map +1 -1
  14. package/packages/game/dist/cjs/index.cjs +2237 -1199
  15. package/packages/game/dist/cjs/index.cjs.map +1 -1
  16. package/packages/game/dist/esm/index.js +2093 -1048
  17. package/packages/game/dist/esm/index.js.map +1 -1
  18. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  19. package/packages/game/dist/types/combat/weapons/animation.d.ts +3 -2
  20. package/packages/game/dist/types/combat/weapons/animation.d.ts.map +1 -1
  21. package/packages/game/dist/types/combat/weapons/bfg.d.ts +4 -0
  22. package/packages/game/dist/types/combat/weapons/bfg.d.ts.map +1 -0
  23. package/packages/game/dist/types/combat/weapons/blaster.d.ts +4 -0
  24. package/packages/game/dist/types/combat/weapons/blaster.d.ts.map +1 -0
  25. package/packages/game/dist/types/combat/weapons/chaingun.d.ts.map +1 -1
  26. package/packages/game/dist/types/combat/weapons/firing.d.ts +10 -0
  27. package/packages/game/dist/types/combat/weapons/firing.d.ts.map +1 -1
  28. package/packages/game/dist/types/combat/weapons/frames.d.ts +43 -0
  29. package/packages/game/dist/types/combat/weapons/frames.d.ts.map +1 -1
  30. package/packages/game/dist/types/combat/weapons/grenadelauncher.d.ts +4 -0
  31. package/packages/game/dist/types/combat/weapons/grenadelauncher.d.ts.map +1 -0
  32. package/packages/game/dist/types/combat/weapons/hyperblaster.d.ts +4 -0
  33. package/packages/game/dist/types/combat/weapons/hyperblaster.d.ts.map +1 -0
  34. package/packages/game/dist/types/combat/weapons/machinegun.d.ts +4 -0
  35. package/packages/game/dist/types/combat/weapons/machinegun.d.ts.map +1 -0
  36. package/packages/game/dist/types/combat/weapons/railgun.d.ts +4 -0
  37. package/packages/game/dist/types/combat/weapons/railgun.d.ts.map +1 -0
  38. package/packages/game/dist/types/combat/weapons/rocket.d.ts +4 -0
  39. package/packages/game/dist/types/combat/weapons/rocket.d.ts.map +1 -0
  40. package/packages/game/dist/types/combat/weapons/shotgun.d.ts +4 -0
  41. package/packages/game/dist/types/combat/weapons/shotgun.d.ts.map +1 -0
  42. package/packages/game/dist/types/combat/weapons/supershotgun.d.ts +4 -0
  43. package/packages/game/dist/types/combat/weapons/supershotgun.d.ts.map +1 -0
  44. package/packages/game/dist/types/entities/entity.d.ts +17 -0
  45. package/packages/game/dist/types/entities/entity.d.ts.map +1 -1
  46. package/packages/game/dist/types/entities/funcs.d.ts.map +1 -1
  47. package/packages/game/dist/types/entities/gibs.d.ts +10 -2
  48. package/packages/game/dist/types/entities/gibs.d.ts.map +1 -1
  49. package/packages/game/dist/types/entities/misc.d.ts.map +1 -1
  50. package/packages/game/dist/types/entities/system.d.ts +2 -1
  51. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  52. package/packages/game/dist/types/entities/targets.d.ts.map +1 -1
  53. package/packages/game/dist/types/index.d.ts.map +1 -1
  54. package/packages/game/dist/types/inventory/items.d.ts.map +1 -1
  55. package/packages/shared/dist/browser/index.global.js +1 -1
  56. package/packages/shared/dist/browser/index.global.js.map +1 -1
  57. package/packages/shared/dist/cjs/index.cjs +26 -0
  58. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  59. package/packages/shared/dist/esm/index.js +25 -0
  60. package/packages/shared/dist/esm/index.js.map +1 -1
  61. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  62. package/packages/shared/dist/types/protocol/index.d.ts +1 -0
  63. package/packages/shared/dist/types/protocol/index.d.ts.map +1 -1
  64. package/packages/shared/dist/types/protocol/renderFx.d.ts +22 -0
  65. package/packages/shared/dist/types/protocol/renderFx.d.ts.map +1 -0
  66. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -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";
@@ -4073,6 +4278,7 @@ function T_RadiusDamage(entities, inflictor, attacker, damage, ignore, radius, d
4073
4278
  }
4074
4279
 
4075
4280
  // src/entities/misc.ts
4281
+ var random = createRandomGenerator();
4076
4282
  var SPAWNFLAGS_OBJECT_TRIGGER_SPAWN = 1;
4077
4283
  var SPAWNFLAGS_OBJECT_ANIMATED = 2;
4078
4284
  function func_object_touch(self, other, plane, surf) {
@@ -4124,6 +4330,24 @@ var func_object = (entity, context) => {
4124
4330
  if (entity.spawnflags & SPAWNFLAGS_OBJECT_ANIMATED) {
4125
4331
  }
4126
4332
  };
4333
+ function gib_die(self, inflictor, attacker, damage) {
4334
+ }
4335
+ function spawn_gib(entity, model, context) {
4336
+ context.entities.modelIndex(model);
4337
+ entity.solid = 0 /* Not */;
4338
+ entity.takedamage = true;
4339
+ entity.die = gib_die;
4340
+ entity.movetype = 7 /* Toss */;
4341
+ entity.deadflag = 2;
4342
+ entity.avelocity = {
4343
+ x: random.frandom() * 200,
4344
+ y: random.frandom() * 200,
4345
+ z: random.frandom() * 200
4346
+ };
4347
+ entity.think = (self) => context.entities.free(self);
4348
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + 10);
4349
+ context.entities.linkentity(entity);
4350
+ }
4127
4351
  function registerMiscSpawns(registry) {
4128
4352
  registry.register("misc_teleporter", (entity) => {
4129
4353
  });
@@ -4141,14 +4365,23 @@ function registerMiscSpawns(registry) {
4141
4365
  entity.movetype = 0 /* None */;
4142
4366
  entity.solid = 3 /* Bsp */;
4143
4367
  });
4144
- registry.register("misc_gib_arm", (entity) => {
4145
- entity.movetype = 7 /* Toss */;
4146
- entity.solid = 0 /* Not */;
4368
+ registry.register("misc_gib_arm", (entity, context) => {
4369
+ spawn_gib(entity, "models/objects/gibs/arm/tris.md2", context);
4370
+ });
4371
+ registry.register("misc_gib_leg", (entity, context) => {
4372
+ spawn_gib(entity, "models/objects/gibs/leg/tris.md2", context);
4373
+ });
4374
+ registry.register("misc_gib_head", (entity, context) => {
4375
+ spawn_gib(entity, "models/objects/gibs/head/tris.md2", context);
4147
4376
  });
4148
4377
  registry.register("func_object", func_object);
4149
4378
  }
4150
4379
 
4380
+ // src/entities/targets.ts
4381
+ init_esm();
4382
+
4151
4383
  // src/entities/utils.ts
4384
+ init_esm();
4152
4385
  var VEC_UP = { x: 0, y: -1, z: 0 };
4153
4386
  var MOVEDIR_UP = { x: 0, y: 0, z: 1 };
4154
4387
  var VEC_DOWN = { x: 0, y: -2, z: 0 };
@@ -4170,6 +4403,7 @@ function setMovedir(angles) {
4170
4403
  }
4171
4404
 
4172
4405
  // src/entities/projectiles.ts
4406
+ init_esm();
4173
4407
  function createRocket(sys, owner, start, dir, damage, radiusDamage, speed, flashtype = 0) {
4174
4408
  const rocket = sys.spawn();
4175
4409
  rocket.classname = "rocket";
@@ -4625,6 +4859,7 @@ function useTargetSpawner(self, other, activator, context, registry) {
4625
4859
  warn: context.warn,
4626
4860
  free: context.free
4627
4861
  };
4862
+ ent.monsterinfo.aiflags |= 1024 /* DoNotCount */;
4628
4863
  spawnFunc(ent, spawnContext);
4629
4864
  context.entities.finalizeSpawn(ent);
4630
4865
  context.entities.linkentity(ent);
@@ -4632,6 +4867,7 @@ function useTargetSpawner(self, other, activator, context, registry) {
4632
4867
  if (self.speed) {
4633
4868
  ent.velocity = { ...self.movedir };
4634
4869
  }
4870
+ ent.renderfx |= RenderFx.IrVisible;
4635
4871
  }
4636
4872
  var SPAWNFLAG_BLASTER_NOTRAIL = 1;
4637
4873
  var SPAWNFLAG_BLASTER_NOEFFECTS = 2;
@@ -5017,6 +5253,7 @@ function registerTargetSpawns(registry) {
5017
5253
  }
5018
5254
 
5019
5255
  // src/entities/triggers.ts
5256
+ init_esm();
5020
5257
  var FRAME_TIME_SECONDS = 1 / 40;
5021
5258
  var THINK_INTERVAL = 0.1;
5022
5259
  var HURT_INTERVAL = 0.1;
@@ -5519,91 +5756,749 @@ function triggerElevatorInit(self, entities, warn) {
5519
5756
  warn(`trigger_elevator target ${self.target} is not a train`);
5520
5757
  return;
5521
5758
  }
5522
- self.use = (entity, other, activator) => triggerElevatorUse(entity, other ?? activator ?? null, entities, warn);
5523
- self.svflags |= 1 /* NoClient */;
5524
- }
5525
- function registerTriggerElevator(registry) {
5526
- registry.register("trigger_elevator", (entity, context) => {
5527
- entity.think = (self) => triggerElevatorInit(self, context.entities, context.warn);
5528
- context.entities.scheduleThink(entity, context.entities.timeSeconds + FRAME_TIME_SECONDS);
5529
- });
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) {
6103
+ return;
6104
+ }
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) {
6124
+ return;
6125
+ }
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) {
6140
+ return;
6141
+ }
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) {
6164
+ return;
6165
+ }
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) {
6180
+ return;
6181
+ }
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);
6189
+ }
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);
6202
+ }
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) {
6212
+ }
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;
6220
+ }
6221
+ if (ent.client?.inventory.powerups.has(PowerupId.QuadFire)) {
6222
+ time *= 0.25;
6223
+ }
6224
+ return time;
6225
+ }
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) {
6234
+ return;
6235
+ }
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);
6245
+ return;
6246
+ }
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
+ });
6256
+ return;
6257
+ }
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;
6263
+ }
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;
6277
+ }
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
+ }
6290
+ }
6291
+ if (client.gun_frame < FRAME_FIRE_LAST) {
6292
+ client.gun_frame++;
6293
+ client.weapon_think_time = time + Weapon_AnimationTime(ent);
6294
+ return;
6295
+ }
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
+ }
5530
6301
  }
5531
- function registerTriggerMonsterJump(registry) {
5532
- registry.register("trigger_monsterjump", (entity, context) => {
5533
- const heightText = context.keyValues.height;
5534
- const height = heightText ? Number.parseFloat(heightText) || 0 : 200;
5535
- if (entity.angles.y === 0) {
5536
- entity.angles = { ...entity.angles, y: 360 };
5537
- }
5538
- if (!entity.speed) {
5539
- entity.speed = 200;
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++;
5540
6310
  }
5541
- initTrigger(entity);
5542
- entity.movedir = { ...entity.movedir, z: height };
5543
- const touchHandler = (self, other) => monsterJumpTouch(self, other);
5544
- entity.touch = touchHandler;
5545
- if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.StartOff) {
5546
- entity.solid = 0 /* Not */;
5547
- entity.touch = void 0;
6311
+ if (fire) {
6312
+ fire(ent);
5548
6313
  }
5549
- if (entity.spawnflags & MONSTERJUMP_SPAWNFLAGS.Toggle) {
5550
- entity.use = (self) => {
5551
- toggleSolid(self);
5552
- self.touch = self.solid === 1 /* Trigger */ ? touchHandler : void 0;
5553
- };
6314
+ if (!(client.buttons & 1)) {
6315
+ client.gun_frame = FRAME_IDLE_LAST + 1;
6316
+ client.weaponstate = 0 /* WEAPON_READY */;
5554
6317
  }
5555
- });
5556
- }
5557
- function registerTriggerSpawns(registry) {
5558
- registerTriggerMultiple(registry);
5559
- registerTriggerOnce(registry);
5560
- registerTriggerRelay(registry);
5561
- registerTriggerAlways(registry);
5562
- registerTriggerCounter(registry);
5563
- registerTriggerKey(registry);
5564
- registerTriggerPush(registry);
5565
- registerTriggerHurt(registry);
5566
- registerTriggerTeleport(registry);
5567
- registerTriggerGravity(registry);
5568
- registerTriggerElevator(registry);
5569
- registerTriggerMonsterJump(registry);
5570
- }
5571
-
5572
- // src/combat/weapons/state.ts
5573
- var WeaponStateEnum = /* @__PURE__ */ ((WeaponStateEnum2) => {
5574
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_READY"] = 0] = "WEAPON_READY";
5575
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_ACTIVATING"] = 1] = "WEAPON_ACTIVATING";
5576
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_DROPPING"] = 2] = "WEAPON_DROPPING";
5577
- WeaponStateEnum2[WeaponStateEnum2["WEAPON_FIRING"] = 3] = "WEAPON_FIRING";
5578
- return WeaponStateEnum2;
5579
- })(WeaponStateEnum || {});
5580
- function createPlayerWeaponStates() {
5581
- return {
5582
- states: /* @__PURE__ */ new Map()
5583
- };
5584
- }
5585
- function getWeaponState(playerStates, weaponId) {
5586
- let state = playerStates.states.get(weaponId);
5587
- if (!state) {
5588
- state = { lastFireTime: 0 };
5589
- playerStates.states.set(weaponId, state);
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
+ );
5590
6330
  }
5591
- return state;
5592
6331
  }
5593
6332
 
5594
- // src/buttons.ts
5595
- var BUTTON_ATTACK = 1;
5596
-
5597
6333
  // src/combat/weapons/chaingun.ts
5598
6334
  function chaingunThink(player, sys) {
5599
- if (!player.client) {
5600
- return;
5601
- }
5602
6335
  const weaponState = getWeaponState(player.client.weaponStates, WeaponId.Chaingun);
5603
6336
  if (!(player.client.buttons & BUTTON_ATTACK) && weaponState.spinupCount && weaponState.spinupCount > 0) {
5604
6337
  sys.sound(player, 0, "weapons/chngnd1a.wav", 1, 0, 0);
5605
6338
  weaponState.spinupCount = 0;
5606
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
+ );
5607
6502
  }
5608
6503
 
5609
6504
  // src/inventory/items.ts
@@ -5616,7 +6511,8 @@ var WEAPON_ITEMS = {
5616
6511
  ammoType: null,
5617
6512
  initialAmmo: 0,
5618
6513
  pickupAmmo: 0,
5619
- fireRate: 0.5
6514
+ fireRate: 0.5,
6515
+ think: blasterThink
5620
6516
  },
5621
6517
  "weapon_shotgun": {
5622
6518
  type: "weapon",
@@ -5626,7 +6522,8 @@ var WEAPON_ITEMS = {
5626
6522
  ammoType: AmmoType.Shells,
5627
6523
  initialAmmo: 10,
5628
6524
  pickupAmmo: 10,
5629
- fireRate: 1
6525
+ fireRate: 1,
6526
+ think: shotgunThink
5630
6527
  },
5631
6528
  "weapon_supershotgun": {
5632
6529
  type: "weapon",
@@ -5636,7 +6533,8 @@ var WEAPON_ITEMS = {
5636
6533
  ammoType: AmmoType.Shells,
5637
6534
  initialAmmo: 10,
5638
6535
  pickupAmmo: 10,
5639
- fireRate: 1
6536
+ fireRate: 1,
6537
+ think: superShotgunThink
5640
6538
  },
5641
6539
  "weapon_machinegun": {
5642
6540
  type: "weapon",
@@ -5647,7 +6545,7 @@ var WEAPON_ITEMS = {
5647
6545
  initialAmmo: 50,
5648
6546
  pickupAmmo: 50,
5649
6547
  fireRate: 0.1,
5650
- think: chaingunThink
6548
+ think: machinegunThink
5651
6549
  },
5652
6550
  "weapon_chaingun": {
5653
6551
  type: "weapon",
@@ -5657,7 +6555,8 @@ var WEAPON_ITEMS = {
5657
6555
  ammoType: AmmoType.Bullets,
5658
6556
  initialAmmo: 50,
5659
6557
  pickupAmmo: 50,
5660
- fireRate: 0.1
6558
+ fireRate: 0.1,
6559
+ think: chaingunThink
5661
6560
  },
5662
6561
  "weapon_grenades": {
5663
6562
  type: "weapon",
@@ -5677,7 +6576,8 @@ var WEAPON_ITEMS = {
5677
6576
  ammoType: AmmoType.Grenades,
5678
6577
  initialAmmo: 10,
5679
6578
  pickupAmmo: 10,
5680
- fireRate: 1
6579
+ fireRate: 1,
6580
+ think: grenadeLauncherThink
5681
6581
  },
5682
6582
  "weapon_rocketlauncher": {
5683
6583
  type: "weapon",
@@ -5687,7 +6587,8 @@ var WEAPON_ITEMS = {
5687
6587
  ammoType: AmmoType.Rockets,
5688
6588
  initialAmmo: 5,
5689
6589
  pickupAmmo: 5,
5690
- fireRate: 1
6590
+ fireRate: 1,
6591
+ think: rocketLauncherThink
5691
6592
  },
5692
6593
  "weapon_hyperblaster": {
5693
6594
  type: "weapon",
@@ -5697,7 +6598,8 @@ var WEAPON_ITEMS = {
5697
6598
  ammoType: AmmoType.Cells,
5698
6599
  initialAmmo: 50,
5699
6600
  pickupAmmo: 50,
5700
- fireRate: 0.1
6601
+ fireRate: 0.1,
6602
+ think: hyperBlasterThink
5701
6603
  },
5702
6604
  "weapon_railgun": {
5703
6605
  type: "weapon",
@@ -5707,7 +6609,8 @@ var WEAPON_ITEMS = {
5707
6609
  ammoType: AmmoType.Slugs,
5708
6610
  initialAmmo: 10,
5709
6611
  pickupAmmo: 10,
5710
- fireRate: 1.5
6612
+ fireRate: 1.5,
6613
+ think: railgunThink
5711
6614
  },
5712
6615
  "weapon_bfg": {
5713
6616
  type: "weapon",
@@ -5717,7 +6620,8 @@ var WEAPON_ITEMS = {
5717
6620
  ammoType: AmmoType.Cells,
5718
6621
  initialAmmo: 50,
5719
6622
  pickupAmmo: 50,
5720
- fireRate: 1
6623
+ fireRate: 1,
6624
+ think: bfgThink2
5721
6625
  },
5722
6626
  // Rogue Weapons
5723
6627
  "weapon_boomer": {
@@ -5772,7 +6676,6 @@ var WEAPON_ITEMS = {
5772
6676
  fireRate: 0.8
5773
6677
  // Guessing fire rate, refine if needed
5774
6678
  }
5775
- // ... add others as we implement them
5776
6679
  };
5777
6680
  var HEALTH_ITEMS = {
5778
6681
  "item_health_small": {
@@ -6032,6 +6935,7 @@ function createKeyPickupEntity(game, keyItem) {
6032
6935
  }
6033
6936
 
6034
6937
  // src/entities/items/ammo.ts
6938
+ init_ammo();
6035
6939
  function createAmmoPickupEntity(game, itemId) {
6036
6940
  const def = getAmmoItemDefinition(itemId);
6037
6941
  const respawn = (self) => {
@@ -6086,6 +6990,7 @@ function createPowerArmorPickupEntity(game, item) {
6086
6990
  }
6087
6991
 
6088
6992
  // src/entities/items.ts
6993
+ init_ammo();
6089
6994
  function registerItemSpawns(game, registry) {
6090
6995
  for (const weaponItem of Object.values(WEAPON_ITEMS)) {
6091
6996
  registry.register(weaponItem.id, (entity) => {
@@ -6124,6 +7029,70 @@ function registerItemSpawns(game, registry) {
6124
7029
  }
6125
7030
  }
6126
7031
 
7032
+ // src/entities/funcs.ts
7033
+ init_esm();
7034
+
7035
+ // src/entities/gibs.ts
7036
+ init_esm();
7037
+ var random3 = createRandomGenerator();
7038
+ var GIB_METALLIC = 1;
7039
+ var GIB_DEBRIS = 2;
7040
+ function spawnGib(sys, origin, damage, model, type) {
7041
+ const gib = sys.spawn();
7042
+ gib.classname = "gib";
7043
+ gib.origin = {
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
7047
+ };
7048
+ gib.velocity = {
7049
+ x: (random3.frandom() - 0.5) * 300,
7050
+ y: (random3.frandom() - 0.5) * 300,
7051
+ z: 200 + random3.frandom() * 100
7052
+ };
7053
+ gib.movetype = 9 /* Bounce */;
7054
+ gib.solid = 0 /* Not */;
7055
+ gib.clipmask = 1;
7056
+ gib.avelocity = {
7057
+ x: random3.crandom() * 600,
7058
+ y: random3.crandom() * 600,
7059
+ z: random3.crandom() * 600
7060
+ };
7061
+ const defaultModels = [
7062
+ "models/objects/gibs/bone/tris.md2",
7063
+ "models/objects/gibs/meat/tris.md2",
7064
+ "models/objects/gibs/sm_meat/tris.md2"
7065
+ ];
7066
+ const modelName = model || defaultModels[Math.floor(random3.frandom() * defaultModels.length)];
7067
+ gib.modelindex = sys.modelIndex(modelName);
7068
+ gib.mins = { x: -2, y: -2, z: -2 };
7069
+ gib.maxs = { x: 2, y: 2, z: 2 };
7070
+ if (type && type & GIB_METALLIC) {
7071
+ }
7072
+ gib.think = (self) => {
7073
+ sys.free(self);
7074
+ };
7075
+ sys.scheduleThink(gib, sys.timeSeconds + 10 + random3.frandom() * 10);
7076
+ sys.finalizeSpawn(gib);
7077
+ return gib;
7078
+ }
7079
+ function throwGibs(sys, origin, damageOrDefs) {
7080
+ if (typeof damageOrDefs === "number") {
7081
+ const damage = damageOrDefs;
7082
+ const count = 4 + Math.floor(random3.frandom() * 4);
7083
+ for (let i = 0; i < count; i++) {
7084
+ spawnGib(sys, origin, damage);
7085
+ }
7086
+ } else {
7087
+ const defs = damageOrDefs;
7088
+ for (const def of defs) {
7089
+ for (let i = 0; i < def.count; i++) {
7090
+ spawnGib(sys, origin, 0, def.model, def.flags);
7091
+ }
7092
+ }
7093
+ }
7094
+ }
7095
+
6127
7096
  // src/entities/funcs.ts
6128
7097
  function move_calc(ent, dest, context, done) {
6129
7098
  const dt = 0.1;
@@ -6768,15 +7737,99 @@ var func_water = (entity, context) => {
6768
7737
  entity.solid = 3 /* Bsp */;
6769
7738
  entity.movetype = 2 /* Push */;
6770
7739
  };
7740
+ var SPAWNFLAGS_EXPLOSIVE_TRIGGER_SPAWN = 1;
7741
+ var SPAWNFLAGS_EXPLOSIVE_ANIMATED = 2;
7742
+ var SPAWNFLAGS_EXPLOSIVE_ANIMATED_FAST = 4;
7743
+ var SPAWNFLAGS_EXPLOSIVE_INACTIVE = 8;
7744
+ var SPAWNFLAGS_EXPLOSIVE_ALWAYS_SHOOTABLE = 16;
6771
7745
  var func_explosive = (entity, context) => {
6772
- entity.solid = 3 /* Bsp */;
7746
+ const sys = context.entities;
6773
7747
  entity.movetype = 2 /* Push */;
6774
- if (!entity.health) entity.health = 100;
6775
- if (!entity.dmg) entity.dmg = 120;
6776
- entity.takedamage = true;
6777
- entity.die = (self, inflictor, attacker, damage) => {
6778
- context.entities.free(self);
7748
+ const func_explosive_spawn = (self, other, activator) => {
7749
+ self.solid = 3 /* Bsp */;
7750
+ self.svflags &= ~1 /* NoClient */;
7751
+ self.use = void 0;
7752
+ sys.linkentity(self);
7753
+ sys.killBox(self);
7754
+ };
7755
+ const func_explosive_explode = (self, inflictor, attacker, damage) => {
7756
+ self.takedamage = false;
7757
+ const ent = self;
7758
+ if (ent.dmg) {
7759
+ const radius = ent.dmg + 40;
7760
+ const candidates = sys.findByRadius(ent.origin, radius);
7761
+ const damageables = candidates;
7762
+ T_RadiusDamage(damageables, ent, attacker, ent.dmg, null, radius, 0 /* NONE */, 26 /* EXPLOSIVE */, sys.timeSeconds, {}, sys.multicast.bind(sys));
7763
+ }
7764
+ const mass = ent.mass || 75;
7765
+ if (mass >= 100) {
7766
+ let count2 = Math.floor(mass / 100);
7767
+ if (count2 > 8) count2 = 8;
7768
+ throwGibs(sys, ent.origin, [
7769
+ { count: count2, model: "models/objects/debris1/tris.md2", flags: GIB_METALLIC | GIB_DEBRIS }
7770
+ ]);
7771
+ }
7772
+ let count = Math.floor(mass / 25);
7773
+ if (count > 16) count = 16;
7774
+ throwGibs(sys, ent.origin, [
7775
+ { count, model: "models/objects/debris2/tris.md2", flags: GIB_METALLIC | GIB_DEBRIS }
7776
+ ]);
7777
+ sys.useTargets(ent, attacker);
7778
+ if (ent.noise_index) {
7779
+ sys.sound(ent, 0, ent.noise_index, 1, 1, 0);
7780
+ }
7781
+ if (ent.dmg) {
7782
+ sys.free(ent);
7783
+ } else {
7784
+ sys.free(ent);
7785
+ }
7786
+ };
7787
+ const func_explosive_use = (self, other, activator) => {
7788
+ func_explosive_explode(self, self, activator || null, self.health);
6779
7789
  };
7790
+ const func_explosive_activate = (self, other, activator) => {
7791
+ let approved = false;
7792
+ if (other && other.target && self.targetname && other.target === self.targetname) {
7793
+ approved = true;
7794
+ }
7795
+ if (!approved && activator && activator.target && self.targetname && activator.target === self.targetname) {
7796
+ approved = true;
7797
+ }
7798
+ if (!approved) return;
7799
+ self.use = func_explosive_use;
7800
+ if (!self.health) self.health = 100;
7801
+ self.die = func_explosive_explode;
7802
+ self.takedamage = true;
7803
+ };
7804
+ if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_TRIGGER_SPAWN) {
7805
+ entity.svflags |= 1 /* NoClient */;
7806
+ entity.solid = 0 /* Not */;
7807
+ entity.use = func_explosive_spawn;
7808
+ } else if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_INACTIVE) {
7809
+ entity.solid = 3 /* Bsp */;
7810
+ if (entity.targetname) {
7811
+ entity.use = func_explosive_activate;
7812
+ }
7813
+ } else {
7814
+ entity.solid = 3 /* Bsp */;
7815
+ if (entity.targetname) {
7816
+ entity.use = func_explosive_use;
7817
+ }
7818
+ }
7819
+ if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_ANIMATED) {
7820
+ entity.effects |= EF_ANIM_ALL;
7821
+ }
7822
+ if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_ANIMATED_FAST) {
7823
+ entity.effects |= EF_ANIM_ALLFAST;
7824
+ }
7825
+ if (entity.spawnflags & SPAWNFLAGS_EXPLOSIVE_ALWAYS_SHOOTABLE || entity.use !== func_explosive_use && entity.use !== func_explosive_activate) {
7826
+ if (!entity.health) entity.health = 100;
7827
+ entity.die = func_explosive_explode;
7828
+ entity.takedamage = true;
7829
+ }
7830
+ if (entity.sounds === 1) {
7831
+ entity.noise_index = "world/brkglas.wav";
7832
+ }
6780
7833
  };
6781
7834
  var func_killbox = (entity, context) => {
6782
7835
  entity.solid = 0 /* Not */;
@@ -6873,6 +7926,9 @@ function registerLightSpawns(registry) {
6873
7926
  });
6874
7927
  }
6875
7928
 
7929
+ // src/entities/monsters/berserk.ts
7930
+ init_esm();
7931
+
6876
7932
  // src/ai/monster.ts
6877
7933
  function M_MoveFrame(self, context) {
6878
7934
  const move = self.monsterinfo.current_move;
@@ -6912,64 +7968,19 @@ function monster_think(self, context) {
6912
7968
  self.nextthink = context.timeSeconds + 0.1;
6913
7969
  }
6914
7970
 
6915
- // src/entities/gibs.ts
6916
- var random = createRandomGenerator();
6917
- function spawnGib(sys, origin, damage) {
6918
- const gib = sys.spawn();
6919
- gib.classname = "gib";
6920
- gib.origin = {
6921
- x: origin.x + (random.frandom() - 0.5) * 20,
6922
- y: origin.y + (random.frandom() - 0.5) * 20,
6923
- z: origin.z + (random.frandom() - 0.5) * 20
6924
- };
6925
- gib.velocity = {
6926
- x: (random.frandom() - 0.5) * 300,
6927
- y: (random.frandom() - 0.5) * 300,
6928
- z: 200 + random.frandom() * 100
6929
- };
6930
- gib.movetype = 9 /* Bounce */;
6931
- gib.solid = 0 /* Not */;
6932
- gib.clipmask = 1;
6933
- gib.avelocity = {
6934
- x: random.crandom() * 600,
6935
- y: random.crandom() * 600,
6936
- z: random.crandom() * 600
6937
- };
6938
- const models = [
6939
- "models/objects/gibs/bone/tris.md2",
6940
- "models/objects/gibs/meat/tris.md2",
6941
- "models/objects/gibs/sm_meat/tris.md2"
6942
- ];
6943
- const modelName = models[Math.floor(random.frandom() * models.length)];
6944
- gib.modelindex = sys.modelIndex(modelName);
6945
- gib.mins = { x: -2, y: -2, z: -2 };
6946
- gib.maxs = { x: 2, y: 2, z: 2 };
6947
- gib.think = (self) => {
6948
- sys.free(self);
6949
- };
6950
- sys.scheduleThink(gib, sys.timeSeconds + 10 + random.frandom() * 10);
6951
- sys.finalizeSpawn(gib);
6952
- }
6953
- function throwGibs(sys, origin, damage) {
6954
- const count = 4 + Math.floor(random.frandom() * 4);
6955
- for (let i = 0; i < count; i++) {
6956
- spawnGib(sys, origin, damage);
6957
- }
6958
- }
6959
-
6960
7971
  // src/entities/monsters/berserk.ts
6961
7972
  var MONSTER_TICK = 0.1;
6962
7973
  var MELEE_DISTANCE = 80;
6963
7974
  var SPAWNFLAG_BERSERK_NOJUMPING = 16;
6964
- var random2 = createRandomGenerator();
7975
+ var random4 = createRandomGenerator();
6965
7976
  function frandom() {
6966
- return random2.frandom();
7977
+ return random4.frandom();
6967
7978
  }
6968
7979
  function brandom() {
6969
- return random2.frandom() > 0.5;
7980
+ return random4.frandom() > 0.5;
6970
7981
  }
6971
7982
  function irandom(min, max) {
6972
- return Math.floor(random2.frandom() * (max - min + 1) + min);
7983
+ return Math.floor(random4.frandom() * (max - min + 1) + min);
6973
7984
  }
6974
7985
  function monster_ai_stand(self, dist, context) {
6975
7986
  ai_stand(self, MONSTER_TICK, context);
@@ -7465,6 +8476,7 @@ function registerBerserkSpawns(registry) {
7465
8476
  }
7466
8477
 
7467
8478
  // src/entities/monsters/attack.ts
8479
+ init_esm();
7468
8480
  function crandom() {
7469
8481
  return 2 * Math.random() - 1;
7470
8482
  }
@@ -7655,6 +8667,7 @@ function monster_fire_dabeam(self, damage, secondary, update_func, context) {
7655
8667
  }
7656
8668
 
7657
8669
  // src/entities/monsters/boss2.ts
8670
+ init_esm();
7658
8671
  var MONSTER_TICK2 = 0.1;
7659
8672
  var BOSS2_ROCKET_OFFSET_1 = { x: 0, y: 30, z: -15 };
7660
8673
  var BOSS2_ROCKET_OFFSET_2 = { x: 0, y: 15, z: 0 };
@@ -7842,9 +8855,10 @@ function registerBoss2Spawns(registry) {
7842
8855
  }
7843
8856
 
7844
8857
  // src/entities/monsters/brain.ts
8858
+ init_esm();
7845
8859
  var MONSTER_TICK3 = 0.1;
7846
8860
  var MELEE_DISTANCE2 = 80;
7847
- var random3 = Math.random;
8861
+ var random5 = Math.random;
7848
8862
  function monster_ai_stand3(self, dist, context) {
7849
8863
  ai_stand(self, MONSTER_TICK3, context);
7850
8864
  }
@@ -7897,7 +8911,7 @@ function brain_swing_right(self, context) {
7897
8911
  }
7898
8912
  function brain_hit_right(self, context) {
7899
8913
  const aim = { x: MELEE_DISTANCE2, y: self.maxs.x, z: 8 };
7900
- if (monster_fire_hit(self, aim, 15 + Math.floor(random3() * 5), 40, context)) {
8914
+ if (monster_fire_hit(self, aim, 15 + Math.floor(random5() * 5), 40, context)) {
7901
8915
  context.engine.sound?.(self, 0, "brain/melee3.wav", 1, 1, 0);
7902
8916
  } else {
7903
8917
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7908,7 +8922,7 @@ function brain_swing_left(self, context) {
7908
8922
  }
7909
8923
  function brain_hit_left(self, context) {
7910
8924
  const aim = { x: MELEE_DISTANCE2, y: self.mins.x, z: 8 };
7911
- if (monster_fire_hit(self, aim, 15 + Math.floor(random3() * 5), 40, context)) {
8925
+ if (monster_fire_hit(self, aim, 15 + Math.floor(random5() * 5), 40, context)) {
7912
8926
  context.engine.sound?.(self, 0, "brain/melee3.wav", 1, 1, 0);
7913
8927
  } else {
7914
8928
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7921,7 +8935,7 @@ function brain_chest_open(self, context) {
7921
8935
  }
7922
8936
  function brain_tentacle_attack(self, context) {
7923
8937
  const aim = { x: MELEE_DISTANCE2, y: 0, z: 8 };
7924
- if (monster_fire_hit(self, aim, 10 + Math.floor(random3() * 5), -600, context)) {
8938
+ if (monster_fire_hit(self, aim, 10 + Math.floor(random5() * 5), -600, context)) {
7925
8939
  self.count = 1;
7926
8940
  } else {
7927
8941
  self.monsterinfo.melee_debounce_time = context.timeSeconds + 3;
@@ -7936,7 +8950,7 @@ function brain_chest_closed(self) {
7936
8950
  }
7937
8951
  }
7938
8952
  function brain_melee(self) {
7939
- if (random3() <= 0.5) {
8953
+ if (random5() <= 0.5) {
7940
8954
  self.monsterinfo.current_move = attack1_move;
7941
8955
  } else {
7942
8956
  self.monsterinfo.current_move = attack2_move;
@@ -8019,7 +9033,7 @@ function brain_laserbeam(self, context) {
8019
9033
  monster_fire_dabeam(self, 1, true, brain_left_eye_laser_update, context);
8020
9034
  }
8021
9035
  function brain_laserbeam_reattack(self) {
8022
- if (random3() < 0.5) {
9036
+ if (random5() < 0.5) {
8023
9037
  if (self.enemy && self.enemy.health > 0) {
8024
9038
  self.frame = 0;
8025
9039
  }
@@ -8028,7 +9042,7 @@ function brain_laserbeam_reattack(self) {
8028
9042
  function brain_attack(self, context) {
8029
9043
  const r = rangeTo(self, self.enemy);
8030
9044
  if (r <= RANGE_NEAR) {
8031
- if (random3() < 0.5) {
9045
+ if (random5() < 0.5) {
8032
9046
  self.monsterinfo.current_move = attack3_move;
8033
9047
  } else {
8034
9048
  self.monsterinfo.current_move = attack4_move;
@@ -8048,7 +9062,7 @@ function brain_duck_up(self) {
8048
9062
  self.monsterinfo.aiflags &= ~16;
8049
9063
  }
8050
9064
  function brain_dodge(self, attacker, eta) {
8051
- if (random3() > 0.25) return;
9065
+ if (random5() > 0.25) return;
8052
9066
  if (!self.enemy) self.enemy = attacker;
8053
9067
  self.monsterinfo.pausetime = self.timestamp + eta + 0.5;
8054
9068
  self.monsterinfo.current_move = duck_move;
@@ -8304,7 +9318,7 @@ function brain_pain(self, other, kick, damage, context) {
8304
9318
  return;
8305
9319
  }
8306
9320
  self.pain_debounce_time = self.timestamp + 3;
8307
- const r = random3();
9321
+ const r = random5();
8308
9322
  if (r < 0.33) {
8309
9323
  context.engine.sound?.(self, 0, "brain/brnpain1.wav", 1, 1, 0);
8310
9324
  self.monsterinfo.current_move = pain1_move;
@@ -8328,7 +9342,7 @@ function brain_die(self, inflictor, attacker, damage, point, context) {
8328
9342
  context.engine.sound?.(self, 0, "brain/brndeth1.wav", 1, 1, 0);
8329
9343
  self.deadflag = 2 /* Dead */;
8330
9344
  self.takedamage = true;
8331
- if (random3() <= 0.5) {
9345
+ if (random5() <= 0.5) {
8332
9346
  self.monsterinfo.current_move = death1_move;
8333
9347
  } else {
8334
9348
  self.monsterinfo.current_move = death2_move;
@@ -8365,7 +9379,7 @@ function SP_monster_brain(self, context) {
8365
9379
  context.entities.sound?.(s, 2, "brain/brnsght1.wav", 1, 1, 0);
8366
9380
  };
8367
9381
  self.monsterinfo.search = (s) => {
8368
- if (random3() < 0.5) {
9382
+ if (random5() < 0.5) {
8369
9383
  context.entities.sound?.(s, 2, "brain/brnidle2.wav", 1, 1, 0);
8370
9384
  } else {
8371
9385
  context.entities.sound?.(s, 2, "brain/brnsrch1.wav", 1, 1, 0);
@@ -8383,9 +9397,10 @@ function registerBrainSpawns(registry) {
8383
9397
  }
8384
9398
 
8385
9399
  // src/entities/monsters/chick.ts
9400
+ init_esm();
8386
9401
  var MONSTER_TICK4 = 0.1;
8387
9402
  var MELEE_DISTANCE3 = 80;
8388
- var random4 = Math.random;
9403
+ var random6 = Math.random;
8389
9404
  function monster_ai_stand4(self, dist, context) {
8390
9405
  ai_stand(self, MONSTER_TICK4, context);
8391
9406
  }
@@ -8433,12 +9448,12 @@ function chick_run(self) {
8433
9448
  function chick_fidget(self) {
8434
9449
  if (self.monsterinfo.aiflags & 4) return;
8435
9450
  if (self.enemy) return;
8436
- if (random4() <= 0.3) {
9451
+ if (random6() <= 0.3) {
8437
9452
  self.monsterinfo.current_move = fidget_move;
8438
9453
  }
8439
9454
  }
8440
9455
  function ChickMoan(self, context) {
8441
- if (random4() < 0.5) {
9456
+ if (random6() < 0.5) {
8442
9457
  context.engine.sound?.(self, 2, "chick/chkidle1.wav", 1, 0, 0);
8443
9458
  } else {
8444
9459
  context.engine.sound?.(self, 2, "chick/chkidle2.wav", 1, 0, 0);
@@ -8447,7 +9462,7 @@ function ChickMoan(self, context) {
8447
9462
  function chick_slash(self, context) {
8448
9463
  const aim = { x: MELEE_DISTANCE3, y: self.mins.x, z: 10 };
8449
9464
  context.engine.sound?.(self, 0, "chick/chkatck3.wav", 1, 1, 0);
8450
- monster_fire_hit(self, aim, 10 + Math.floor(random4() * 6), 100, context);
9465
+ monster_fire_hit(self, aim, 10 + Math.floor(random6() * 6), 100, context);
8451
9466
  }
8452
9467
  function chick_rocket(self, context) {
8453
9468
  const { forward, right } = angleVectors(self.angles);
@@ -8468,7 +9483,7 @@ function chick_rocket(self, context) {
8468
9483
  }
8469
9484
  let dir = subtractVec3(target, finalStart);
8470
9485
  if (!blindfire && self.enemy) {
8471
- if (random4() < 0.33 || finalStart.z < self.enemy.absmin.z) {
9486
+ if (random6() < 0.33 || finalStart.z < self.enemy.absmin.z) {
8472
9487
  const tempDir = { ...dir, z: dir.z + self.enemy.viewheight };
8473
9488
  dir = tempDir;
8474
9489
  } else {
@@ -8503,7 +9518,7 @@ function chick_rerocket(self) {
8503
9518
  return;
8504
9519
  }
8505
9520
  if (self.enemy && self.enemy.health > 0) {
8506
- if (random4() <= 0.6) {
9521
+ if (random6() <= 0.6) {
8507
9522
  self.monsterinfo.current_move = attack1_move2;
8508
9523
  return;
8509
9524
  }
@@ -8512,7 +9527,7 @@ function chick_rerocket(self) {
8512
9527
  }
8513
9528
  function chick_reslash(self) {
8514
9529
  if (self.enemy && self.enemy.health > 0) {
8515
- if (random4() <= 0.9) {
9530
+ if (random6() <= 0.9) {
8516
9531
  self.monsterinfo.current_move = slash_move;
8517
9532
  return;
8518
9533
  }
@@ -8590,7 +9605,7 @@ function chick_pain(self, other, kick, damage, context) {
8590
9605
  }
8591
9606
  if (self.timestamp < (self.pain_debounce_time || 0)) return;
8592
9607
  self.pain_debounce_time = self.timestamp + 3;
8593
- const r = random4();
9608
+ const r = random6();
8594
9609
  if (r < 0.33) context.engine.sound?.(self, 0, "chick/chkpain1.wav", 1, 1, 0);
8595
9610
  else if (r < 0.66) context.engine.sound?.(self, 0, "chick/chkpain2.wav", 1, 1, 0);
8596
9611
  else context.engine.sound?.(self, 0, "chick/chkpain3.wav", 1, 1, 0);
@@ -8619,7 +9634,7 @@ function chick_die(self, inflictor, attacker, damage, point, context) {
8619
9634
  if (self.deadflag === 2 /* Dead */) return;
8620
9635
  self.deadflag = 2 /* Dead */;
8621
9636
  self.takedamage = true;
8622
- if (random4() <= 0.5) {
9637
+ if (random6() <= 0.5) {
8623
9638
  self.monsterinfo.current_move = death1_move2;
8624
9639
  context.engine.sound?.(self, 0, "chick/chkdeth1.wav", 1, 1, 0);
8625
9640
  } else {
@@ -8739,7 +9754,7 @@ function registerChickSpawns(registry) {
8739
9754
  var MONSTER_TICK5 = 0.1;
8740
9755
  var MELEE_DISTANCE4 = 80;
8741
9756
  var FLIPPER_RUN_SPEED = 24;
8742
- var random5 = Math.random;
9757
+ var random7 = Math.random;
8743
9758
  function monster_ai_stand5(self, dist, context) {
8744
9759
  ai_stand(self, MONSTER_TICK5, context);
8745
9760
  }
@@ -8856,7 +9871,7 @@ function flipper_pain(self, other, kick, damage, context) {
8856
9871
  return;
8857
9872
  }
8858
9873
  self.pain_debounce_time = self.timestamp + 3;
8859
- if (random5() < 0.5) {
9874
+ if (random7() < 0.5) {
8860
9875
  context.engine.sound?.(self, 0, "flipper/flppain1.wav", 1, 1, 0);
8861
9876
  self.monsterinfo.current_move = pain1_move3;
8862
9877
  } else {
@@ -8964,6 +9979,7 @@ function registerFlipperSpawns(registry) {
8964
9979
  }
8965
9980
 
8966
9981
  // src/entities/monsters/floater.ts
9982
+ init_esm();
8967
9983
  var MONSTER_TICK6 = 0.1;
8968
9984
  function monster_ai_stand6(self, dist, context) {
8969
9985
  ai_stand(self, MONSTER_TICK6, context);
@@ -9121,6 +10137,7 @@ function registerFloaterSpawns(registry) {
9121
10137
  }
9122
10138
 
9123
10139
  // src/entities/monsters/flyer.ts
10140
+ init_esm();
9124
10141
  var MONSTER_TICK7 = 0.1;
9125
10142
  function monster_ai_stand7(self, dist, context) {
9126
10143
  ai_stand(self, MONSTER_TICK7, context);
@@ -9299,6 +10316,7 @@ function registerFlyerSpawns(registry) {
9299
10316
  }
9300
10317
 
9301
10318
  // src/entities/monsters/gladiator.ts
10319
+ init_esm();
9302
10320
  var MONSTER_TICK8 = 0.1;
9303
10321
  function monster_ai_stand8(self, dist, context) {
9304
10322
  ai_stand(self, MONSTER_TICK8, context);
@@ -9498,6 +10516,7 @@ function registerGladiatorSpawns(registry) {
9498
10516
  }
9499
10517
 
9500
10518
  // src/entities/monsters/gunner.ts
10519
+ init_esm();
9501
10520
  var MONSTER_TICK9 = 0.1;
9502
10521
  function monster_ai_stand9(self, dist, context) {
9503
10522
  ai_stand(self, MONSTER_TICK9, context);
@@ -9920,6 +10939,7 @@ function registerGunnerSpawns(registry) {
9920
10939
  }
9921
10940
 
9922
10941
  // src/entities/monsters/hover.ts
10942
+ init_esm();
9923
10943
  var MONSTER_TICK10 = 0.1;
9924
10944
  function monster_ai_stand10(self, dist, context) {
9925
10945
  ai_stand(self, MONSTER_TICK10, context);
@@ -10077,6 +11097,7 @@ function registerHoverSpawns(registry) {
10077
11097
  }
10078
11098
 
10079
11099
  // src/entities/monsters/icarus.ts
11100
+ init_esm();
10080
11101
  var MONSTER_TICK11 = 0.1;
10081
11102
  function monster_ai_stand11(self, dist, context) {
10082
11103
  ai_stand(self, MONSTER_TICK11, context);
@@ -10234,6 +11255,7 @@ function registerIcarusSpawns(registry) {
10234
11255
  }
10235
11256
 
10236
11257
  // src/entities/monsters/infantry.ts
11258
+ init_esm();
10237
11259
  var MONSTER_TICK12 = 0.1;
10238
11260
  function monster_ai_stand12(self, dist, context) {
10239
11261
  ai_stand(self, MONSTER_TICK12, context);
@@ -10434,6 +11456,7 @@ function registerInfantrySpawns(registry) {
10434
11456
  }
10435
11457
 
10436
11458
  // src/entities/monsters/makron.ts
11459
+ init_esm();
10437
11460
  var MONSTER_TICK13 = 0.1;
10438
11461
  var MAKRON_BFG_OFFSET = { x: 30, y: 28, z: 24 };
10439
11462
  var MAKRON_BLASTER_OFFSET_1 = { x: 26, y: 16, z: 24 };
@@ -10679,6 +11702,7 @@ function registerMakronSpawns(registry) {
10679
11702
  }
10680
11703
 
10681
11704
  // src/entities/monsters/jorg.ts
11705
+ init_esm();
10682
11706
  var MONSTER_TICK14 = 0.1;
10683
11707
  var JORG_MACHINEGUN_R1_OFFSET = { x: 40, y: -20, z: 20 };
10684
11708
  var JORG_MACHINEGUN_L1_OFFSET = { x: 40, y: 20, z: 20 };
@@ -10902,7 +11926,7 @@ var SPAWNFLAG_INSANE_STAND_GROUND = 16;
10902
11926
  var SPAWNFLAG_INSANE_ALWAYS_STAND = 32;
10903
11927
  var SPAWNFLAG_INSANE_QUIET = 64;
10904
11928
  var FRAME_stand1 = 0;
10905
- var FRAME_stand40 = 39;
11929
+ var FRAME_stand402 = 39;
10906
11930
  var FRAME_stand41 = 40;
10907
11931
  var FRAME_stand59 = 58;
10908
11932
  var FRAME_stand60 = 59;
@@ -11164,7 +12188,7 @@ var frames_uptodown = [
11164
12188
  ];
11165
12189
  insane_move_uptodown = {
11166
12190
  firstframe: FRAME_stand1,
11167
- lastframe: FRAME_stand40,
12191
+ lastframe: FRAME_stand402,
11168
12192
  frames: frames_uptodown,
11169
12193
  endfunc: insane_onground
11170
12194
  };
@@ -11529,7 +12553,7 @@ function SP_misc_insane(self, context) {
11529
12553
  return;
11530
12554
  }
11531
12555
  const frame = self2.frame;
11532
- 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) {
11533
12557
  self2.monsterinfo.current_move = insane_move_crawl_pain;
11534
12558
  } else {
11535
12559
  self2.monsterinfo.current_move = insane_move_stand_pain;
@@ -11588,6 +12612,8 @@ function registerInsaneSpawns(registry) {
11588
12612
  }
11589
12613
 
11590
12614
  // src/entities/monsters/actor.ts
12615
+ init_esm();
12616
+ init_esm();
11591
12617
  var MONSTER_TICK16 = 0.1;
11592
12618
  var MZ2_ACTOR_MACHINEGUN_1 = 0;
11593
12619
  var actor_names = [
@@ -11606,19 +12632,19 @@ var FRAME_walk01 = 40;
11606
12632
  var FRAME_walk08 = 47;
11607
12633
  var FRAME_run02 = 48;
11608
12634
  var FRAME_run07 = 53;
11609
- var FRAME_pain101 = 54;
12635
+ var FRAME_pain1012 = 54;
11610
12636
  var FRAME_pain103 = 56;
11611
- var FRAME_pain201 = 57;
12637
+ var FRAME_pain2012 = 57;
11612
12638
  var FRAME_pain203 = 59;
11613
- var FRAME_pain301 = 60;
12639
+ var FRAME_pain3012 = 60;
11614
12640
  var FRAME_pain303 = 62;
11615
12641
  var FRAME_flip01 = 63;
11616
12642
  var FRAME_flip14 = 76;
11617
12643
  var FRAME_taunt01 = 77;
11618
12644
  var FRAME_taunt17 = 93;
11619
- var FRAME_death101 = 94;
12645
+ var FRAME_death1012 = 94;
11620
12646
  var FRAME_death107 = 100;
11621
- var FRAME_death201 = 101;
12647
+ var FRAME_death2012 = 101;
11622
12648
  var FRAME_death213 = 113;
11623
12649
  var FRAME_attak01 = 114;
11624
12650
  var FRAME_attak04 = 117;
@@ -11674,8 +12700,8 @@ function actor_pain(self, other, kick, damage) {
11674
12700
  if (context.timeSeconds < self.pain_debounce_time)
11675
12701
  return;
11676
12702
  self.pain_debounce_time = context.timeSeconds + 3;
11677
- const random12 = Math.random();
11678
- if (other && other.client && random12 < 0.4) {
12703
+ const random13 = Math.random();
12704
+ if (other && other.client && random13 < 0.4) {
11679
12705
  const v = subtractVec3(other.origin, self.origin);
11680
12706
  self.ideal_yaw = vectorToYaw(v);
11681
12707
  if (Math.random() < 0.5)
@@ -11868,7 +12894,7 @@ var frames_pain1 = [
11868
12894
  m2(ai_move, 1)
11869
12895
  ];
11870
12896
  actor_move_pain1 = {
11871
- firstframe: FRAME_pain101,
12897
+ firstframe: FRAME_pain1012,
11872
12898
  lastframe: FRAME_pain103,
11873
12899
  frames: frames_pain1,
11874
12900
  endfunc: actor_run
@@ -11879,7 +12905,7 @@ var frames_pain2 = [
11879
12905
  m2(ai_move)
11880
12906
  ];
11881
12907
  actor_move_pain2 = {
11882
- firstframe: FRAME_pain201,
12908
+ firstframe: FRAME_pain2012,
11883
12909
  lastframe: FRAME_pain203,
11884
12910
  frames: frames_pain2,
11885
12911
  endfunc: actor_run
@@ -11890,7 +12916,7 @@ var frames_pain3 = [
11890
12916
  m2(ai_move, 0)
11891
12917
  ];
11892
12918
  actor_move_pain3 = {
11893
- firstframe: FRAME_pain301,
12919
+ firstframe: FRAME_pain3012,
11894
12920
  lastframe: FRAME_pain303,
11895
12921
  frames: frames_pain3,
11896
12922
  endfunc: actor_run
@@ -11952,7 +12978,7 @@ var frames_death1 = [
11952
12978
  m2(ai_move, 1)
11953
12979
  ];
11954
12980
  actor_move_death1 = {
11955
- firstframe: FRAME_death101,
12981
+ firstframe: FRAME_death1012,
11956
12982
  lastframe: FRAME_death107,
11957
12983
  frames: frames_death1,
11958
12984
  endfunc: actor_dead
@@ -11973,7 +12999,7 @@ var frames_death2 = [
11973
12999
  m2(ai_move)
11974
13000
  ];
11975
13001
  actor_move_death2 = {
11976
- firstframe: FRAME_death201,
13002
+ firstframe: FRAME_death2012,
11977
13003
  lastframe: FRAME_death213,
11978
13004
  frames: frames_death2,
11979
13005
  endfunc: actor_dead
@@ -12128,6 +13154,8 @@ function registerActorSpawns(registry) {
12128
13154
  }
12129
13155
 
12130
13156
  // src/entities/monsters/medic.ts
13157
+ init_esm();
13158
+ init_esm();
12131
13159
  var MONSTER_TICK17 = 0.1;
12132
13160
  function monster_ai_stand15(self, dist, context) {
12133
13161
  if (self.classname === "monster_medic") {
@@ -12504,8 +13532,9 @@ function registerMedicSpawns(registry) {
12504
13532
  }
12505
13533
 
12506
13534
  // src/entities/monsters/mutant.ts
13535
+ init_esm();
12507
13536
  var MONSTER_TICK18 = 0.1;
12508
- var random6 = () => Math.random();
13537
+ var random8 = () => Math.random();
12509
13538
  function monster_ai_stand16(self, dist, context) {
12510
13539
  ai_stand(self, MONSTER_TICK18, context);
12511
13540
  }
@@ -12618,11 +13647,11 @@ function mutant_check_attack(self, context) {
12618
13647
  if (self.enemy && self.enemy.health > 0) {
12619
13648
  const diff = subtractVec3(self.enemy.origin, self.origin);
12620
13649
  const dist = lengthVec3(diff);
12621
- if (dist < 128 && random6() < 0.5) {
13650
+ if (dist < 128 && random8() < 0.5) {
12622
13651
  self.monsterinfo.current_move = attack_move7;
12623
13652
  return true;
12624
13653
  }
12625
- if (dist >= 128 && dist < 512 && random6() < 0.3) {
13654
+ if (dist >= 128 && dist < 512 && random8() < 0.3) {
12626
13655
  self.monsterinfo.current_move = jump_move2;
12627
13656
  return true;
12628
13657
  }
@@ -12635,10 +13664,10 @@ function mutant_pain_func(self, other, kick, damage, context) {
12635
13664
  }
12636
13665
  if (self.timestamp < (self.pain_finished_time || 0)) return;
12637
13666
  self.pain_finished_time = self.timestamp + 3;
12638
- if (random6() < 0.5) {
13667
+ if (random8() < 0.5) {
12639
13668
  context.engine.sound?.(self, 0, "mutant/mutpain1.wav", 1, 1, 0);
12640
13669
  self.monsterinfo.current_move = pain1_move6;
12641
- } else if (random6() < 0.5) {
13670
+ } else if (random8() < 0.5) {
12642
13671
  context.engine.sound?.(self, 0, "mutant/mutpain2.wav", 1, 1, 0);
12643
13672
  self.monsterinfo.current_move = pain2_move6;
12644
13673
  } else {
@@ -12893,8 +13922,9 @@ function registerMutantSpawns(registry) {
12893
13922
  }
12894
13923
 
12895
13924
  // src/entities/monsters/parasite.ts
13925
+ init_esm();
12896
13926
  var MONSTER_TICK19 = 0.1;
12897
- var random7 = () => Math.random();
13927
+ var random9 = () => Math.random();
12898
13928
  function monster_ai_stand17(self, dist, context) {
12899
13929
  ai_stand(self, MONSTER_TICK19, context);
12900
13930
  }
@@ -12939,7 +13969,7 @@ function parasite_do_fidget(self) {
12939
13969
  self.monsterinfo.current_move = fidget_move3;
12940
13970
  }
12941
13971
  function parasite_refidget(self) {
12942
- if (random7() <= 0.8) {
13972
+ if (random9() <= 0.8) {
12943
13973
  self.monsterinfo.current_move = fidget_move3;
12944
13974
  } else {
12945
13975
  self.monsterinfo.current_move = end_fidget_move;
@@ -13052,7 +14082,7 @@ function parasite_pain_func(self, other, kick, damage, context) {
13052
14082
  }
13053
14083
  if (self.timestamp < (self.pain_finished_time || 0)) return;
13054
14084
  self.pain_finished_time = self.timestamp + 3;
13055
- if (random7() < 0.5) {
14085
+ if (random9() < 0.5) {
13056
14086
  context.engine.sound?.(self, 0, "parasite/parpain1.wav", 1, 1, 0);
13057
14087
  } else {
13058
14088
  context.engine.sound?.(self, 0, "parasite/parpain2.wav", 1, 1, 0);
@@ -13289,6 +14319,7 @@ function registerParasiteSpawns(registry) {
13289
14319
  }
13290
14320
 
13291
14321
  // src/entities/monsters/soldier.ts
14322
+ init_esm();
13292
14323
  var MONSTER_TICK20 = 0.1;
13293
14324
  var SOLDIER_LIGHT = 1;
13294
14325
  var SOLDIER_SSG = 2;
@@ -13627,6 +14658,7 @@ function registerMonsterSpawns(registry) {
13627
14658
  }
13628
14659
 
13629
14660
  // src/entities/monsters/supertank.ts
14661
+ init_esm();
13630
14662
  var MONSTER_TICK21 = 0.1;
13631
14663
  var SUPERTANK_MACHINEGUN_OFFSET = { x: 30, y: 30, z: 40 };
13632
14664
  var SUPERTANK_ROCKET_OFFSET = { x: 30, y: -30, z: 40 };
@@ -13851,6 +14883,7 @@ function registerSupertankSpawns(registry) {
13851
14883
  }
13852
14884
 
13853
14885
  // src/entities/monsters/tank.ts
14886
+ init_esm();
13854
14887
  var MONSTER_TICK22 = 0.1;
13855
14888
  function M_AdjustBlindfireTarget(self, start, target, right, context) {
13856
14889
  const tr = context.trace(start, target, ZERO_VEC3, ZERO_VEC3, self, MASK_SHOT);
@@ -14221,6 +15254,7 @@ function registerTankCommanderSpawns(registry) {
14221
15254
  }
14222
15255
 
14223
15256
  // src/entities/monsters/turret.ts
15257
+ init_esm();
14224
15258
  var MONSTER_TICK23 = 0.1;
14225
15259
  function monster_ai_stand21(self, dist, context) {
14226
15260
  ai_stand(self, MONSTER_TICK23, context);
@@ -14372,8 +15406,9 @@ function registerTurretSpawns(registry) {
14372
15406
  }
14373
15407
 
14374
15408
  // src/entities/monsters/gekk.ts
15409
+ init_esm();
14375
15410
  var MONSTER_TICK24 = 0.1;
14376
- var random8 = () => Math.random();
15411
+ var random10 = () => Math.random();
14377
15412
  var frandom2 = () => Math.random();
14378
15413
  var irandom2 = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
14379
15414
  function monster_ai_stand22(self, dist, context) {
@@ -14882,7 +15917,7 @@ function gekk_pain(self, other, kick, damage, context) {
14882
15917
  }
14883
15918
  self.monsterinfo.current_move = gekk_move_pain;
14884
15919
  } else {
14885
- if (random8() > 0.5) self.monsterinfo.current_move = gekk_move_pain1;
15920
+ if (random10() > 0.5) self.monsterinfo.current_move = gekk_move_pain1;
14886
15921
  else self.monsterinfo.current_move = gekk_move_pain2;
14887
15922
  }
14888
15923
  }
@@ -15014,8 +16049,9 @@ function registerGekkSpawns(registry) {
15014
16049
  }
15015
16050
 
15016
16051
  // src/entities/monsters/fixbot.ts
16052
+ init_esm();
15017
16053
  var MONSTER_TICK25 = 0.1;
15018
- var random9 = () => Math.random();
16054
+ var random11 = () => Math.random();
15019
16055
  var frandom3 = () => Math.random();
15020
16056
  function monster_ai_walk21(self, dist, context) {
15021
16057
  ai_walk(self, dist, MONSTER_TICK25, context);
@@ -15078,7 +16114,7 @@ function fixbot_search(self, context) {
15078
16114
  fixbot_run(self);
15079
16115
  fixbot_set_fly_parameters(self, true, false);
15080
16116
  } else {
15081
- if (random9() < 0.1) {
16117
+ if (random11() < 0.1) {
15082
16118
  context.engine.sound?.(self, 0, "flyer/flysght1.wav", 1, 1, 0);
15083
16119
  }
15084
16120
  }
@@ -15737,6 +16773,9 @@ var LevelClock = class {
15737
16773
  }
15738
16774
  };
15739
16775
 
16776
+ // src/save/save.ts
16777
+ init_esm();
16778
+
15740
16779
  // src/checksum.ts
15741
16780
  var FNV_OFFSET_BASIS = 2166136261;
15742
16781
  var FNV_PRIME = 16777619;
@@ -16199,6 +17238,7 @@ function applySaveFile(save, targets) {
16199
17238
  }
16200
17239
 
16201
17240
  // src/save/rerelease.ts
17241
+ init_esm();
16202
17242
  function ensureObject2(value, label) {
16203
17243
  if (!value || typeof value !== "object" || Array.isArray(value)) {
16204
17244
  throw new Error(`${label} must be an object`);
@@ -16611,6 +17651,9 @@ _SaveStorage.DEFAULT_STORE = "saves";
16611
17651
  _SaveStorage.QUICK_SLOT = "quicksave";
16612
17652
  var SaveStorage = _SaveStorage;
16613
17653
 
17654
+ // src/index.ts
17655
+ init_esm();
17656
+
16614
17657
  // src/ai/noise.ts
16615
17658
  var PNOISE_SELF = 0;
16616
17659
  var PNOISE_WEAPON = 1;
@@ -16636,8 +17679,13 @@ function PlayerNoise(who, where, type, context) {
16636
17679
  }
16637
17680
  }
16638
17681
 
17682
+ // src/entities/player.ts
17683
+ init_playerInventory();
17684
+
16639
17685
  // src/combat/obituary.ts
16640
- var random10 = createRandomGenerator();
17686
+ init_esm();
17687
+ init_esm();
17688
+ var random12 = createRandomGenerator();
16641
17689
  var PRINT_MEDIUM = 1;
16642
17690
  function getGender(ent) {
16643
17691
  return "male";
@@ -16778,30 +17826,6 @@ function ClientObituary(self, inflictor, attacker, mod, sys) {
16778
17826
  }
16779
17827
  }
16780
17828
 
16781
- // src/entities/player_anim.ts
16782
- var FRAME_stand01 = 0;
16783
- var FRAME_stand402 = 39;
16784
- var FRAME_run1 = 40;
16785
- var FRAME_run6 = 45;
16786
- var FRAME_pain1012 = 54;
16787
- var FRAME_pain104 = 57;
16788
- var FRAME_pain2012 = 58;
16789
- var FRAME_pain204 = 61;
16790
- var FRAME_pain3012 = 62;
16791
- var FRAME_pain304 = 65;
16792
- var FRAME_death1012 = 66;
16793
- var FRAME_death106 = 71;
16794
- var FRAME_death2012 = 72;
16795
- var FRAME_death206 = 77;
16796
- var FRAME_death301 = 78;
16797
- var FRAME_death306 = 83;
16798
- var ANIM_BASIC = 0;
16799
- var ANIM_PAIN = 2;
16800
- var ANIM_DEATH = 3;
16801
-
16802
- // src/combat/weapons/firing.ts
16803
- var random11 = createRandomGenerator();
16804
-
16805
17829
  // src/entities/player.ts
16806
17830
  function P_PlayerThink(ent, sys) {
16807
17831
  if (!ent.client) return;
@@ -16820,9 +17844,9 @@ function P_PlayerThink(ent, sys) {
16820
17844
  animChanged = true;
16821
17845
  }
16822
17846
  } else {
16823
- 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) {
16824
17848
  ent.frame = FRAME_stand01;
16825
- client.anim_end = FRAME_stand402;
17849
+ client.anim_end = FRAME_stand40;
16826
17850
  client.anim_priority = ANIM_BASIC;
16827
17851
  animChanged = true;
16828
17852
  }
@@ -16841,7 +17865,7 @@ function P_PlayerThink(ent, sys) {
16841
17865
  } else if (client.anim_end === ent.frame) {
16842
17866
  if (client.anim_priority === ANIM_BASIC) {
16843
17867
  if (ent.frame === FRAME_run6) ent.frame = FRAME_run1;
16844
- else if (ent.frame === FRAME_stand402) ent.frame = FRAME_stand01;
17868
+ else if (ent.frame === FRAME_stand40) ent.frame = FRAME_stand01;
16845
17869
  } else {
16846
17870
  if (client.anim_priority !== ANIM_DEATH) {
16847
17871
  client.anim_priority = ANIM_BASIC;
@@ -16857,15 +17881,15 @@ function player_pain(self, damage) {
16857
17881
  return;
16858
17882
  }
16859
17883
  self.client.anim_priority = ANIM_PAIN;
16860
- const r = random11.frandom();
17884
+ const r = random2.frandom();
16861
17885
  if (r < 0.33) {
16862
- self.frame = FRAME_pain1012;
17886
+ self.frame = FRAME_pain101;
16863
17887
  self.client.anim_end = FRAME_pain104;
16864
17888
  } else if (r < 0.66) {
16865
- self.frame = FRAME_pain2012;
17889
+ self.frame = FRAME_pain201;
16866
17890
  self.client.anim_end = FRAME_pain204;
16867
17891
  } else {
16868
- self.frame = FRAME_pain3012;
17892
+ self.frame = FRAME_pain301;
16869
17893
  self.client.anim_end = FRAME_pain304;
16870
17894
  }
16871
17895
  }
@@ -16880,12 +17904,12 @@ function player_die(self, inflictor, attacker, damage, point, mod, sys) {
16880
17904
  }
16881
17905
  if (self.client) {
16882
17906
  self.client.anim_priority = ANIM_DEATH;
16883
- const r = random11.frandom();
17907
+ const r = random2.frandom();
16884
17908
  if (r < 0.33) {
16885
- self.frame = FRAME_death1012;
17909
+ self.frame = FRAME_death101;
16886
17910
  self.client.anim_end = FRAME_death106;
16887
17911
  } else if (r < 0.66) {
16888
- self.frame = FRAME_death2012;
17912
+ self.frame = FRAME_death201;
16889
17913
  self.client.anim_end = FRAME_death206;
16890
17914
  } else {
16891
17915
  self.frame = FRAME_death301;
@@ -16933,6 +17957,8 @@ function player_think(self, sys) {
16933
17957
  }
16934
17958
 
16935
17959
  // src/entities/playerStats.ts
17960
+ init_esm();
17961
+ init_playerInventory();
16936
17962
  var POWERUP_TIMERS = [
16937
17963
  { id: PowerupId.QuadDamage, priority: 1 },
16938
17964
  { id: PowerupId.Invulnerability, priority: 2 },
@@ -16998,7 +18024,11 @@ function populatePlayerStats(player, timeSeconds) {
16998
18024
  return statArray;
16999
18025
  }
17000
18026
 
18027
+ // src/index.ts
18028
+ init_esm();
18029
+
17001
18030
  // src/combat/specialDamage.ts
18031
+ init_esm();
17002
18032
  var ZERO2 = { x: 0, y: 0, z: 0 };
17003
18033
  var EnvironmentalFlags = /* @__PURE__ */ ((EnvironmentalFlags2) => {
17004
18034
  EnvironmentalFlags2[EnvironmentalFlags2["IN_WATER"] = 1] = "IN_WATER";
@@ -17319,6 +18349,13 @@ function createGame(imports, engine, options) {
17319
18349
  configstring
17320
18350
  };
17321
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
+ };
17322
18359
  frameLoop.addStage("prep", (context) => {
17323
18360
  levelClock.tick(context);
17324
18361
  entities.beginFrame(levelClock.current.timeSeconds);
@@ -17605,6 +18642,7 @@ function createGame(imports, engine, options) {
17605
18642
  };
17606
18643
  const spawnRegistry = createDefaultSpawnRegistry(gameExports);
17607
18644
  entities.setSpawnRegistry(spawnRegistry);
18645
+ entities._game = gameExports;
17608
18646
  return gameExports;
17609
18647
  }
17610
18648
  // Annotate the CommonJS export names for ESM import in node: