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
|
@@ -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,
|
|
3925
|
-
if (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|