quake2ts 0.0.85 → 0.0.87

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/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 +80 -0
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +80 -0
  7. package/packages/client/dist/esm/index.js.map +1 -1
  8. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  9. package/packages/engine/dist/browser/index.global.js +7 -7
  10. package/packages/engine/dist/browser/index.global.js.map +1 -1
  11. package/packages/engine/dist/cjs/index.cjs +40 -0
  12. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  13. package/packages/engine/dist/esm/index.js +40 -0
  14. package/packages/engine/dist/esm/index.js.map +1 -1
  15. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  16. package/packages/engine/dist/types/render/collisionVis.d.ts +53 -0
  17. package/packages/engine/dist/types/render/collisionVis.d.ts.map +1 -0
  18. package/packages/engine/dist/types/render/renderer.d.ts +2 -0
  19. package/packages/engine/dist/types/render/renderer.d.ts.map +1 -1
  20. package/packages/game/dist/browser/index.global.js +1 -1
  21. package/packages/game/dist/browser/index.global.js.map +1 -1
  22. package/packages/game/dist/cjs/index.cjs +253 -2
  23. package/packages/game/dist/cjs/index.cjs.map +1 -1
  24. package/packages/game/dist/esm/index.js +248 -2
  25. package/packages/game/dist/esm/index.js.map +1 -1
  26. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  27. package/packages/game/dist/types/ai/movement.d.ts +5 -0
  28. package/packages/game/dist/types/ai/movement.d.ts.map +1 -1
  29. package/packages/game/dist/types/entities/system.d.ts.map +1 -1
  30. package/packages/game/dist/types/physics/fluid.d.ts +5 -0
  31. package/packages/game/dist/types/physics/fluid.d.ts.map +1 -0
  32. package/packages/game/dist/types/physics/movement.d.ts.map +1 -1
  33. package/packages/shared/dist/browser/index.global.js +1 -1
  34. package/packages/shared/dist/browser/index.global.js.map +1 -1
  35. package/packages/shared/dist/cjs/index.cjs +41 -0
  36. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  37. package/packages/shared/dist/esm/index.js +46 -0
  38. package/packages/shared/dist/esm/index.js.map +1 -1
  39. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  40. package/packages/shared/dist/types/index.d.ts +1 -0
  41. package/packages/shared/dist/types/index.d.ts.map +1 -1
  42. package/packages/shared/dist/types/replay/index.d.ts +3 -0
  43. package/packages/shared/dist/types/replay/index.d.ts.map +1 -0
  44. package/packages/shared/dist/types/replay/io.d.ts +7 -0
  45. package/packages/shared/dist/types/replay/io.d.ts.map +1 -0
  46. package/packages/shared/dist/types/replay/schema.d.ts +31 -0
  47. package/packages/shared/dist/types/replay/schema.d.ts.map +1 -0
  48. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -27,6 +27,7 @@ __export(index_exports, {
27
27
  AmmoItemId: () => AmmoItemId,
28
28
  AmmoType: () => AmmoType,
29
29
  ArmorType: () => ArmorType,
30
+ CheckGround: () => CheckGround,
30
31
  DamageFlags: () => DamageFlags,
31
32
  DamageMod: () => DamageMod,
32
33
  DeadFlag: () => DeadFlag,
@@ -40,7 +41,9 @@ __export(index_exports, {
40
41
  HEALTH_ITEMS: () => HEALTH_ITEMS,
41
42
  KEY_ITEMS: () => KEY_ITEMS,
42
43
  KeyId: () => KeyId,
44
+ M_CheckBottom: () => M_CheckBottom,
43
45
  M_MoveFrame: () => M_MoveFrame,
46
+ M_walkmove: () => M_walkmove,
44
47
  MoveType: () => MoveType,
45
48
  ORDERED_DAMAGE_MODS: () => ORDERED_DAMAGE_MODS,
46
49
  POWERUP_ITEMS: () => POWERUP_ITEMS,
@@ -51,6 +54,8 @@ __export(index_exports, {
51
54
  RangeCategory: () => RangeCategory,
52
55
  SAVE_FORMAT_VERSION: () => SAVE_FORMAT_VERSION,
53
56
  SPAWNFLAG_MONSTER_AMBUSH: () => SPAWNFLAG_MONSTER_AMBUSH,
57
+ SV_NewChaseDir: () => SV_NewChaseDir,
58
+ SV_StepDirection: () => SV_StepDirection,
54
59
  SaveStorage: () => SaveStorage,
55
60
  ServerFlags: () => ServerFlags,
56
61
  Solid: () => Solid,
@@ -148,6 +153,11 @@ __export(index_exports, {
148
153
  module.exports = __toCommonJS(index_exports);
149
154
 
150
155
  // ../shared/dist/esm/index.js
156
+ var __defProp2 = Object.defineProperty;
157
+ var __export2 = (target, all) => {
158
+ for (var name in all)
159
+ __defProp2(target, name, { get: all[name], enumerable: true });
160
+ };
151
161
  var ZERO_VEC3 = { x: 0, y: 0, z: 0 };
152
162
  var STOP_EPSILON = 0.1;
153
163
  var DEG_TO_RAD = Math.PI / 180;
@@ -590,6 +600,41 @@ var ConfigStringIndex = ((ConfigStringIndex2) => {
590
600
  return ConfigStringIndex2;
591
601
  })(ConfigStringIndex || {});
592
602
  var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
603
+ var replay_exports = {};
604
+ __export2(replay_exports, {
605
+ addReplayFrame: () => addReplayFrame,
606
+ createReplaySession: () => createReplaySession,
607
+ deserializeReplay: () => deserializeReplay,
608
+ serializeReplay: () => serializeReplay
609
+ });
610
+ function serializeReplay(session) {
611
+ return JSON.stringify(session, null, 2);
612
+ }
613
+ function deserializeReplay(json) {
614
+ const session = JSON.parse(json);
615
+ if (!session.metadata || !Array.isArray(session.frames)) {
616
+ throw new Error("Invalid replay format: missing metadata or frames");
617
+ }
618
+ return session;
619
+ }
620
+ function createReplaySession(map, seed) {
621
+ return {
622
+ metadata: {
623
+ map,
624
+ date: (/* @__PURE__ */ new Date()).toISOString(),
625
+ version: "1.0",
626
+ seed
627
+ },
628
+ frames: []
629
+ };
630
+ }
631
+ function addReplayFrame(session, cmd, serverFrame, startTime) {
632
+ session.frames.push({
633
+ serverFrame,
634
+ cmd,
635
+ timestamp: Date.now() - startTime
636
+ });
637
+ }
593
638
  var WaterLevel = /* @__PURE__ */ ((WaterLevel3) => {
594
639
  WaterLevel3[WaterLevel3["None"] = 0] = "None";
595
640
  WaterLevel3[WaterLevel3["Feet"] = 1] = "Feet";
@@ -1059,8 +1104,23 @@ var ENTITY_FIELD_METADATA = [
1059
1104
  // src/physics/movement.ts
1060
1105
  function runGravity(ent, gravity, frametime) {
1061
1106
  if (ent.movetype === 7 /* Toss */) {
1062
- ent.velocity = addVec3(ent.velocity, scaleVec3(gravity, ent.gravity * frametime));
1063
- ent.origin = addVec3(ent.origin, scaleVec3(ent.velocity, frametime));
1107
+ if (ent.waterlevel > 1) {
1108
+ const speed = Math.sqrt(ent.velocity.x * ent.velocity.x + ent.velocity.y * ent.velocity.y + ent.velocity.z * ent.velocity.z);
1109
+ if (speed > 1) {
1110
+ const newspeed = speed - frametime * speed * 2;
1111
+ if (newspeed < 0) {
1112
+ ent.velocity = { x: 0, y: 0, z: 0 };
1113
+ } else {
1114
+ const scale = newspeed / speed;
1115
+ ent.velocity = scaleVec3(ent.velocity, scale);
1116
+ }
1117
+ }
1118
+ ent.velocity = addVec3(ent.velocity, scaleVec3(gravity, ent.gravity * frametime * 0.1));
1119
+ ent.origin = addVec3(ent.origin, scaleVec3(ent.velocity, frametime));
1120
+ } else {
1121
+ ent.velocity = addVec3(ent.velocity, scaleVec3(gravity, ent.gravity * frametime));
1122
+ ent.origin = addVec3(ent.origin, scaleVec3(ent.velocity, frametime));
1123
+ }
1064
1124
  }
1065
1125
  }
1066
1126
  function runBouncing(ent, imports, frametime) {
@@ -1209,6 +1269,64 @@ function runPush(pusher, system, imports, frametime) {
1209
1269
  return true;
1210
1270
  }
1211
1271
 
1272
+ // src/physics/fluid.ts
1273
+ function checkWater2(ent, system, imports) {
1274
+ const origin = ent.origin;
1275
+ const mins = ent.mins;
1276
+ const maxs = ent.maxs;
1277
+ const point = {
1278
+ x: origin.x + (mins.x + maxs.x) * 0.5,
1279
+ y: origin.y + (mins.y + maxs.y) * 0.5,
1280
+ z: origin.z + mins.z + 1
1281
+ };
1282
+ let cont = imports.pointcontents(point);
1283
+ if ((cont & MASK_WATER) === 0) {
1284
+ if (ent.waterlevel > 0) {
1285
+ playLeaveWaterSound(ent, system);
1286
+ ent.flags &= ~2 /* Swim */;
1287
+ }
1288
+ ent.waterlevel = 0;
1289
+ ent.watertype = 0;
1290
+ return;
1291
+ }
1292
+ ent.watertype = cont;
1293
+ ent.waterlevel = 1;
1294
+ const waistZ = origin.z + mins.z + (maxs.z - mins.z) * 0.5;
1295
+ const headZ = origin.z + maxs.z - 1;
1296
+ const waistPoint = { ...point, z: waistZ };
1297
+ cont = imports.pointcontents(waistPoint);
1298
+ if (cont & MASK_WATER) {
1299
+ ent.waterlevel = 2;
1300
+ const headPoint = { ...point, z: headZ };
1301
+ cont = imports.pointcontents(headPoint);
1302
+ if (cont & MASK_WATER) {
1303
+ ent.waterlevel = 3;
1304
+ }
1305
+ }
1306
+ if ((ent.flags & 2 /* Swim */) === 0) {
1307
+ playEnterWaterSound(ent, system);
1308
+ ent.flags |= 2 /* Swim */;
1309
+ }
1310
+ }
1311
+ function playEnterWaterSound(ent, system) {
1312
+ if (ent.watertype & CONTENTS_LAVA) {
1313
+ system.sound(ent, 0, "player/lava_in.wav", 1, 1, 0);
1314
+ } else if (ent.watertype & CONTENTS_SLIME) {
1315
+ system.sound(ent, 0, "player/watr_in.wav", 1, 1, 0);
1316
+ } else if (ent.watertype & CONTENTS_WATER) {
1317
+ system.sound(ent, 0, "player/watr_in.wav", 1, 1, 0);
1318
+ }
1319
+ }
1320
+ function playLeaveWaterSound(ent, system) {
1321
+ if (ent.watertype & CONTENTS_LAVA) {
1322
+ system.sound(ent, 0, "player/lava_out.wav", 1, 1, 0);
1323
+ } else if (ent.watertype & CONTENTS_SLIME) {
1324
+ system.sound(ent, 0, "player/watr_out.wav", 1, 1, 0);
1325
+ } else if (ent.watertype & CONTENTS_WATER) {
1326
+ system.sound(ent, 0, "player/watr_out.wav", 1, 1, 0);
1327
+ }
1328
+ }
1329
+
1212
1330
  // src/entities/pool.ts
1213
1331
  var MAX_EDICTS = 2048;
1214
1332
  var WORLD_INDEX = 0;
@@ -1676,6 +1794,9 @@ var EntitySystem = class {
1676
1794
  if (!ent.inUse || ent.freePending) {
1677
1795
  continue;
1678
1796
  }
1797
+ if (ent.movetype !== 0 /* None */ && ent.movetype !== 2 /* Push */ && ent.movetype !== 3 /* Stop */ && ent.movetype !== 1 /* Noclip */) {
1798
+ checkWater2(ent, this, this.imports);
1799
+ }
1679
1800
  const frametime = this.currentTimeSeconds - (ent.timestamp || 0);
1680
1801
  switch (ent.movetype) {
1681
1802
  case 7 /* Toss */:
@@ -3810,6 +3931,131 @@ function ai_charge(self, distance2, deltaSeconds) {
3810
3931
  walkMove(self, self.angles.y, distance2);
3811
3932
  }
3812
3933
  }
3934
+ function CheckGround(self, context) {
3935
+ if (self.movetype === 1 /* Noclip */) {
3936
+ return;
3937
+ }
3938
+ const point = {
3939
+ x: self.origin.x,
3940
+ y: self.origin.y,
3941
+ z: self.origin.z + self.mins.z - 1
3942
+ };
3943
+ const trace = context.trace(self.origin, self.mins, self.maxs, point, self, MASK_MONSTERSOLID);
3944
+ self.groundentity = trace.ent;
3945
+ if (!self.groundentity && !trace.allsolid && !trace.startsolid && trace.fraction === 1) {
3946
+ const content = context.pointcontents(point);
3947
+ if (content & MASK_WATER) {
3948
+ self.waterlevel = 1;
3949
+ self.watertype = content;
3950
+ } else {
3951
+ self.waterlevel = 0;
3952
+ self.watertype = 0;
3953
+ }
3954
+ }
3955
+ }
3956
+ function M_CheckBottom(self, context) {
3957
+ const mins = {
3958
+ x: self.origin.x + self.mins.x,
3959
+ y: self.origin.y + self.mins.y,
3960
+ z: self.origin.z + self.mins.z
3961
+ };
3962
+ const maxs = {
3963
+ x: self.origin.x + self.maxs.x,
3964
+ y: self.origin.y + self.maxs.y,
3965
+ z: self.origin.z + self.maxs.z
3966
+ };
3967
+ let start = { x: 0, y: 0, z: 0 };
3968
+ let stop = { x: 0, y: 0, z: 0 };
3969
+ for (let i = 0; i < 2; i++) {
3970
+ if (i === 1) start = { x: mins.x, y: mins.y, z: 0 };
3971
+ else start = { x: maxs.x, y: mins.y, z: 0 };
3972
+ start.z = mins.z - 1;
3973
+ if (context.pointcontents(start) !== 0) return true;
3974
+ stop = { ...start };
3975
+ stop.z = start.z - 60;
3976
+ const trace = context.trace(start, null, null, stop, self, MASK_MONSTERSOLID);
3977
+ if (trace.fraction < 1) return true;
3978
+ if (i === 1) start = { x: mins.x, y: maxs.y, z: 0 };
3979
+ else start = { x: maxs.x, y: maxs.y, z: 0 };
3980
+ start.z = mins.z - 1;
3981
+ if (context.pointcontents(start) !== 0) return true;
3982
+ stop = { ...start };
3983
+ stop.z = start.z - 60;
3984
+ const trace2 = context.trace(start, null, null, stop, self, MASK_MONSTERSOLID);
3985
+ if (trace2.fraction < 1) return true;
3986
+ }
3987
+ return false;
3988
+ }
3989
+ function M_walkmove(self, yawDegrees, distance2, context) {
3990
+ if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0) && self.movetype !== 1 /* Noclip */) {
3991
+ if (!self.groundentity && self.waterlevel === 0) {
3992
+ return false;
3993
+ }
3994
+ }
3995
+ const delta = yawVector(yawDegrees, distance2);
3996
+ if ((self.monsterinfo.aiflags & 1024 /* NoStep */) !== 0 && (self.monsterinfo.aiflags & 1073741824 /* Pathing */) !== 0) {
3997
+ }
3998
+ const dest = {
3999
+ x: self.origin.x + delta.x,
4000
+ y: self.origin.y + delta.y,
4001
+ z: self.origin.z + delta.z
4002
+ };
4003
+ const trace = context.trace(self.origin, self.mins, self.maxs, dest, self, MASK_MONSTERSOLID);
4004
+ if (trace.fraction < 1) {
4005
+ return false;
4006
+ }
4007
+ const oldOrigin = { ...self.origin };
4008
+ self.origin.x = dest.x;
4009
+ self.origin.y = dest.y;
4010
+ self.origin.z = dest.z;
4011
+ if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0) && self.movetype !== 1 /* Noclip */) {
4012
+ if (!M_CheckBottom(self, context)) {
4013
+ self.origin.x = oldOrigin.x;
4014
+ self.origin.y = oldOrigin.y;
4015
+ self.origin.z = oldOrigin.z;
4016
+ return false;
4017
+ }
4018
+ }
4019
+ if (!((self.flags & (2 /* Swim */ | 1 /* Fly */)) !== 0)) {
4020
+ CheckGround(self, context);
4021
+ }
4022
+ return true;
4023
+ }
4024
+ function SV_StepDirection(self, yaw, dist, context) {
4025
+ for (let i = 0; i <= 90; i += 45) {
4026
+ if (M_walkmove(self, yaw + i, dist, context)) {
4027
+ if (i !== 0) {
4028
+ self.ideal_yaw = angleMod(yaw + i);
4029
+ }
4030
+ return true;
4031
+ }
4032
+ if (i !== 0) {
4033
+ if (M_walkmove(self, yaw - i, dist, context)) {
4034
+ self.ideal_yaw = angleMod(yaw - i);
4035
+ return true;
4036
+ }
4037
+ }
4038
+ }
4039
+ return false;
4040
+ }
4041
+ function SV_NewChaseDir(self, enemy, dist, context) {
4042
+ if (!enemy) return;
4043
+ const olddir = angleMod(self.ideal_yaw - self.angles.y);
4044
+ const turnaround = Math.abs(olddir - 180) < 20;
4045
+ const dx = enemy.origin.x - self.origin.x;
4046
+ const dy = enemy.origin.y - self.origin.y;
4047
+ if (Math.abs(dx) > Math.abs(dy)) {
4048
+ if (dx > 0) self.ideal_yaw = 0;
4049
+ else self.ideal_yaw = 180;
4050
+ } else {
4051
+ if (dy > 0) self.ideal_yaw = 90;
4052
+ else self.ideal_yaw = 270;
4053
+ }
4054
+ if (turnaround) {
4055
+ self.ideal_yaw = angleMod(self.ideal_yaw + 180);
4056
+ }
4057
+ SV_StepDirection(self, self.ideal_yaw, dist, context);
4058
+ }
3813
4059
 
3814
4060
  // src/ai/targeting.ts
3815
4061
  function setIdealYawTowards2(self, other) {
@@ -6115,6 +6361,7 @@ function createGame({ trace, pointcontents }, engine, options) {
6115
6361
  AmmoItemId,
6116
6362
  AmmoType,
6117
6363
  ArmorType,
6364
+ CheckGround,
6118
6365
  DamageFlags,
6119
6366
  DamageMod,
6120
6367
  DeadFlag,
@@ -6128,7 +6375,9 @@ function createGame({ trace, pointcontents }, engine, options) {
6128
6375
  HEALTH_ITEMS,
6129
6376
  KEY_ITEMS,
6130
6377
  KeyId,
6378
+ M_CheckBottom,
6131
6379
  M_MoveFrame,
6380
+ M_walkmove,
6132
6381
  MoveType,
6133
6382
  ORDERED_DAMAGE_MODS,
6134
6383
  POWERUP_ITEMS,
@@ -6139,6 +6388,8 @@ function createGame({ trace, pointcontents }, engine, options) {
6139
6388
  RangeCategory,
6140
6389
  SAVE_FORMAT_VERSION,
6141
6390
  SPAWNFLAG_MONSTER_AMBUSH,
6391
+ SV_NewChaseDir,
6392
+ SV_StepDirection,
6142
6393
  SaveStorage,
6143
6394
  ServerFlags,
6144
6395
  Solid,