quake2ts 0.0.224 → 0.0.226

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.
@@ -4715,13 +4715,63 @@ var func_door = (entity, context) => {
4715
4715
  entity.pos1 = { ...entity.origin };
4716
4716
  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);
4717
4717
  entity.pos2 = addVec3(entity.pos1, scaleVec3(entity.movedir, move));
4718
- entity.use = (self) => {
4718
+ if (entity.spawnflags & 1) {
4719
+ entity.origin = { ...entity.pos2 };
4720
+ entity.state = 0 /* Open */;
4721
+ }
4722
+ if (entity.health > 0) {
4723
+ entity.takedamage = true;
4724
+ entity.max_health = entity.health;
4725
+ entity.die = (self, inflictor, attacker, damage) => {
4726
+ self.health = self.max_health;
4727
+ self.takedamage = false;
4728
+ self.use?.(self, attacker, attacker);
4729
+ };
4730
+ }
4731
+ entity.use = (self, other, activator) => {
4732
+ if (entity.spawnflags & 32) {
4733
+ if (self.state === 2 /* Closed */) {
4734
+ self.state = 1 /* Opening */;
4735
+ self.think = door_go_up;
4736
+ context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
4737
+ } else if (self.state === 0 /* Open */) {
4738
+ self.state = 3 /* Closing */;
4739
+ self.think = door_go_down;
4740
+ context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
4741
+ }
4742
+ return;
4743
+ }
4719
4744
  if (self.state !== 2 /* Closed */) return;
4720
4745
  self.state = 1 /* Opening */;
4721
4746
  self.think = door_go_up;
4722
4747
  context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
4723
- context.entities.sound(self, 0, "doors/dr1_strt.wav", 1, 1, 0);
4748
+ let soundName = "doors/dr1_strt.wav";
4749
+ if (entity.sounds) {
4750
+ switch (entity.sounds) {
4751
+ case 1:
4752
+ soundName = "doors/dr1_strt.wav";
4753
+ break;
4754
+ case 2:
4755
+ soundName = "doors/dr2_strt.wav";
4756
+ break;
4757
+ case 3:
4758
+ soundName = "doors/dr3_strt.wav";
4759
+ break;
4760
+ case 4:
4761
+ soundName = "doors/dr4_strt.wav";
4762
+ break;
4763
+ default:
4764
+ soundName = "doors/dr1_strt.wav";
4765
+ }
4766
+ }
4767
+ context.entities.sound(self, 0, soundName, 1, 1, 0);
4724
4768
  };
4769
+ if (entity.health <= 0 && !entity.targetname) {
4770
+ entity.touch = (self, other) => {
4771
+ if (!other || other.classname !== "player") return;
4772
+ self.use?.(self, other, other);
4773
+ };
4774
+ }
4725
4775
  };
4726
4776
  var func_button = (entity, context) => {
4727
4777
  entity.solid = 3 /* Bsp */;
@@ -8275,6 +8325,7 @@ var pain2_move4;
8275
8325
  var pain3_move3;
8276
8326
  var death_move6;
8277
8327
  var duck_move3;
8328
+ var jump_move;
8278
8329
  function gunner_idlesound(self, context) {
8279
8330
  context.engine.sound?.(self, 0, "gunner/gunidle1.wav", 1, 1, 0);
8280
8331
  }
@@ -8399,6 +8450,51 @@ function gunner_dodge(self, attacker, eta, context) {
8399
8450
  if (!self.enemy) self.enemy = attacker;
8400
8451
  self.monsterinfo.current_move = duck_move3;
8401
8452
  }
8453
+ function gunner_jump_takeoff(self, context) {
8454
+ if (!self.enemy) return;
8455
+ const diff = subtractVec3(self.enemy.origin, self.origin);
8456
+ const dist = Math.sqrt(diff.x * diff.x + diff.y * diff.y + diff.z * diff.z);
8457
+ const fwd_speed = 600;
8458
+ const forward = normalizeVec3({ x: diff.x, y: diff.y, z: 0 });
8459
+ const angles = vectorToAngles(forward);
8460
+ self.angles = { x: self.angles.x, y: angles.y, z: self.angles.z };
8461
+ const origin = { ...self.origin };
8462
+ origin.z += 1;
8463
+ self.origin = origin;
8464
+ self.velocity = {
8465
+ x: forward.x * fwd_speed,
8466
+ y: forward.y * fwd_speed,
8467
+ z: 270
8468
+ };
8469
+ self.groundentity = null;
8470
+ self.monsterinfo.aiflags |= 2048 /* Ducked */;
8471
+ self.monsterinfo.attack_finished = context.timeSeconds + 3;
8472
+ }
8473
+ function gunner_check_landing(self, context) {
8474
+ if (self.groundentity) {
8475
+ context.engine.sound?.(self, 0, "mutant/thud1.wav", 1, 1, 0);
8476
+ self.monsterinfo.attack_finished = 0;
8477
+ self.monsterinfo.aiflags &= ~2048 /* Ducked */;
8478
+ return;
8479
+ }
8480
+ if (context.timeSeconds > (self.monsterinfo.attack_finished || 0)) {
8481
+ self.monsterinfo.nextframe = 209 + 5;
8482
+ } else {
8483
+ self.monsterinfo.nextframe = 209 + 3;
8484
+ }
8485
+ }
8486
+ function gunner_jump(self, context) {
8487
+ if (self.spawnflags & 16) return;
8488
+ if (!self.enemy) return;
8489
+ if (!self.groundentity) return;
8490
+ const dist = Math.sqrt(
8491
+ Math.pow(self.enemy.origin.x - self.origin.x, 2) + Math.pow(self.enemy.origin.y - self.origin.y, 2)
8492
+ );
8493
+ if (dist > 256 && Math.random() < 0.02) {
8494
+ context.engine.sound?.(self, 0, "gunner/gunatck3.wav", 1, 1, 0);
8495
+ self.monsterinfo.current_move = jump_move;
8496
+ }
8497
+ }
8402
8498
  var stand_frames8 = Array.from({ length: 30 }, (_, i) => ({
8403
8499
  ai: monster_ai_stand9,
8404
8500
  dist: 0,
@@ -8433,9 +8529,11 @@ walk_move7 = {
8433
8529
  endfunc: null
8434
8530
  };
8435
8531
  var run_dists = [26, 9, 9, 9, 15, 10, 13, 6];
8436
- var run_frames6 = run_dists.map((d) => ({
8532
+ var run_frames6 = run_dists.map((d, i) => ({
8437
8533
  ai: monster_ai_run8,
8438
- dist: d
8534
+ dist: d,
8535
+ think: i % 4 === 0 ? gunner_jump : null
8536
+ // Check jump periodically
8439
8537
  }));
8440
8538
  run_move7 = {
8441
8539
  firstframe: 94,
@@ -8562,6 +8660,22 @@ duck_move3 = {
8562
8660
  frames: duck_frames3,
8563
8661
  endfunc: gunner_run
8564
8662
  };
8663
+ var jump_frames = [
8664
+ { ai: monster_ai_move9, dist: 0, think: gunner_jump_takeoff },
8665
+ { ai: monster_ai_move9, dist: 0 },
8666
+ { ai: monster_ai_move9, dist: 0 },
8667
+ { ai: monster_ai_move9, dist: 0, think: gunner_check_landing },
8668
+ { ai: monster_ai_move9, dist: 0 },
8669
+ { ai: monster_ai_move9, dist: 0 },
8670
+ { ai: monster_ai_move9, dist: 0 },
8671
+ { ai: monster_ai_move9, dist: 0 }
8672
+ ];
8673
+ jump_move = {
8674
+ firstframe: 209,
8675
+ lastframe: 216,
8676
+ frames: jump_frames,
8677
+ endfunc: gunner_run
8678
+ };
8565
8679
  function SP_monster_gunner(self, context) {
8566
8680
  self.model = "models/monsters/gunner/tris.md2";
8567
8681
  self.mins = { x: -16, y: -16, z: -24 };
@@ -9933,7 +10047,7 @@ var pain1_move6;
9933
10047
  var pain2_move6;
9934
10048
  var pain3_move5;
9935
10049
  var death_move13;
9936
- var jump_move;
10050
+ var jump_move2;
9937
10051
  function mutant_step(self) {
9938
10052
  self.monsterinfo.current_move = walk_move14;
9939
10053
  }
@@ -10024,7 +10138,7 @@ function mutant_check_attack(self, context) {
10024
10138
  return true;
10025
10139
  }
10026
10140
  if (dist >= 128 && dist < 512 && random6() < 0.3) {
10027
- self.monsterinfo.current_move = jump_move;
10141
+ self.monsterinfo.current_move = jump_move2;
10028
10142
  return true;
10029
10143
  }
10030
10144
  }
@@ -10166,7 +10280,7 @@ attack_move7 = {
10166
10280
  frames: attack_frames7,
10167
10281
  endfunc: mutant_run
10168
10282
  };
10169
- var jump_frames = [
10283
+ var jump_frames2 = [
10170
10284
  { ai: monster_ai_face, dist: 0 },
10171
10285
  { ai: monster_ai_face, dist: 0 },
10172
10286
  { ai: monster_ai_face, dist: 0, think: mutant_jump_takeoff },
@@ -10176,14 +10290,14 @@ var jump_frames = [
10176
10290
  { ai: monster_ai_move16, dist: 0, think: mutant_check_ground },
10177
10291
  { ai: monster_ai_move16, dist: 0, think: mutant_check_ground }
10178
10292
  ];
10179
- jump_move = {
10293
+ jump_move2 = {
10180
10294
  firstframe: 93,
10181
10295
  lastframe: 100,
10182
- frames: jump_frames,
10296
+ frames: jump_frames2,
10183
10297
  endfunc: mutant_run
10184
10298
  // Should loop until grounded? The C code uses a loop for the jump frames.
10185
10299
  };
10186
- jump_move.frames[3].ai = (self, dist, context) => {
10300
+ jump_move2.frames[3].ai = (self, dist, context) => {
10187
10301
  mutant_check_ground(self, context);
10188
10302
  if (self.groundentity) return;
10189
10303
  if (self.frame === 99) {