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.
- package/package.json +1 -1
- package/packages/client/dist/browser/index.global.js +1 -1
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +121 -10
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +121 -10
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/client/dist/types/hud/icons.d.ts +3 -2
- package/packages/client/dist/types/hud/icons.d.ts.map +1 -1
- package/packages/client/dist/types/hud/messages.d.ts +10 -0
- package/packages/client/dist/types/hud/messages.d.ts.map +1 -0
- package/packages/client/dist/types/hud/numbers.d.ts +1 -1
- package/packages/client/dist/types/hud/numbers.d.ts.map +1 -1
- package/packages/client/dist/types/hud.d.ts +2 -1
- package/packages/client/dist/types/hud.d.ts.map +1 -1
- package/packages/client/dist/types/index.d.ts +2 -0
- package/packages/client/dist/types/index.d.ts.map +1 -1
- package/packages/engine/dist/browser/index.global.js +8 -8
- package/packages/engine/dist/browser/index.global.js.map +1 -1
- package/packages/engine/dist/cjs/index.cjs.map +1 -1
- package/packages/engine/dist/esm/index.js.map +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/render/renderer.d.ts +1 -1
- package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
- package/packages/game/dist/browser/index.global.js +1 -1
- package/packages/game/dist/browser/index.global.js.map +1 -1
- package/packages/game/dist/cjs/index.cjs +2687 -2640
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +2687 -2640
- package/packages/game/dist/esm/index.js.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/types/entities/system.d.ts.map +1 -1
- package/packages/game/dist/types/physics/movement.d.ts +1 -0
- package/packages/game/dist/types/physics/movement.d.ts.map +1 -1
- package/packages/shared/dist/browser/index.global.js +1 -1
- package/packages/shared/dist/browser/index.global.js.map +1 -1
- package/packages/shared/dist/cjs/index.cjs +22 -0
- package/packages/shared/dist/cjs/index.cjs.map +1 -1
- package/packages/shared/dist/esm/index.js +19 -0
- package/packages/shared/dist/esm/index.js.map +1 -1
- package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/shared/dist/types/bsp/collision.d.ts +8 -0
- package/packages/shared/dist/types/bsp/collision.d.ts.map +1 -1
- 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,
|
|
3894
|
-
if (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|