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
@@ -3860,13 +3860,13 @@ var ViewEffects = class {
3860
3860
  };
3861
3861
 
3862
3862
  // src/hud/numbers.ts
3863
- var Draw_Number = (renderer, x, y, value, pics, width) => {
3863
+ var Draw_Number = (renderer, x, y, value, pics, width, color) => {
3864
3864
  const s = Math.abs(value).toString();
3865
3865
  for (let i = 0; i < s.length; i++) {
3866
3866
  const digit = parseInt(s[i]);
3867
3867
  const pic = pics[digit];
3868
3868
  if (pic) {
3869
- renderer.drawPic(x + i * width, y, pic);
3869
+ renderer.drawPic(x + i * width, y, pic, color);
3870
3870
  }
3871
3871
  }
3872
3872
  };
@@ -3905,10 +3905,18 @@ var Draw_Crosshair = (renderer, width, height) => {
3905
3905
  // src/hud/icons.ts
3906
3906
  var import_game = require("@quake2ts/game");
3907
3907
  var iconPics = /* @__PURE__ */ new Map();
3908
- var Draw_Icons = (renderer, client) => {
3908
+ var Draw_Icons = (renderer, client, hudNumberPics2, numberWidth2, timeMs) => {
3909
3909
  if (!client) {
3910
3910
  return;
3911
3911
  }
3912
+ const armor = client.inventory.armor;
3913
+ if (armor && armor.armorCount > 0) {
3914
+ const iconName = `i_${armor.armorType}armor`;
3915
+ const icon = iconPics.get(iconName);
3916
+ if (icon) {
3917
+ renderer.drawPic(HUD_LAYOUT.ARMOR_X - 24, HUD_LAYOUT.ARMOR_Y - 2, icon);
3918
+ }
3919
+ }
3912
3920
  const currentWeapon = client.inventory.currentWeapon;
3913
3921
  if (currentWeapon) {
3914
3922
  const weaponDef = Object.values(import_game.WEAPON_ITEMS).find((w) => w.weaponId === currentWeapon);
@@ -3921,13 +3929,44 @@ var Draw_Icons = (renderer, client) => {
3921
3929
  }
3922
3930
  }
3923
3931
  let powerupX = HUD_LAYOUT.POWERUP_X;
3924
- for (const [powerup, timer] of client.inventory.powerups.entries()) {
3925
- if (timer && timer > 0) {
3932
+ for (const [powerup, expiresAt] of client.inventory.powerups.entries()) {
3933
+ if (expiresAt && expiresAt > timeMs) {
3926
3934
  const iconName = `p_${powerup}`;
3927
3935
  const icon = iconPics.get(iconName);
3928
3936
  if (icon) {
3929
3937
  renderer.drawPic(powerupX, HUD_LAYOUT.POWERUP_Y, icon);
3930
- powerupX -= icon.width + 4;
3938
+ const remainingSeconds = Math.ceil((expiresAt - timeMs) / 1e3);
3939
+ Draw_Number(renderer, powerupX + icon.width + 2, HUD_LAYOUT.POWERUP_Y, remainingSeconds, hudNumberPics2, numberWidth2);
3940
+ powerupX -= icon.width + numberWidth2 * remainingSeconds.toString().length + 8;
3941
+ }
3942
+ }
3943
+ }
3944
+ const keys = Array.from(client.inventory.keys).sort();
3945
+ let keyY = 300;
3946
+ for (const key of keys) {
3947
+ let iconName = "";
3948
+ switch (key) {
3949
+ case "blue":
3950
+ iconName = "k_bluekey";
3951
+ break;
3952
+ case "red":
3953
+ iconName = "k_redkey";
3954
+ break;
3955
+ // 'green' and 'yellow' keys in KeyId enum map to specific Q2 key items in pickupKey logic.
3956
+ // We map them to likely icons for now to provide visual feedback as requested.
3957
+ // Future work should align KeyId enum with actual Q2 item names more closely.
3958
+ case "green":
3959
+ iconName = "k_security";
3960
+ break;
3961
+ case "yellow":
3962
+ iconName = "k_pyramid";
3963
+ break;
3964
+ }
3965
+ if (iconName) {
3966
+ const icon = iconPics.get(iconName);
3967
+ if (icon) {
3968
+ renderer.drawPic(HUD_LAYOUT.WEAPON_ICON_X, keyY, icon);
3969
+ keyY += icon.height + 2;
3931
3970
  }
3932
3971
  }
3933
3972
  }
@@ -3999,17 +4038,20 @@ var Draw_Diagnostics = (renderer, stats) => {
3999
4038
  // src/hud.ts
4000
4039
  var hudNumberPics = [];
4001
4040
  var numberWidth = 0;
4002
- var Draw_Hud = (renderer, ps, client, health, armor, ammo, stats) => {
4041
+ var Draw_Hud = (renderer, ps, client, health, armor, ammo, stats, messageSystem, timeMs) => {
4003
4042
  renderer.begin2D();
4004
4043
  if (ps.damageAlpha > 0) {
4005
4044
  renderer.drawfillRect(0, 0, renderer.width, renderer.height, [1, 0, 0, ps.damageAlpha]);
4006
4045
  }
4007
- Draw_Number(renderer, HUD_LAYOUT.HEALTH_X, HUD_LAYOUT.HEALTH_Y, health, hudNumberPics, numberWidth);
4046
+ const healthColor = health <= 25 ? [1, 0, 0, 1] : void 0;
4047
+ Draw_Number(renderer, HUD_LAYOUT.HEALTH_X, HUD_LAYOUT.HEALTH_Y, health, hudNumberPics, numberWidth, healthColor);
4008
4048
  Draw_Number(renderer, HUD_LAYOUT.ARMOR_X, HUD_LAYOUT.ARMOR_Y, armor, hudNumberPics, numberWidth);
4009
4049
  Draw_Number(renderer, HUD_LAYOUT.AMMO_X, HUD_LAYOUT.AMMO_Y, ammo, hudNumberPics, numberWidth);
4010
- Draw_Icons(renderer, client);
4050
+ Draw_Icons(renderer, client, hudNumberPics, numberWidth, timeMs);
4011
4051
  Draw_Damage(renderer, ps);
4012
4052
  Draw_Diagnostics(renderer, stats);
4053
+ messageSystem.drawCenterPrint(renderer, timeMs);
4054
+ messageSystem.drawNotifications(renderer, timeMs);
4013
4055
  if (ps.centerPrint) {
4014
4056
  renderer.drawCenterString(renderer.height / 2 - 20, ps.centerPrint);
4015
4057
  }
@@ -4020,6 +4062,55 @@ var Draw_Hud = (renderer, ps, client, health, armor, ammo, stats) => {
4020
4062
  renderer.end2D();
4021
4063
  };
4022
4064
 
4065
+ // src/hud/messages.ts
4066
+ var CENTER_PRINT_DURATION = 3e3;
4067
+ var NOTIFY_DURATION = 5e3;
4068
+ var MAX_NOTIFY_MESSAGES = 4;
4069
+ var MessageSystem = class {
4070
+ constructor() {
4071
+ this.centerPrintMsg = null;
4072
+ this.notifyMessages = [];
4073
+ }
4074
+ addCenterPrint(text, now) {
4075
+ this.centerPrintMsg = {
4076
+ text,
4077
+ startTime: now,
4078
+ duration: CENTER_PRINT_DURATION
4079
+ };
4080
+ }
4081
+ addNotify(text, now) {
4082
+ this.notifyMessages.push({
4083
+ text,
4084
+ startTime: now,
4085
+ duration: NOTIFY_DURATION
4086
+ });
4087
+ if (this.notifyMessages.length > MAX_NOTIFY_MESSAGES) {
4088
+ this.notifyMessages.shift();
4089
+ }
4090
+ }
4091
+ drawCenterPrint(renderer, now) {
4092
+ if (!this.centerPrintMsg) return;
4093
+ if (now > this.centerPrintMsg.startTime + this.centerPrintMsg.duration) {
4094
+ this.centerPrintMsg = null;
4095
+ return;
4096
+ }
4097
+ const width = this.centerPrintMsg.text.length * 8;
4098
+ const x = (renderer.width - width) / 2;
4099
+ const y = HUD_LAYOUT.CENTER_PRINT_Y;
4100
+ renderer.drawString(x, y, this.centerPrintMsg.text);
4101
+ }
4102
+ drawNotifications(renderer, now) {
4103
+ while (this.notifyMessages.length > 0 && now > this.notifyMessages[0].startTime + this.notifyMessages[0].duration) {
4104
+ this.notifyMessages.shift();
4105
+ }
4106
+ let y = 10;
4107
+ for (const msg of this.notifyMessages) {
4108
+ renderer.drawString(10, y, msg.text);
4109
+ y += 10;
4110
+ }
4111
+ }
4112
+ };
4113
+
4023
4114
  // src/demo/handler.ts
4024
4115
  var MAX_CONFIGSTRINGS3 = 2048;
4025
4116
  var ClientNetworkHandler = class {
@@ -4664,6 +4755,7 @@ var InputCommandBuffer = class {
4664
4755
  function createClient(imports) {
4665
4756
  const prediction = new ClientPrediction(imports.engine.trace);
4666
4757
  const view = new ViewEffects();
4758
+ const messageSystem = new MessageSystem();
4667
4759
  const demoPlayback = new DemoPlaybackController();
4668
4760
  const demoHandler = new ClientNetworkHandler();
4669
4761
  demoPlayback.setHandler(demoHandler);
@@ -4729,7 +4821,18 @@ function createClient(imports) {
4729
4821
  damageAlpha: 0,
4730
4822
  damageIndicators: []
4731
4823
  };
4732
- Draw_Hud(imports.engine.renderer, playerState, lastRendered.client, lastRendered.health, lastRendered.armor, lastRendered.ammo, stats);
4824
+ const timeMs = sample.latest?.timeMs ?? 0;
4825
+ Draw_Hud(
4826
+ imports.engine.renderer,
4827
+ playerState,
4828
+ lastRendered.client,
4829
+ lastRendered.health,
4830
+ lastRendered.armor,
4831
+ lastRendered.ammo,
4832
+ stats,
4833
+ messageSystem,
4834
+ timeMs
4835
+ );
4733
4836
  }
4734
4837
  void imports;
4735
4838
  void sample;
@@ -4755,6 +4858,14 @@ function createClient(imports) {
4755
4858
  return camera;
4756
4859
  },
4757
4860
  demoPlayback,
4861
+ ParseCenterPrint(msg) {
4862
+ const timeMs = latestFrame?.timeMs ?? 0;
4863
+ messageSystem.addCenterPrint(msg, timeMs);
4864
+ },
4865
+ ParseNotify(msg) {
4866
+ const timeMs = latestFrame?.timeMs ?? 0;
4867
+ messageSystem.addNotify(msg, timeMs);
4868
+ },
4758
4869
  demoHandler
4759
4870
  };
4760
4871
  }