quake2ts 0.0.236 → 0.0.237

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 (48) hide show
  1. package/package.json +1 -1
  2. package/packages/cgame/dist/index.cjs +10 -2
  3. package/packages/cgame/dist/index.cjs.map +1 -1
  4. package/packages/cgame/dist/index.d.cts +1 -0
  5. package/packages/cgame/dist/index.d.ts +1 -0
  6. package/packages/cgame/dist/index.js +10 -2
  7. package/packages/cgame/dist/index.js.map +1 -1
  8. package/packages/client/dist/browser/index.global.js +13 -13
  9. package/packages/client/dist/browser/index.global.js.map +1 -1
  10. package/packages/client/dist/cjs/index.cjs +237 -2
  11. package/packages/client/dist/cjs/index.cjs.map +1 -1
  12. package/packages/client/dist/esm/index.js +264 -29
  13. package/packages/client/dist/esm/index.js.map +1 -1
  14. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  15. package/packages/client/dist/types/demo/handler.d.ts +4 -1
  16. package/packages/client/dist/types/demo/handler.d.ts.map +1 -1
  17. package/packages/client/dist/types/index.d.ts.map +1 -1
  18. package/packages/engine/dist/browser/index.global.js +5 -5
  19. package/packages/engine/dist/browser/index.global.js.map +1 -1
  20. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  21. package/packages/engine/dist/esm/index.js.map +1 -1
  22. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  23. package/packages/engine/dist/types/render/scene.d.ts +2 -0
  24. package/packages/engine/dist/types/render/scene.d.ts.map +1 -1
  25. package/packages/game/dist/browser/index.global.js +2 -2
  26. package/packages/game/dist/browser/index.global.js.map +1 -1
  27. package/packages/game/dist/cjs/index.cjs +2 -0
  28. package/packages/game/dist/cjs/index.cjs.map +1 -1
  29. package/packages/game/dist/esm/index.js +2 -0
  30. package/packages/game/dist/esm/index.js.map +1 -1
  31. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  32. package/packages/game/dist/types/combat/weapons/firing.d.ts.map +1 -1
  33. package/packages/game/dist/types/index.d.ts +1 -0
  34. package/packages/game/dist/types/index.d.ts.map +1 -1
  35. package/packages/server/dist/index.cjs +1 -0
  36. package/packages/server/dist/index.js +1 -0
  37. package/packages/shared/dist/browser/index.global.js +1 -1
  38. package/packages/shared/dist/browser/index.global.js.map +1 -1
  39. package/packages/shared/dist/cjs/index.cjs +42 -0
  40. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  41. package/packages/shared/dist/esm/index.js +28 -0
  42. package/packages/shared/dist/esm/index.js.map +1 -1
  43. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  44. package/packages/shared/dist/types/protocol/constants.d.ts +14 -0
  45. package/packages/shared/dist/types/protocol/constants.d.ts.map +1 -1
  46. package/packages/shared/dist/types/protocol/player-state.d.ts +1 -0
  47. package/packages/shared/dist/types/protocol/player-state.d.ts.map +1 -1
  48. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -8219,6 +8219,67 @@ function mouseDeltaToViewDelta(delta, options) {
8219
8219
  z: 0
8220
8220
  };
8221
8221
  }
8222
+ var MZ_BLASTER = 0;
8223
+ var MZ_MACHINEGUN = 1;
8224
+ var MZ_SHOTGUN = 2;
8225
+ var MZ_CHAINGUN1 = 3;
8226
+ var MZ_CHAINGUN2 = 4;
8227
+ var MZ_CHAINGUN3 = 5;
8228
+ var MZ_RAILGUN = 6;
8229
+ var MZ_ROCKET = 7;
8230
+ var MZ_GRENADE = 8;
8231
+ var MZ_SSHOTGUN = 11;
8232
+ var MZ_BFG = 12;
8233
+ var MZ_HYPERBLASTER = 13;
8234
+ function readUint16LE(stats, startIndex, byteOffset) {
8235
+ const elementIndex = Math.floor(byteOffset / 2);
8236
+ const isOdd = byteOffset % 2 !== 0;
8237
+ const index = startIndex + elementIndex;
8238
+ const val0 = stats[index] || 0;
8239
+ if (!isOdd) {
8240
+ return val0 & 65535;
8241
+ } else {
8242
+ const val1 = stats[index + 1] || 0;
8243
+ const low = val0 >>> 8 & 255;
8244
+ const high = val1 & 255;
8245
+ return high << 8 | low;
8246
+ }
8247
+ }
8248
+ function getCompressedInteger(stats, startIndex, id, bitsPerValue) {
8249
+ const bitOffset = bitsPerValue * id;
8250
+ const byteOffset = Math.floor(bitOffset / 8);
8251
+ const bitShift = bitOffset % 8;
8252
+ const mask = (1 << bitsPerValue) - 1 << bitShift;
8253
+ const base = readUint16LE(stats, startIndex, byteOffset);
8254
+ return (base & mask) >>> bitShift;
8255
+ }
8256
+ var PowerupId = /* @__PURE__ */ ((PowerupId22) => {
8257
+ PowerupId22["QuadDamage"] = "quad";
8258
+ PowerupId22["Invulnerability"] = "invulnerability";
8259
+ PowerupId22["EnviroSuit"] = "enviro_suit";
8260
+ PowerupId22["Rebreather"] = "rebreather";
8261
+ PowerupId22["Silencer"] = "silencer";
8262
+ PowerupId22["PowerScreen"] = "power_screen";
8263
+ PowerupId22["PowerShield"] = "power_shield";
8264
+ PowerupId22["QuadFire"] = "quad_fire";
8265
+ PowerupId22["Invisibility"] = "invisibility";
8266
+ PowerupId22["Bandolier"] = "bandolier";
8267
+ PowerupId22["AmmoPack"] = "ammo_pack";
8268
+ PowerupId22["IRGoggles"] = "ir_goggles";
8269
+ PowerupId22["DoubleDamage"] = "double_damage";
8270
+ PowerupId22["SphereVengeance"] = "sphere_vengeance";
8271
+ PowerupId22["SphereHunter"] = "sphere_hunter";
8272
+ PowerupId22["SphereDefender"] = "sphere_defender";
8273
+ PowerupId22["Doppelganger"] = "doppelganger";
8274
+ PowerupId22["TagToken"] = "tag_token";
8275
+ PowerupId22["TechResistance"] = "tech_resistance";
8276
+ PowerupId22["TechStrength"] = "tech_strength";
8277
+ PowerupId22["TechHaste"] = "tech_haste";
8278
+ PowerupId22["TechRegeneration"] = "tech_regeneration";
8279
+ PowerupId22["Flashlight"] = "flashlight";
8280
+ PowerupId22["Compass"] = "compass";
8281
+ return PowerupId22;
8282
+ })(PowerupId || {});
8222
8283
  var PlayerStat = /* @__PURE__ */ ((PlayerStat2) => {
8223
8284
  PlayerStat2[PlayerStat2["STAT_HEALTH_ICON"] = 0] = "STAT_HEALTH_ICON";
8224
8285
  PlayerStat2[PlayerStat2["STAT_HEALTH"] = 1] = "STAT_HEALTH";
@@ -8275,6 +8336,104 @@ var NUM_AMMO_STATS2 = Math.ceil(AMMO_MAX2 * NUM_BITS_FOR_AMMO2 / 16);
8275
8336
  var POWERUP_MAX2 = 23;
8276
8337
  var NUM_BITS_FOR_POWERUP2 = 2;
8277
8338
  var NUM_POWERUP_STATS2 = Math.ceil(POWERUP_MAX2 * NUM_BITS_FOR_POWERUP2 / 16);
8339
+ var POWERUP_STAT_MAP = {
8340
+ [
8341
+ "power_screen"
8342
+ /* PowerScreen */
8343
+ ]: 0,
8344
+ [
8345
+ "power_shield"
8346
+ /* PowerShield */
8347
+ ]: 1,
8348
+ // 2 is POWERUP_AM_BOMB (not in PowerupId?)
8349
+ [
8350
+ "quad"
8351
+ /* QuadDamage */
8352
+ ]: 3,
8353
+ [
8354
+ "quad_fire"
8355
+ /* QuadFire */
8356
+ ]: 4,
8357
+ [
8358
+ "invulnerability"
8359
+ /* Invulnerability */
8360
+ ]: 5,
8361
+ [
8362
+ "invisibility"
8363
+ /* Invisibility */
8364
+ ]: 6,
8365
+ [
8366
+ "silencer"
8367
+ /* Silencer */
8368
+ ]: 7,
8369
+ [
8370
+ "rebreather"
8371
+ /* Rebreather */
8372
+ ]: 8,
8373
+ [
8374
+ "enviro_suit"
8375
+ /* EnviroSuit */
8376
+ ]: 9,
8377
+ // 10 is POWERUP_ADRENALINE (not in PowerupId?)
8378
+ [
8379
+ "ir_goggles"
8380
+ /* IRGoggles */
8381
+ ]: 11,
8382
+ [
8383
+ "double_damage"
8384
+ /* DoubleDamage */
8385
+ ]: 12,
8386
+ [
8387
+ "sphere_vengeance"
8388
+ /* SphereVengeance */
8389
+ ]: 13,
8390
+ [
8391
+ "sphere_hunter"
8392
+ /* SphereHunter */
8393
+ ]: 14,
8394
+ [
8395
+ "sphere_defender"
8396
+ /* SphereDefender */
8397
+ ]: 15,
8398
+ [
8399
+ "doppelganger"
8400
+ /* Doppelganger */
8401
+ ]: 16,
8402
+ [
8403
+ "flashlight"
8404
+ /* Flashlight */
8405
+ ]: 17,
8406
+ [
8407
+ "compass"
8408
+ /* Compass */
8409
+ ]: 18,
8410
+ [
8411
+ "tech_resistance"
8412
+ /* TechResistance */
8413
+ ]: 19,
8414
+ [
8415
+ "tech_strength"
8416
+ /* TechStrength */
8417
+ ]: 20,
8418
+ [
8419
+ "tech_haste"
8420
+ /* TechHaste */
8421
+ ]: 21,
8422
+ [
8423
+ "tech_regeneration"
8424
+ /* TechRegeneration */
8425
+ ]: 22
8426
+ };
8427
+ function G_GetPowerupStat(stats, powerupId) {
8428
+ let index;
8429
+ if (typeof powerupId === "number") {
8430
+ index = powerupId;
8431
+ } else {
8432
+ index = POWERUP_STAT_MAP[powerupId];
8433
+ }
8434
+ if (index === void 0 || index < 0 || index >= POWERUP_MAX2) return 0;
8435
+ return getCompressedInteger(stats, 41, index, NUM_BITS_FOR_POWERUP2);
8436
+ }
8278
8437
  var entityFlags_exports2 = {};
8279
8438
  __export3(entityFlags_exports2, {
8280
8439
  U_ANGLE1: () => U_ANGLE13,
@@ -8869,6 +9028,7 @@ var ClientNetworkHandler = class {
8869
9028
  // Stats for HUD
8870
9029
  this.stats = new Array(32).fill(0);
8871
9030
  this.inventory = new Array(256).fill(0);
9031
+ this.playerNum = 0;
8872
9032
  this.imports = imports;
8873
9033
  this.callbacks = callbacks;
8874
9034
  }
@@ -8878,12 +9038,16 @@ var ClientNetworkHandler = class {
8878
9038
  setCallbacks(callbacks) {
8879
9039
  this.callbacks = callbacks;
8880
9040
  }
9041
+ setView(view) {
9042
+ this.view = view;
9043
+ }
8881
9044
  onServerData(protocol, serverCount, attractLoop, gameDir, playerNum, levelName) {
8882
9045
  console.log(`Demo: Server Data - Protocol: ${protocol}, Level: ${levelName}`);
8883
9046
  this.configstrings.fill("");
8884
9047
  this.entities.clear();
8885
9048
  this.baselines.clear();
8886
9049
  this.latestFrame = null;
9050
+ this.playerNum = playerNum;
8887
9051
  }
8888
9052
  onConfigString(index, str3) {
8889
9053
  this.configstrings[index] = str3;
@@ -9005,6 +9169,63 @@ var ClientNetworkHandler = class {
9005
9169
  onMuzzleFlash2(ent, weapon) {
9006
9170
  }
9007
9171
  onMuzzleFlash3(ent, weapon) {
9172
+ const isLocalPlayer = ent === this.playerNum + 1;
9173
+ if (isLocalPlayer && this.view) {
9174
+ let pitch = 0;
9175
+ let yaw = 0;
9176
+ let roll = 0;
9177
+ let kickOrigin = ZERO_VEC3;
9178
+ const quad = G_GetPowerupStat(this.stats, PowerupId.QuadDamage);
9179
+ const scale3 = quad ? 4 : 1;
9180
+ switch (weapon) {
9181
+ case MZ_SHOTGUN:
9182
+ pitch = -2;
9183
+ kickOrigin = { x: -2, y: 0, z: 0 };
9184
+ break;
9185
+ case MZ_SSHOTGUN:
9186
+ pitch = -4;
9187
+ kickOrigin = { x: -4, y: 0, z: 0 };
9188
+ break;
9189
+ case MZ_MACHINEGUN:
9190
+ pitch = -1;
9191
+ yaw = Math.random() - 0.5;
9192
+ break;
9193
+ case MZ_CHAINGUN1:
9194
+ case MZ_CHAINGUN2:
9195
+ case MZ_CHAINGUN3:
9196
+ pitch = -0.5;
9197
+ yaw = Math.random() - 0.5;
9198
+ break;
9199
+ case MZ_RAILGUN:
9200
+ pitch = -3;
9201
+ kickOrigin = { x: -3, y: 0, z: 0 };
9202
+ break;
9203
+ case MZ_ROCKET:
9204
+ case MZ_GRENADE:
9205
+ pitch = -2;
9206
+ kickOrigin = { x: -2, y: 0, z: 0 };
9207
+ break;
9208
+ case MZ_BFG:
9209
+ pitch = -5;
9210
+ kickOrigin = { x: -2, y: 0, z: 0 };
9211
+ break;
9212
+ case MZ_HYPERBLASTER:
9213
+ case MZ_BLASTER:
9214
+ pitch = -0.5;
9215
+ break;
9216
+ }
9217
+ if (pitch !== 0 || yaw !== 0 || roll !== 0) {
9218
+ this.view.addKick({
9219
+ pitch: pitch * scale3,
9220
+ roll: roll * scale3,
9221
+ durationMs: 200,
9222
+ origin: kickOrigin
9223
+ // Should origin be scaled? Q2 source P_AddWeaponKick only scales angles.
9224
+ // But we have origin kick logic now. Let's assume origin kick is physical recoil and maybe doesn't scale with quad (magic damage)?
9225
+ // P_AddWeaponKick only scales kick_angles.
9226
+ });
9227
+ }
9228
+ }
9008
9229
  if (this.callbacks?.onMuzzleFlash3) {
9009
9230
  this.callbacks.onMuzzleFlash3(ent, weapon);
9010
9231
  }
@@ -9121,6 +9342,7 @@ var ClientNetworkHandler = class {
9121
9342
  // Stubs
9122
9343
  stats: [...ps.stats],
9123
9344
  kick_angles: ZERO_VEC3,
9345
+ kick_origin: ZERO_VEC3,
9124
9346
  gunoffset: ZERO_VEC3,
9125
9347
  gunangles: ZERO_VEC3,
9126
9348
  gunindex: 0,
@@ -10512,11 +10734,20 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10512
10734
  };
10513
10735
  const frame = ent.frame;
10514
10736
  const prevFrame = prev.frame;
10737
+ const scaleA = prev.scale !== void 0 ? prev.scale : 1;
10738
+ const scaleB = ent.scale !== void 0 ? ent.scale : 1;
10739
+ const scale3 = lerp2(scaleA, scaleB, alpha);
10740
+ const getAlpha = (val) => val === void 0 || val === 0 ? 255 : val;
10741
+ const alphaA = getAlpha(prev.alpha);
10742
+ const alphaB = getAlpha(ent.alpha);
10743
+ const alphaVal = lerp2(alphaA, alphaB, alpha);
10744
+ const normalizedAlpha = alphaVal / 255;
10515
10745
  const mat = mat4_exports.create();
10516
10746
  mat4_exports.translate(mat, mat, [origin.x, origin.y, origin.z]);
10517
10747
  mat4_exports.rotateZ(mat, mat, angles.z * Math.PI / 180);
10518
10748
  mat4_exports.rotateY(mat, mat, angles.y * Math.PI / 180);
10519
10749
  mat4_exports.rotateX(mat, mat, angles.x * Math.PI / 180);
10750
+ mat4_exports.scale(mat, mat, [scale3, scale3, scale3]);
10520
10751
  if (model.header.magic === 844121161) {
10521
10752
  renderables.push({
10522
10753
  type: "md2",
@@ -10528,7 +10759,8 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10528
10759
  lerp: alpha
10529
10760
  },
10530
10761
  transform: mat,
10531
- skin: ent.skinNum > 0 ? configStrings.getImageName(ent.skinNum) : void 0
10762
+ skin: ent.skinNum > 0 ? configStrings.getImageName(ent.skinNum) : void 0,
10763
+ alpha: normalizedAlpha
10532
10764
  });
10533
10765
  } else if (model.header.magic === 860898377) {
10534
10766
  renderables.push({
@@ -10539,7 +10771,8 @@ function buildRenderableEntities(latestEntities, previousEntities, alpha, config
10539
10771
  frame1: frame,
10540
10772
  lerp: alpha
10541
10773
  },
10542
- transform: mat
10774
+ transform: mat,
10775
+ alpha: normalizedAlpha
10543
10776
  // Lighting? Skins?
10544
10777
  });
10545
10778
  }
@@ -10551,6 +10784,7 @@ function createClient(imports) {
10551
10784
  const view = new import_cgame3.ViewEffects();
10552
10785
  const demoPlayback = new DemoPlaybackController();
10553
10786
  const demoHandler = new ClientNetworkHandler(imports);
10787
+ demoHandler.setView(view);
10554
10788
  const menuSystem = new MenuSystem();
10555
10789
  const loadingScreen = new LoadingScreen();
10556
10790
  const errorDialog = new ErrorDialog();
@@ -10876,6 +11110,7 @@ function createClient(imports) {
10876
11110
  // Ensure stats are safely initialized
10877
11111
  stats: lastRendered.stats ? [...lastRendered.stats] : new Array(32).fill(0),
10878
11112
  kick_angles: ZERO_VEC32,
11113
+ kick_origin: ZERO_VEC32,
10879
11114
  gunoffset: ZERO_VEC32,
10880
11115
  gunangles: ZERO_VEC32,
10881
11116
  gunindex: 0,