quake2ts 0.0.240 → 0.0.242

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 (51) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js +11 -11
  3. package/packages/client/dist/browser/index.global.js.map +1 -1
  4. package/packages/client/dist/cjs/index.cjs +50 -13
  5. package/packages/client/dist/cjs/index.cjs.map +1 -1
  6. package/packages/client/dist/esm/index.js +50 -13
  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/demo/handler.d.ts +2 -1
  10. package/packages/client/dist/types/demo/handler.d.ts.map +1 -1
  11. package/packages/client/dist/types/index.d.ts.map +1 -1
  12. package/packages/engine/dist/browser/index.global.js +8 -8
  13. package/packages/engine/dist/browser/index.global.js.map +1 -1
  14. package/packages/engine/dist/cjs/index.cjs +37 -10
  15. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  16. package/packages/engine/dist/esm/index.js +37 -10
  17. package/packages/engine/dist/esm/index.js.map +1 -1
  18. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  19. package/packages/engine/dist/types/demo/parser.d.ts +1 -1
  20. package/packages/engine/dist/types/demo/parser.d.ts.map +1 -1
  21. package/packages/engine/dist/types/demo/playback.d.ts +1 -0
  22. package/packages/engine/dist/types/demo/playback.d.ts.map +1 -1
  23. package/packages/game/dist/browser/index.global.js +2 -2
  24. package/packages/game/dist/browser/index.global.js.map +1 -1
  25. package/packages/game/dist/cjs/index.cjs +150 -48
  26. package/packages/game/dist/cjs/index.cjs.map +1 -1
  27. package/packages/game/dist/esm/index.js +150 -48
  28. package/packages/game/dist/esm/index.js.map +1 -1
  29. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  30. package/packages/game/dist/types/combat/weapons/firing.d.ts.map +1 -1
  31. package/packages/game/dist/types/combat/weapons/rogue.d.ts +9 -0
  32. package/packages/game/dist/types/combat/weapons/rogue.d.ts.map +1 -0
  33. package/packages/game/dist/types/entities/funcs.d.ts.map +1 -1
  34. package/packages/game/dist/types/entities/projectiles.d.ts +1 -0
  35. package/packages/game/dist/types/entities/projectiles.d.ts.map +1 -1
  36. package/packages/game/dist/types/index.d.ts +4 -0
  37. package/packages/game/dist/types/index.d.ts.map +1 -1
  38. package/packages/game/dist/types/inventory/ammo.d.ts.map +1 -1
  39. package/packages/game/dist/types/inventory/items.d.ts.map +1 -1
  40. package/packages/game/dist/types/physics/movement.d.ts +1 -1
  41. package/packages/game/dist/types/physics/movement.d.ts.map +1 -1
  42. package/packages/shared/dist/browser/index.global.js +1 -1
  43. package/packages/shared/dist/browser/index.global.js.map +1 -1
  44. package/packages/shared/dist/cjs/index.cjs +5 -0
  45. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  46. package/packages/shared/dist/esm/index.js +5 -0
  47. package/packages/shared/dist/esm/index.js.map +1 -1
  48. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  49. package/packages/shared/dist/types/items/ammo.d.ts +6 -1
  50. package/packages/shared/dist/types/items/ammo.d.ts.map +1 -1
  51. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -1277,6 +1277,11 @@ var AmmoItemId = /* @__PURE__ */ ((AmmoItemId22) => {
1277
1277
  AmmoItemId22["Grenades"] = "ammo_grenades";
1278
1278
  AmmoItemId22["Cells"] = "ammo_cells";
1279
1279
  AmmoItemId22["Slugs"] = "ammo_slugs";
1280
+ AmmoItemId22["MagSlugs"] = "ammo_magslug";
1281
+ AmmoItemId22["Flechettes"] = "ammo_flechettes";
1282
+ AmmoItemId22["Disruptor"] = "ammo_disruptor";
1283
+ AmmoItemId22["Tesla"] = "ammo_tesla";
1284
+ AmmoItemId22["Trap"] = "ammo_trap";
1280
1285
  return AmmoItemId22;
1281
1286
  })(AmmoItemId || {});
1282
1287
 
@@ -1398,7 +1403,12 @@ var AMMO_ITEM_DEFINITIONS = {
1398
1403
  [AmmoItemId.Rockets]: { id: AmmoItemId.Rockets, ammoType: AmmoType.Rockets, quantity: 5, weaponAmmo: false },
1399
1404
  [AmmoItemId.Grenades]: { id: AmmoItemId.Grenades, ammoType: AmmoType.Grenades, quantity: 5, weaponAmmo: true },
1400
1405
  [AmmoItemId.Cells]: { id: AmmoItemId.Cells, ammoType: AmmoType.Cells, quantity: 50, weaponAmmo: false },
1401
- [AmmoItemId.Slugs]: { id: AmmoItemId.Slugs, ammoType: AmmoType.Slugs, quantity: 10, weaponAmmo: false }
1406
+ [AmmoItemId.Slugs]: { id: AmmoItemId.Slugs, ammoType: AmmoType.Slugs, quantity: 10, weaponAmmo: false },
1407
+ [AmmoItemId.MagSlugs]: { id: AmmoItemId.MagSlugs, ammoType: AmmoType.MagSlugs, quantity: 10, weaponAmmo: false },
1408
+ [AmmoItemId.Flechettes]: { id: AmmoItemId.Flechettes, ammoType: AmmoType.Flechettes, quantity: 50, weaponAmmo: false },
1409
+ [AmmoItemId.Disruptor]: { id: AmmoItemId.Disruptor, ammoType: AmmoType.Disruptor, quantity: 15, weaponAmmo: false },
1410
+ [AmmoItemId.Tesla]: { id: AmmoItemId.Tesla, ammoType: AmmoType.Tesla, quantity: 5, weaponAmmo: false },
1411
+ [AmmoItemId.Trap]: { id: AmmoItemId.Trap, ammoType: AmmoType.Trap, quantity: 5, weaponAmmo: false }
1402
1412
  };
1403
1413
  function getAmmoItemDefinition(id) {
1404
1414
  return AMMO_ITEM_DEFINITIONS[id];
@@ -1417,6 +1427,11 @@ function createBaseAmmoCaps() {
1417
1427
  caps[AmmoType.Bullets] = 200;
1418
1428
  caps[AmmoType.Shells] = 100;
1419
1429
  caps[AmmoType.Cells] = 200;
1430
+ caps[AmmoType.MagSlugs] = 50;
1431
+ caps[AmmoType.Flechettes] = 200;
1432
+ caps[AmmoType.Disruptor] = 200;
1433
+ caps[AmmoType.Tesla] = 50;
1434
+ caps[AmmoType.Trap] = 50;
1420
1435
  return caps;
1421
1436
  }
1422
1437
  function clampAmmoCounts(counts, caps) {
@@ -2664,7 +2679,7 @@ function runGravity(ent, gravity, frametime) {
2664
2679
  }
2665
2680
  }
2666
2681
  }
2667
- function runBouncing(ent, imports, frametime) {
2682
+ function runBouncing(ent, system, imports, frametime) {
2668
2683
  if (ent.movetype !== 9 /* Bounce */ && ent.movetype !== 10 /* WallBounce */) {
2669
2684
  return;
2670
2685
  }
@@ -2674,6 +2689,13 @@ function runBouncing(ent, imports, frametime) {
2674
2689
  const traceResult = imports.trace(ent.origin, ent.mins, ent.maxs, end, ent, ent.clipmask);
2675
2690
  if (traceResult.fraction < 1) {
2676
2691
  ent.origin = traceResult.endpos;
2692
+ if (traceResult.ent) {
2693
+ resolveImpact(ent, traceResult, system);
2694
+ } else {
2695
+ if (ent.touch) {
2696
+ ent.touch(ent, system.world, traceResult.plane, void 0);
2697
+ }
2698
+ }
2677
2699
  }
2678
2700
  if (traceResult.fraction > 0 && traceResult.fraction < 1 && traceResult.plane) {
2679
2701
  let overbounce = 1.01;
@@ -3479,11 +3501,11 @@ var EntitySystem = class {
3479
3501
  switch (ent.movetype) {
3480
3502
  case 7 /* Toss */:
3481
3503
  runGravity(ent, this.gravity, frametime);
3482
- runBouncing(ent, this.imports, frametime);
3504
+ runBouncing(ent, this, this.imports, frametime);
3483
3505
  ent.timestamp = this.currentTimeSeconds;
3484
3506
  break;
3485
3507
  case 9 /* Bounce */:
3486
- runBouncing(ent, this.imports, frametime);
3508
+ runBouncing(ent, this, this.imports, frametime);
3487
3509
  ent.timestamp = this.currentTimeSeconds;
3488
3510
  break;
3489
3511
  case 8 /* FlyMissile */:
@@ -4541,7 +4563,40 @@ var WEAPON_ITEMS = {
4541
4563
  initialAmmo: 50,
4542
4564
  pickupAmmo: 50,
4543
4565
  fireRate: 1
4566
+ },
4567
+ // Rogue Weapons
4568
+ "weapon_boomer": {
4569
+ type: "weapon",
4570
+ id: "weapon_boomer",
4571
+ // Ion Ripper
4572
+ name: "Ion Ripper",
4573
+ weaponId: WeaponId.IonRipper,
4574
+ ammoType: AmmoType.Cells,
4575
+ initialAmmo: 50,
4576
+ pickupAmmo: 50,
4577
+ fireRate: 0.1
4578
+ },
4579
+ "weapon_phalanx": {
4580
+ type: "weapon",
4581
+ id: "weapon_phalanx",
4582
+ name: "Phalanx",
4583
+ weaponId: WeaponId.Phalanx,
4584
+ ammoType: AmmoType.MagSlugs,
4585
+ initialAmmo: 50,
4586
+ pickupAmmo: 50,
4587
+ fireRate: 1
4588
+ },
4589
+ "weapon_beam": {
4590
+ type: "weapon",
4591
+ id: "weapon_beam",
4592
+ name: "Plasma Beam",
4593
+ weaponId: WeaponId.PlasmaBeam,
4594
+ ammoType: AmmoType.Cells,
4595
+ initialAmmo: 50,
4596
+ pickupAmmo: 50,
4597
+ fireRate: 0.1
4544
4598
  }
4599
+ // ... add others as we implement them
4545
4600
  };
4546
4601
  var HEALTH_ITEMS = {
4547
4602
  "item_health_small": {
@@ -4929,37 +4984,53 @@ function move_calc(ent, dest, context, done) {
4929
4984
  context.scheduleThink(ent, context.timeSeconds + dt);
4930
4985
  }
4931
4986
  }
4932
- function door_blocked(self, other) {
4933
- if (other && other.takedamage) {
4934
- const damage = self.dmg || 2;
4935
- other.health -= damage;
4936
- }
4937
- if (self.state === 1 /* Opening */) {
4938
- self.state = 3 /* Closing */;
4939
- self.think = door_go_down;
4940
- } else if (self.state === 3 /* Closing */) {
4941
- self.state = 1 /* Opening */;
4942
- self.think = door_go_up;
4943
- }
4987
+ var SPAWNFLAG_DOOR_START_OPEN = 1;
4988
+ var SPAWNFLAG_DOOR_CRUSHER = 4;
4989
+ var SPAWNFLAG_DOOR_NOMONSTER = 8;
4990
+ var SPAWNFLAG_DOOR_ANIMATED = 16;
4991
+ var SPAWNFLAG_DOOR_TOGGLE = 32;
4992
+ var SPAWNFLAG_DOOR_ANIMATED_FAST = 64;
4993
+ var EF_ANIM_ALL = 4;
4994
+ var EF_ANIM_ALLFAST = 8;
4995
+ function getMoveInfo(ent) {
4996
+ return ent.moveinfo;
4944
4997
  }
4945
4998
  function door_hit_top(ent, context) {
4999
+ const moveinfo = getMoveInfo(ent);
5000
+ if (moveinfo && moveinfo.sound_end) {
5001
+ context.sound(ent, 0, moveinfo.sound_end, 1, 1, 0);
5002
+ }
4946
5003
  ent.state = 0 /* Open */;
4947
- if (ent.spawnflags & 32) {
5004
+ if (ent.spawnflags & SPAWNFLAG_DOOR_TOGGLE) {
4948
5005
  return;
4949
5006
  }
4950
5007
  if (ent.wait === -1) {
4951
5008
  return;
4952
5009
  }
4953
- ent.think = door_go_down;
5010
+ ent.think = (e) => door_go_down(e, context);
4954
5011
  context.scheduleThink(ent, context.timeSeconds + ent.wait);
4955
5012
  }
4956
5013
  function door_hit_bottom(ent, context) {
5014
+ const moveinfo = getMoveInfo(ent);
5015
+ if (moveinfo && moveinfo.sound_end) {
5016
+ context.sound(ent, 0, moveinfo.sound_end, 1, 1, 0);
5017
+ }
4957
5018
  ent.state = 2 /* Closed */;
4958
5019
  }
4959
5020
  function door_go_down(door, context) {
5021
+ door.think = (e) => door_go_down(e, context);
5022
+ const moveinfo = getMoveInfo(door);
5023
+ if (moveinfo && moveinfo.sound_start) {
5024
+ context.sound(door, 0, moveinfo.sound_start, 1, 1, 0);
5025
+ }
4960
5026
  move_calc(door, door.pos1, context, door_hit_bottom);
4961
5027
  }
4962
5028
  function door_go_up(door, context) {
5029
+ door.think = (e) => door_go_up(e, context);
5030
+ const moveinfo = getMoveInfo(door);
5031
+ if (moveinfo && moveinfo.sound_start) {
5032
+ context.sound(door, 0, moveinfo.sound_start, 1, 1, 0);
5033
+ }
4963
5034
  move_calc(door, door.pos2, context, door_hit_top);
4964
5035
  }
4965
5036
  var func_door = (entity, context) => {
@@ -4971,15 +5042,51 @@ var func_door = (entity, context) => {
4971
5042
  if (!entity.health) entity.health = 0;
4972
5043
  entity.solid = 3 /* Bsp */;
4973
5044
  entity.movetype = 2 /* Push */;
4974
- entity.blocked = door_blocked;
5045
+ entity.blocked = (self, other) => {
5046
+ if (other && other.takedamage) {
5047
+ const damage = self.dmg || 2;
5048
+ if (self.spawnflags & SPAWNFLAG_DOOR_CRUSHER) {
5049
+ other.health -= damage;
5050
+ } else {
5051
+ other.health -= damage;
5052
+ }
5053
+ }
5054
+ if (self.spawnflags & SPAWNFLAG_DOOR_CRUSHER) {
5055
+ return;
5056
+ }
5057
+ if (self.state === 1 /* Opening */) {
5058
+ self.state = 3 /* Closing */;
5059
+ door_go_down(self, context.entities);
5060
+ } else if (self.state === 3 /* Closing */) {
5061
+ self.state = 1 /* Opening */;
5062
+ door_go_up(self, context.entities);
5063
+ }
5064
+ };
4975
5065
  entity.state = 2 /* Closed */;
4976
5066
  entity.pos1 = { ...entity.origin };
4977
5067
  const move = entity.movedir.x * (Math.abs(entity.maxs.x - entity.mins.x) - entity.lip) + entity.movedir.y * (Math.abs(entity.maxs.y - entity.mins.y) - entity.lip) + entity.movedir.z * (Math.abs(entity.maxs.z - entity.mins.z) - entity.lip);
4978
5068
  entity.pos2 = addVec3(entity.pos1, scaleVec3(entity.movedir, move));
4979
- if (entity.spawnflags & 1) {
5069
+ const moveinfo = {
5070
+ sound_start: null,
5071
+ sound_middle: null,
5072
+ sound_end: null
5073
+ };
5074
+ if (entity.sounds !== 1) {
5075
+ moveinfo.sound_start = "doors/dr1_strt.wav";
5076
+ moveinfo.sound_middle = "doors/dr1_mid.wav";
5077
+ moveinfo.sound_end = "doors/dr1_end.wav";
5078
+ }
5079
+ entity.moveinfo = moveinfo;
5080
+ if (entity.spawnflags & SPAWNFLAG_DOOR_START_OPEN) {
4980
5081
  entity.origin = { ...entity.pos2 };
4981
5082
  entity.state = 0 /* Open */;
4982
5083
  }
5084
+ if (entity.spawnflags & SPAWNFLAG_DOOR_ANIMATED) {
5085
+ entity.effects |= EF_ANIM_ALL;
5086
+ }
5087
+ if (entity.spawnflags & SPAWNFLAG_DOOR_ANIMATED_FAST) {
5088
+ entity.effects |= EF_ANIM_ALLFAST;
5089
+ }
4983
5090
  if (entity.health > 0) {
4984
5091
  entity.takedamage = true;
4985
5092
  entity.max_health = entity.health;
@@ -4990,46 +5097,27 @@ var func_door = (entity, context) => {
4990
5097
  };
4991
5098
  }
4992
5099
  entity.use = (self, other, activator) => {
4993
- if (entity.spawnflags & 32) {
5100
+ if (entity.spawnflags & SPAWNFLAG_DOOR_TOGGLE) {
4994
5101
  if (self.state === 2 /* Closed */) {
4995
5102
  self.state = 1 /* Opening */;
4996
- self.think = door_go_up;
4997
- context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
5103
+ door_go_up(self, context.entities);
4998
5104
  } else if (self.state === 0 /* Open */) {
4999
5105
  self.state = 3 /* Closing */;
5000
- self.think = door_go_down;
5001
- context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
5106
+ door_go_down(self, context.entities);
5002
5107
  }
5003
5108
  return;
5004
5109
  }
5005
5110
  if (self.state !== 2 /* Closed */) return;
5006
5111
  self.state = 1 /* Opening */;
5007
- self.think = door_go_up;
5008
- context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
5009
- let soundName = "doors/dr1_strt.wav";
5010
- if (entity.sounds) {
5011
- switch (entity.sounds) {
5012
- case 1:
5013
- soundName = "doors/dr1_strt.wav";
5014
- break;
5015
- case 2:
5016
- soundName = "doors/dr2_strt.wav";
5017
- break;
5018
- case 3:
5019
- soundName = "doors/dr3_strt.wav";
5020
- break;
5021
- case 4:
5022
- soundName = "doors/dr4_strt.wav";
5023
- break;
5024
- default:
5025
- soundName = "doors/dr1_strt.wav";
5026
- }
5027
- }
5028
- context.entities.sound(self, 0, soundName, 1, 1, 0);
5112
+ door_go_up(self, context.entities);
5029
5113
  };
5030
5114
  if (entity.health <= 0 && !entity.targetname) {
5031
5115
  entity.touch = (self, other) => {
5032
- if (!other || other.classname !== "player") return;
5116
+ if (!other) return;
5117
+ if (self.spawnflags & SPAWNFLAG_DOOR_NOMONSTER) {
5118
+ if (other.svflags & 4 /* Monster */) return;
5119
+ }
5120
+ if (other.classname !== "player" && !(other.svflags & 4 /* Monster */)) return;
5033
5121
  self.use?.(self, other, other);
5034
5122
  };
5035
5123
  }
@@ -6289,6 +6377,16 @@ function createIonRipper(sys, owner, start, dir, damage, speed) {
6289
6377
  sys.free(self);
6290
6378
  return;
6291
6379
  }
6380
+ self.count = (self.count || 0) + 1;
6381
+ if (self.count > 5) {
6382
+ sys.multicast(self.origin, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.WELDING_SPARKS, self.origin, ZERO_VEC3, 228);
6383
+ sys.free(self);
6384
+ return;
6385
+ }
6386
+ sys.sound(self, 0, "weapons/ripphit.wav", 1, 1, 0);
6387
+ if (plane) {
6388
+ sys.multicast(self.origin, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.WELDING_SPARKS, self.origin, plane.normal, 228);
6389
+ }
6292
6390
  };
6293
6391
  ion.think = (self) => {
6294
6392
  sys.multicast(self.origin, 1 /* Pvs */, ServerCommand.temp_entity, TempEntity.WELDING_SPARKS, self.origin, ZERO_VEC3, 228);
@@ -14001,6 +14099,8 @@ var ZERO_VEC37 = { x: 0, y: 0, z: 0 };
14001
14099
  function createGame(imports, engine, options) {
14002
14100
  const gravity = options.gravity;
14003
14101
  const deathmatch = options.deathmatch ?? false;
14102
+ const rogue = options.rogue ?? false;
14103
+ const xatrix = options.xatrix ?? false;
14004
14104
  const levelClock = new LevelClock();
14005
14105
  const frameLoop = new GameFrameLoop();
14006
14106
  const rng = options.random ?? new RandomGenerator();
@@ -14288,6 +14388,8 @@ function createGame(imports, engine, options) {
14288
14388
  },
14289
14389
  trace,
14290
14390
  deathmatch,
14391
+ rogue,
14392
+ xatrix,
14291
14393
  multicast(origin2, type, event, ...args) {
14292
14394
  multicast(origin2, type, event, ...args);
14293
14395
  },