quake2ts 0.0.89 → 0.0.90

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 (45) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +1 -1
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs +121 -10
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +121 -10
  7. package/packages/client/dist/esm/index.js.map +1 -1
  8. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  9. package/packages/client/dist/types/hud/icons.d.ts +3 -2
  10. package/packages/client/dist/types/hud/icons.d.ts.map +1 -1
  11. package/packages/client/dist/types/hud/messages.d.ts +10 -0
  12. package/packages/client/dist/types/hud/messages.d.ts.map +1 -0
  13. package/packages/client/dist/types/hud/numbers.d.ts +1 -1
  14. package/packages/client/dist/types/hud/numbers.d.ts.map +1 -1
  15. package/packages/client/dist/types/hud.d.ts +2 -1
  16. package/packages/client/dist/types/hud.d.ts.map +1 -1
  17. package/packages/client/dist/types/index.d.ts +2 -0
  18. package/packages/client/dist/types/index.d.ts.map +1 -1
  19. package/packages/engine/dist/browser/index.global.js +8 -8
  20. package/packages/engine/dist/browser/index.global.js.map +1 -1
  21. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  22. package/packages/engine/dist/esm/index.js.map +1 -1
  23. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  24. package/packages/engine/dist/types/render/renderer.d.ts +1 -1
  25. package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
  26. package/packages/game/dist/browser/index.global.js +1 -1
  27. package/packages/game/dist/browser/index.global.js.map +1 -1
  28. package/packages/game/dist/cjs/index.cjs +2687 -2640
  29. package/packages/game/dist/cjs/index.cjs.map +1 -1
  30. package/packages/game/dist/esm/index.js +2687 -2640
  31. package/packages/game/dist/esm/index.js.map +1 -1
  32. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  33. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  34. package/packages/game/dist/types/physics/movement.d.ts +1 -0
  35. package/packages/game/dist/types/physics/movement.d.ts.map +1 -1
  36. package/packages/shared/dist/browser/index.global.js +1 -1
  37. package/packages/shared/dist/browser/index.global.js.map +1 -1
  38. package/packages/shared/dist/cjs/index.cjs +22 -0
  39. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  40. package/packages/shared/dist/esm/index.js +19 -0
  41. package/packages/shared/dist/esm/index.js.map +1 -1
  42. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  43. package/packages/shared/dist/types/bsp/collision.d.ts +8 -0
  44. package/packages/shared/dist/types/bsp/collision.d.ts.map +1 -1
  45. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -3829,13 +3829,13 @@ var ViewEffects = class {
3829
3829
  };
3830
3830
 
3831
3831
  // src/hud/numbers.ts
3832
- var Draw_Number = (renderer, x, y, value, pics, width) => {
3832
+ var Draw_Number = (renderer, x, y, value, pics, width, color) => {
3833
3833
  const s = Math.abs(value).toString();
3834
3834
  for (let i = 0; i < s.length; i++) {
3835
3835
  const digit = parseInt(s[i]);
3836
3836
  const pic = pics[digit];
3837
3837
  if (pic) {
3838
- renderer.drawPic(x + i * width, y, pic);
3838
+ renderer.drawPic(x + i * width, y, pic, color);
3839
3839
  }
3840
3840
  }
3841
3841
  };
@@ -3874,10 +3874,18 @@ var Draw_Crosshair = (renderer, width, height) => {
3874
3874
  // src/hud/icons.ts
3875
3875
  import { WEAPON_ITEMS } from "@quake2ts/game";
3876
3876
  var iconPics = /* @__PURE__ */ new Map();
3877
- var Draw_Icons = (renderer, client) => {
3877
+ var Draw_Icons = (renderer, client, hudNumberPics2, numberWidth2, timeMs) => {
3878
3878
  if (!client) {
3879
3879
  return;
3880
3880
  }
3881
+ const armor = client.inventory.armor;
3882
+ if (armor && armor.armorCount > 0) {
3883
+ const iconName = `i_${armor.armorType}armor`;
3884
+ const icon = iconPics.get(iconName);
3885
+ if (icon) {
3886
+ renderer.drawPic(HUD_LAYOUT.ARMOR_X - 24, HUD_LAYOUT.ARMOR_Y - 2, icon);
3887
+ }
3888
+ }
3881
3889
  const currentWeapon = client.inventory.currentWeapon;
3882
3890
  if (currentWeapon) {
3883
3891
  const weaponDef = Object.values(WEAPON_ITEMS).find((w) => w.weaponId === currentWeapon);
@@ -3890,13 +3898,44 @@ var Draw_Icons = (renderer, client) => {
3890
3898
  }
3891
3899
  }
3892
3900
  let powerupX = HUD_LAYOUT.POWERUP_X;
3893
- for (const [powerup, timer] of client.inventory.powerups.entries()) {
3894
- if (timer && timer > 0) {
3901
+ for (const [powerup, expiresAt] of client.inventory.powerups.entries()) {
3902
+ if (expiresAt && expiresAt > timeMs) {
3895
3903
  const iconName = `p_${powerup}`;
3896
3904
  const icon = iconPics.get(iconName);
3897
3905
  if (icon) {
3898
3906
  renderer.drawPic(powerupX, HUD_LAYOUT.POWERUP_Y, icon);
3899
- powerupX -= icon.width + 4;
3907
+ const remainingSeconds = Math.ceil((expiresAt - timeMs) / 1e3);
3908
+ Draw_Number(renderer, powerupX + icon.width + 2, HUD_LAYOUT.POWERUP_Y, remainingSeconds, hudNumberPics2, numberWidth2);
3909
+ powerupX -= icon.width + numberWidth2 * remainingSeconds.toString().length + 8;
3910
+ }
3911
+ }
3912
+ }
3913
+ const keys = Array.from(client.inventory.keys).sort();
3914
+ let keyY = 300;
3915
+ for (const key of keys) {
3916
+ let iconName = "";
3917
+ switch (key) {
3918
+ case "blue":
3919
+ iconName = "k_bluekey";
3920
+ break;
3921
+ case "red":
3922
+ iconName = "k_redkey";
3923
+ break;
3924
+ // 'green' and 'yellow' keys in KeyId enum map to specific Q2 key items in pickupKey logic.
3925
+ // We map them to likely icons for now to provide visual feedback as requested.
3926
+ // Future work should align KeyId enum with actual Q2 item names more closely.
3927
+ case "green":
3928
+ iconName = "k_security";
3929
+ break;
3930
+ case "yellow":
3931
+ iconName = "k_pyramid";
3932
+ break;
3933
+ }
3934
+ if (iconName) {
3935
+ const icon = iconPics.get(iconName);
3936
+ if (icon) {
3937
+ renderer.drawPic(HUD_LAYOUT.WEAPON_ICON_X, keyY, icon);
3938
+ keyY += icon.height + 2;
3900
3939
  }
3901
3940
  }
3902
3941
  }
@@ -3968,17 +4007,20 @@ var Draw_Diagnostics = (renderer, stats) => {
3968
4007
  // src/hud.ts
3969
4008
  var hudNumberPics = [];
3970
4009
  var numberWidth = 0;
3971
- var Draw_Hud = (renderer, ps, client, health, armor, ammo, stats) => {
4010
+ var Draw_Hud = (renderer, ps, client, health, armor, ammo, stats, messageSystem, timeMs) => {
3972
4011
  renderer.begin2D();
3973
4012
  if (ps.damageAlpha > 0) {
3974
4013
  renderer.drawfillRect(0, 0, renderer.width, renderer.height, [1, 0, 0, ps.damageAlpha]);
3975
4014
  }
3976
- Draw_Number(renderer, HUD_LAYOUT.HEALTH_X, HUD_LAYOUT.HEALTH_Y, health, hudNumberPics, numberWidth);
4015
+ const healthColor = health <= 25 ? [1, 0, 0, 1] : void 0;
4016
+ Draw_Number(renderer, HUD_LAYOUT.HEALTH_X, HUD_LAYOUT.HEALTH_Y, health, hudNumberPics, numberWidth, healthColor);
3977
4017
  Draw_Number(renderer, HUD_LAYOUT.ARMOR_X, HUD_LAYOUT.ARMOR_Y, armor, hudNumberPics, numberWidth);
3978
4018
  Draw_Number(renderer, HUD_LAYOUT.AMMO_X, HUD_LAYOUT.AMMO_Y, ammo, hudNumberPics, numberWidth);
3979
- Draw_Icons(renderer, client);
4019
+ Draw_Icons(renderer, client, hudNumberPics, numberWidth, timeMs);
3980
4020
  Draw_Damage(renderer, ps);
3981
4021
  Draw_Diagnostics(renderer, stats);
4022
+ messageSystem.drawCenterPrint(renderer, timeMs);
4023
+ messageSystem.drawNotifications(renderer, timeMs);
3982
4024
  if (ps.centerPrint) {
3983
4025
  renderer.drawCenterString(renderer.height / 2 - 20, ps.centerPrint);
3984
4026
  }
@@ -3989,6 +4031,55 @@ var Draw_Hud = (renderer, ps, client, health, armor, ammo, stats) => {
3989
4031
  renderer.end2D();
3990
4032
  };
3991
4033
 
4034
+ // src/hud/messages.ts
4035
+ var CENTER_PRINT_DURATION = 3e3;
4036
+ var NOTIFY_DURATION = 5e3;
4037
+ var MAX_NOTIFY_MESSAGES = 4;
4038
+ var MessageSystem = class {
4039
+ constructor() {
4040
+ this.centerPrintMsg = null;
4041
+ this.notifyMessages = [];
4042
+ }
4043
+ addCenterPrint(text, now) {
4044
+ this.centerPrintMsg = {
4045
+ text,
4046
+ startTime: now,
4047
+ duration: CENTER_PRINT_DURATION
4048
+ };
4049
+ }
4050
+ addNotify(text, now) {
4051
+ this.notifyMessages.push({
4052
+ text,
4053
+ startTime: now,
4054
+ duration: NOTIFY_DURATION
4055
+ });
4056
+ if (this.notifyMessages.length > MAX_NOTIFY_MESSAGES) {
4057
+ this.notifyMessages.shift();
4058
+ }
4059
+ }
4060
+ drawCenterPrint(renderer, now) {
4061
+ if (!this.centerPrintMsg) return;
4062
+ if (now > this.centerPrintMsg.startTime + this.centerPrintMsg.duration) {
4063
+ this.centerPrintMsg = null;
4064
+ return;
4065
+ }
4066
+ const width = this.centerPrintMsg.text.length * 8;
4067
+ const x = (renderer.width - width) / 2;
4068
+ const y = HUD_LAYOUT.CENTER_PRINT_Y;
4069
+ renderer.drawString(x, y, this.centerPrintMsg.text);
4070
+ }
4071
+ drawNotifications(renderer, now) {
4072
+ while (this.notifyMessages.length > 0 && now > this.notifyMessages[0].startTime + this.notifyMessages[0].duration) {
4073
+ this.notifyMessages.shift();
4074
+ }
4075
+ let y = 10;
4076
+ for (const msg of this.notifyMessages) {
4077
+ renderer.drawString(10, y, msg.text);
4078
+ y += 10;
4079
+ }
4080
+ }
4081
+ };
4082
+
3992
4083
  // src/demo/handler.ts
3993
4084
  var MAX_CONFIGSTRINGS3 = 2048;
3994
4085
  var ClientNetworkHandler = class {
@@ -4633,6 +4724,7 @@ var InputCommandBuffer = class {
4633
4724
  function createClient(imports) {
4634
4725
  const prediction = new ClientPrediction(imports.engine.trace);
4635
4726
  const view = new ViewEffects();
4727
+ const messageSystem = new MessageSystem();
4636
4728
  const demoPlayback = new DemoPlaybackController();
4637
4729
  const demoHandler = new ClientNetworkHandler();
4638
4730
  demoPlayback.setHandler(demoHandler);
@@ -4698,7 +4790,18 @@ function createClient(imports) {
4698
4790
  damageAlpha: 0,
4699
4791
  damageIndicators: []
4700
4792
  };
4701
- Draw_Hud(imports.engine.renderer, playerState, lastRendered.client, lastRendered.health, lastRendered.armor, lastRendered.ammo, stats);
4793
+ const timeMs = sample.latest?.timeMs ?? 0;
4794
+ Draw_Hud(
4795
+ imports.engine.renderer,
4796
+ playerState,
4797
+ lastRendered.client,
4798
+ lastRendered.health,
4799
+ lastRendered.armor,
4800
+ lastRendered.ammo,
4801
+ stats,
4802
+ messageSystem,
4803
+ timeMs
4804
+ );
4702
4805
  }
4703
4806
  void imports;
4704
4807
  void sample;
@@ -4724,6 +4827,14 @@ function createClient(imports) {
4724
4827
  return camera;
4725
4828
  },
4726
4829
  demoPlayback,
4830
+ ParseCenterPrint(msg) {
4831
+ const timeMs = latestFrame?.timeMs ?? 0;
4832
+ messageSystem.addCenterPrint(msg, timeMs);
4833
+ },
4834
+ ParseNotify(msg) {
4835
+ const timeMs = latestFrame?.timeMs ?? 0;
4836
+ messageSystem.addNotify(msg, timeMs);
4837
+ },
4727
4838
  demoHandler
4728
4839
  };
4729
4840
  }