quake2ts 0.0.224 → 0.0.225

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.
@@ -4882,13 +4882,63 @@ var func_door = (entity, context) => {
4882
4882
  entity.pos1 = { ...entity.origin };
4883
4883
  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);
4884
4884
  entity.pos2 = addVec3(entity.pos1, scaleVec3(entity.movedir, move));
4885
- entity.use = (self) => {
4885
+ if (entity.spawnflags & 1) {
4886
+ entity.origin = { ...entity.pos2 };
4887
+ entity.state = 0 /* Open */;
4888
+ }
4889
+ if (entity.health > 0) {
4890
+ entity.takedamage = true;
4891
+ entity.max_health = entity.health;
4892
+ entity.die = (self, inflictor, attacker, damage) => {
4893
+ self.health = self.max_health;
4894
+ self.takedamage = false;
4895
+ self.use?.(self, attacker, attacker);
4896
+ };
4897
+ }
4898
+ entity.use = (self, other, activator) => {
4899
+ if (entity.spawnflags & 32) {
4900
+ if (self.state === 2 /* Closed */) {
4901
+ self.state = 1 /* Opening */;
4902
+ self.think = door_go_up;
4903
+ context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
4904
+ } else if (self.state === 0 /* Open */) {
4905
+ self.state = 3 /* Closing */;
4906
+ self.think = door_go_down;
4907
+ context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
4908
+ }
4909
+ return;
4910
+ }
4886
4911
  if (self.state !== 2 /* Closed */) return;
4887
4912
  self.state = 1 /* Opening */;
4888
4913
  self.think = door_go_up;
4889
4914
  context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
4890
- context.entities.sound(self, 0, "doors/dr1_strt.wav", 1, 1, 0);
4915
+ let soundName = "doors/dr1_strt.wav";
4916
+ if (entity.sounds) {
4917
+ switch (entity.sounds) {
4918
+ case 1:
4919
+ soundName = "doors/dr1_strt.wav";
4920
+ break;
4921
+ case 2:
4922
+ soundName = "doors/dr2_strt.wav";
4923
+ break;
4924
+ case 3:
4925
+ soundName = "doors/dr3_strt.wav";
4926
+ break;
4927
+ case 4:
4928
+ soundName = "doors/dr4_strt.wav";
4929
+ break;
4930
+ default:
4931
+ soundName = "doors/dr1_strt.wav";
4932
+ }
4933
+ }
4934
+ context.entities.sound(self, 0, soundName, 1, 1, 0);
4891
4935
  };
4936
+ if (entity.health <= 0 && !entity.targetname) {
4937
+ entity.touch = (self, other) => {
4938
+ if (!other || other.classname !== "player") return;
4939
+ self.use?.(self, other, other);
4940
+ };
4941
+ }
4892
4942
  };
4893
4943
  var func_button = (entity, context) => {
4894
4944
  entity.solid = 3 /* Bsp */;
@@ -8442,6 +8492,7 @@ var pain2_move4;
8442
8492
  var pain3_move3;
8443
8493
  var death_move6;
8444
8494
  var duck_move3;
8495
+ var jump_move;
8445
8496
  function gunner_idlesound(self, context) {
8446
8497
  context.engine.sound?.(self, 0, "gunner/gunidle1.wav", 1, 1, 0);
8447
8498
  }
@@ -8566,6 +8617,51 @@ function gunner_dodge(self, attacker, eta, context) {
8566
8617
  if (!self.enemy) self.enemy = attacker;
8567
8618
  self.monsterinfo.current_move = duck_move3;
8568
8619
  }
8620
+ function gunner_jump_takeoff(self, context) {
8621
+ if (!self.enemy) return;
8622
+ const diff = subtractVec3(self.enemy.origin, self.origin);
8623
+ const dist = Math.sqrt(diff.x * diff.x + diff.y * diff.y + diff.z * diff.z);
8624
+ const fwd_speed = 600;
8625
+ const forward = normalizeVec3({ x: diff.x, y: diff.y, z: 0 });
8626
+ const angles = vectorToAngles(forward);
8627
+ self.angles = { x: self.angles.x, y: angles.y, z: self.angles.z };
8628
+ const origin = { ...self.origin };
8629
+ origin.z += 1;
8630
+ self.origin = origin;
8631
+ self.velocity = {
8632
+ x: forward.x * fwd_speed,
8633
+ y: forward.y * fwd_speed,
8634
+ z: 270
8635
+ };
8636
+ self.groundentity = null;
8637
+ self.monsterinfo.aiflags |= 2048 /* Ducked */;
8638
+ self.monsterinfo.attack_finished = context.timeSeconds + 3;
8639
+ }
8640
+ function gunner_check_landing(self, context) {
8641
+ if (self.groundentity) {
8642
+ context.engine.sound?.(self, 0, "mutant/thud1.wav", 1, 1, 0);
8643
+ self.monsterinfo.attack_finished = 0;
8644
+ self.monsterinfo.aiflags &= ~2048 /* Ducked */;
8645
+ return;
8646
+ }
8647
+ if (context.timeSeconds > (self.monsterinfo.attack_finished || 0)) {
8648
+ self.monsterinfo.nextframe = 209 + 5;
8649
+ } else {
8650
+ self.monsterinfo.nextframe = 209 + 3;
8651
+ }
8652
+ }
8653
+ function gunner_jump(self, context) {
8654
+ if (self.spawnflags & 16) return;
8655
+ if (!self.enemy) return;
8656
+ if (!self.groundentity) return;
8657
+ const dist = Math.sqrt(
8658
+ Math.pow(self.enemy.origin.x - self.origin.x, 2) + Math.pow(self.enemy.origin.y - self.origin.y, 2)
8659
+ );
8660
+ if (dist > 256 && Math.random() < 0.02) {
8661
+ context.engine.sound?.(self, 0, "gunner/gunatck3.wav", 1, 1, 0);
8662
+ self.monsterinfo.current_move = jump_move;
8663
+ }
8664
+ }
8569
8665
  var stand_frames8 = Array.from({ length: 30 }, (_, i) => ({
8570
8666
  ai: monster_ai_stand9,
8571
8667
  dist: 0,
@@ -8600,9 +8696,11 @@ walk_move7 = {
8600
8696
  endfunc: null
8601
8697
  };
8602
8698
  var run_dists = [26, 9, 9, 9, 15, 10, 13, 6];
8603
- var run_frames6 = run_dists.map((d) => ({
8699
+ var run_frames6 = run_dists.map((d, i) => ({
8604
8700
  ai: monster_ai_run8,
8605
- dist: d
8701
+ dist: d,
8702
+ think: i % 4 === 0 ? gunner_jump : null
8703
+ // Check jump periodically
8606
8704
  }));
8607
8705
  run_move7 = {
8608
8706
  firstframe: 94,
@@ -8729,6 +8827,22 @@ duck_move3 = {
8729
8827
  frames: duck_frames3,
8730
8828
  endfunc: gunner_run
8731
8829
  };
8830
+ var jump_frames = [
8831
+ { ai: monster_ai_move9, dist: 0, think: gunner_jump_takeoff },
8832
+ { ai: monster_ai_move9, dist: 0 },
8833
+ { ai: monster_ai_move9, dist: 0 },
8834
+ { ai: monster_ai_move9, dist: 0, think: gunner_check_landing },
8835
+ { ai: monster_ai_move9, dist: 0 },
8836
+ { ai: monster_ai_move9, dist: 0 },
8837
+ { ai: monster_ai_move9, dist: 0 },
8838
+ { ai: monster_ai_move9, dist: 0 }
8839
+ ];
8840
+ jump_move = {
8841
+ firstframe: 209,
8842
+ lastframe: 216,
8843
+ frames: jump_frames,
8844
+ endfunc: gunner_run
8845
+ };
8732
8846
  function SP_monster_gunner(self, context) {
8733
8847
  self.model = "models/monsters/gunner/tris.md2";
8734
8848
  self.mins = { x: -16, y: -16, z: -24 };
@@ -10100,7 +10214,7 @@ var pain1_move6;
10100
10214
  var pain2_move6;
10101
10215
  var pain3_move5;
10102
10216
  var death_move13;
10103
- var jump_move;
10217
+ var jump_move2;
10104
10218
  function mutant_step(self) {
10105
10219
  self.monsterinfo.current_move = walk_move14;
10106
10220
  }
@@ -10191,7 +10305,7 @@ function mutant_check_attack(self, context) {
10191
10305
  return true;
10192
10306
  }
10193
10307
  if (dist >= 128 && dist < 512 && random6() < 0.3) {
10194
- self.monsterinfo.current_move = jump_move;
10308
+ self.monsterinfo.current_move = jump_move2;
10195
10309
  return true;
10196
10310
  }
10197
10311
  }
@@ -10333,7 +10447,7 @@ attack_move7 = {
10333
10447
  frames: attack_frames7,
10334
10448
  endfunc: mutant_run
10335
10449
  };
10336
- var jump_frames = [
10450
+ var jump_frames2 = [
10337
10451
  { ai: monster_ai_face, dist: 0 },
10338
10452
  { ai: monster_ai_face, dist: 0 },
10339
10453
  { ai: monster_ai_face, dist: 0, think: mutant_jump_takeoff },
@@ -10343,14 +10457,14 @@ var jump_frames = [
10343
10457
  { ai: monster_ai_move16, dist: 0, think: mutant_check_ground },
10344
10458
  { ai: monster_ai_move16, dist: 0, think: mutant_check_ground }
10345
10459
  ];
10346
- jump_move = {
10460
+ jump_move2 = {
10347
10461
  firstframe: 93,
10348
10462
  lastframe: 100,
10349
- frames: jump_frames,
10463
+ frames: jump_frames2,
10350
10464
  endfunc: mutant_run
10351
10465
  // Should loop until grounded? The C code uses a loop for the jump frames.
10352
10466
  };
10353
- jump_move.frames[3].ai = (self, dist, context) => {
10467
+ jump_move2.frames[3].ai = (self, dist, context) => {
10354
10468
  mutant_check_ground(self, context);
10355
10469
  if (self.groundentity) return;
10356
10470
  if (self.frame === 99) {