quake2ts 0.0.71 → 0.0.73

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 (37) hide show
  1. package/README.md +8 -5
  2. package/package.json +1 -1
  3. package/packages/client/dist/browser/index.global.js +1 -1
  4. package/packages/client/dist/browser/index.global.js.map +1 -1
  5. package/packages/client/dist/cjs/index.cjs +3 -1
  6. package/packages/client/dist/cjs/index.cjs.map +1 -1
  7. package/packages/client/dist/esm/index.js +3 -1
  8. package/packages/client/dist/esm/index.js.map +1 -1
  9. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  10. package/packages/engine/dist/browser/index.global.js +14 -14
  11. package/packages/engine/dist/browser/index.global.js.map +1 -1
  12. package/packages/engine/dist/cjs/index.cjs +488 -6
  13. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  14. package/packages/engine/dist/esm/index.js +483 -6
  15. package/packages/engine/dist/esm/index.js.map +1 -1
  16. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  17. package/packages/engine/dist/types/index.d.ts +2 -1
  18. package/packages/engine/dist/types/index.d.ts.map +1 -1
  19. package/packages/engine/dist/types/render/bsp.d.ts +14 -0
  20. package/packages/engine/dist/types/render/bsp.d.ts.map +1 -1
  21. package/packages/game/dist/browser/index.global.js +1 -1
  22. package/packages/game/dist/browser/index.global.js.map +1 -1
  23. package/packages/game/dist/cjs/index.cjs +259 -40
  24. package/packages/game/dist/cjs/index.cjs.map +1 -1
  25. package/packages/game/dist/esm/index.js +259 -40
  26. package/packages/game/dist/esm/index.js.map +1 -1
  27. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  28. package/packages/game/dist/types/entities/entity.d.ts +4 -1
  29. package/packages/game/dist/types/entities/entity.d.ts.map +1 -1
  30. package/packages/game/dist/types/entities/funcs.d.ts.map +1 -1
  31. package/packages/game/dist/types/entities/lights.d.ts +3 -0
  32. package/packages/game/dist/types/entities/lights.d.ts.map +1 -0
  33. package/packages/game/dist/types/entities/paths.d.ts +3 -0
  34. package/packages/game/dist/types/entities/paths.d.ts.map +1 -0
  35. package/packages/game/dist/types/entities/spawn.d.ts.map +1 -1
  36. package/packages/game/dist/types/entities/utils.d.ts +5 -0
  37. package/packages/game/dist/types/entities/utils.d.ts.map +1 -1
@@ -775,6 +775,9 @@ var Entity = class {
775
775
  this.takedamage = false;
776
776
  this.dmg = 0;
777
777
  this.speed = 0;
778
+ this.accel = 0;
779
+ this.decel = 0;
780
+ this.height = 0;
778
781
  this.deadflag = 0 /* Alive */;
779
782
  this.count = 0;
780
783
  this.wait = 0;
@@ -855,6 +858,9 @@ var Entity = class {
855
858
  this.takedamage = false;
856
859
  this.dmg = 0;
857
860
  this.speed = 0;
861
+ this.accel = 0;
862
+ this.decel = 0;
863
+ this.height = 0;
858
864
  this.deadflag = 0 /* Alive */;
859
865
  this.count = 0;
860
866
  this.wait = 0;
@@ -936,6 +942,9 @@ var ENTITY_FIELD_METADATA = [
936
942
  { name: "takedamage", type: "boolean", save: true },
937
943
  { name: "dmg", type: "int", save: true },
938
944
  { name: "speed", type: "float", save: true },
945
+ { name: "accel", type: "float", save: true },
946
+ { name: "decel", type: "float", save: true },
947
+ { name: "height", type: "float", save: true },
939
948
  { name: "deadflag", type: "int", save: true },
940
949
  { name: "count", type: "int", save: true },
941
950
  { name: "wait", type: "float", save: true },
@@ -3173,17 +3182,9 @@ function door_go_down(door, context) {
3173
3182
  }
3174
3183
  const move = distance(door.origin, door.pos1);
3175
3184
  const speed = Math.min(door.speed, move);
3176
- door.velocity = {
3177
- x: (door.pos1.x - door.origin.x) / distance(door.pos1, door.origin) * door.speed,
3178
- y: (door.pos1.y - door.origin.y) / distance(door.pos1, door.origin) * door.speed,
3179
- z: (door.pos1.z - door.origin.z) / distance(door.pos1, door.origin) * door.speed
3180
- };
3185
+ door.velocity = scaleVec3(normalizeVec3(subtractVec3(door.pos1, door.origin)), speed);
3181
3186
  if (move <= door.speed * 0.1) {
3182
- door.velocity = {
3183
- x: (door.pos1.x - door.origin.x) / 0.1,
3184
- y: (door.pos1.y - door.origin.y) / 0.1,
3185
- z: (door.pos1.z - door.origin.z) / 0.1
3186
- };
3187
+ door.velocity = scaleVec3(subtractVec3(door.pos1, door.origin), 10);
3187
3188
  }
3188
3189
  context?.scheduleThink(door, context.timeSeconds + 0.1);
3189
3190
  }
@@ -3196,48 +3197,26 @@ function door_go_up(door, context) {
3196
3197
  return;
3197
3198
  }
3198
3199
  const move = distance(door.origin, door.pos2);
3199
- door.velocity = {
3200
- x: (door.pos2.x - door.origin.x) / distance(door.pos2, door.origin) * door.speed,
3201
- y: (door.pos2.y - door.origin.y) / distance(door.pos2, door.origin) * door.speed,
3202
- z: (door.pos2.z - door.origin.z) / distance(door.pos2, door.origin) * door.speed
3203
- };
3200
+ door.velocity = scaleVec3(normalizeVec3(subtractVec3(door.pos2, door.origin)), door.speed);
3204
3201
  if (move <= door.speed * 0.1) {
3205
- door.velocity = {
3206
- x: (door.pos2.x - door.origin.x) / 0.1,
3207
- y: (door.pos2.y - door.origin.y) / 0.1,
3208
- z: (door.pos2.z - door.origin.z) / 0.1
3209
- };
3202
+ door.velocity = scaleVec3(subtractVec3(door.pos2, door.origin), 10);
3210
3203
  }
3211
3204
  context?.scheduleThink(door, context.timeSeconds + 0.1);
3212
3205
  }
3213
3206
  var func_door = (entity, context) => {
3214
3207
  entity.movedir = setMovedir(entity.angles);
3215
- if (!entity.speed) {
3216
- entity.speed = 100;
3217
- }
3218
- if (!entity.wait) {
3219
- entity.wait = 3;
3220
- }
3221
- if (!entity.lip) {
3222
- entity.lip = 8;
3223
- }
3224
- if (!entity.dmg) {
3225
- entity.dmg = 2;
3226
- }
3227
- if (!entity.health) {
3228
- entity.health = 0;
3229
- }
3208
+ if (!entity.speed) entity.speed = 100;
3209
+ if (!entity.wait) entity.wait = 3;
3210
+ if (!entity.lip) entity.lip = 8;
3211
+ if (!entity.dmg) entity.dmg = 2;
3212
+ if (!entity.health) entity.health = 0;
3230
3213
  entity.solid = 3 /* Bsp */;
3231
3214
  entity.movetype = 2 /* Push */;
3232
3215
  entity.blocked = door_blocked;
3233
3216
  entity.state = 2 /* Closed */;
3234
3217
  entity.pos1 = { ...entity.origin };
3235
3218
  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);
3236
- entity.pos2 = {
3237
- x: entity.pos1.x + entity.movedir.x * move,
3238
- y: entity.pos1.y + entity.movedir.y * move,
3239
- z: entity.pos1.z + entity.movedir.z * move
3240
- };
3219
+ entity.pos2 = addVec3(entity.pos1, scaleVec3(entity.movedir, move));
3241
3220
  entity.use = (self) => {
3242
3221
  if (self.state !== 2 /* Closed */) return;
3243
3222
  self.state = 1 /* Opening */;
@@ -3252,9 +3231,247 @@ var func_button = (entity, context) => {
3252
3231
  context.entities.useTargets(self, self);
3253
3232
  };
3254
3233
  };
3234
+ var TRAIN_START_ON = 1;
3235
+ var TRAIN_BLOCK_STOPS = 4;
3236
+ function train_blocked(self, other) {
3237
+ if (other && other.takedamage) {
3238
+ other.health -= self.dmg || 0;
3239
+ }
3240
+ if (!(self.spawnflags & TRAIN_BLOCK_STOPS)) {
3241
+ return;
3242
+ }
3243
+ self.velocity = { x: 0, y: 0, z: 0 };
3244
+ self.nextthink = 0;
3245
+ }
3246
+ function train_wait(self, context) {
3247
+ if (self.target_ent && self.target_ent.pathtarget) {
3248
+ context.useTargets(self.target_ent, self);
3249
+ }
3250
+ if (self.target_ent && self.target_ent.target) {
3251
+ const next = context.pickTarget(self.target_ent.target);
3252
+ if (!next) return;
3253
+ self.target_ent = next;
3254
+ const dist = distance(self.origin, next.origin);
3255
+ const speed = self.speed || 100;
3256
+ const time = dist / speed;
3257
+ const dir = normalizeVec3(subtractVec3(next.origin, self.origin));
3258
+ self.velocity = scaleVec3(dir, speed);
3259
+ self.think = train_next;
3260
+ context.scheduleThink(self, context.timeSeconds + time);
3261
+ }
3262
+ }
3263
+ function train_next(self, context) {
3264
+ self.velocity = { x: 0, y: 0, z: 0 };
3265
+ if (self.target_ent) {
3266
+ self.origin = { ...self.target_ent.origin };
3267
+ }
3268
+ const wait = self.wait || 0;
3269
+ if (wait > 0) {
3270
+ self.think = train_wait;
3271
+ context.scheduleThink(self, context.timeSeconds + wait);
3272
+ } else {
3273
+ train_wait(self, context);
3274
+ }
3275
+ }
3276
+ function train_find(self, context) {
3277
+ const target = context.pickTarget(self.target);
3278
+ if (!target) return;
3279
+ self.target_ent = target;
3280
+ self.origin = { ...target.origin };
3281
+ if (self.spawnflags & TRAIN_START_ON) {
3282
+ train_wait(self, context);
3283
+ } else {
3284
+ self.use = (ent) => {
3285
+ if (ent.velocity.x !== 0 || ent.velocity.y !== 0 || ent.velocity.z !== 0) return;
3286
+ train_wait(ent, context);
3287
+ };
3288
+ }
3289
+ }
3290
+ var func_train = (entity, context) => {
3291
+ entity.solid = 3 /* Bsp */;
3292
+ entity.movetype = 2 /* Push */;
3293
+ entity.blocked = train_blocked;
3294
+ if (!entity.speed) entity.speed = 100;
3295
+ if (!entity.dmg) entity.dmg = 2;
3296
+ entity.think = (self) => train_find(self, context.entities);
3297
+ context.entities.scheduleThink(entity, context.entities.timeSeconds + 0.1);
3298
+ };
3299
+ function plat_go_down(ent, context) {
3300
+ if (vec3Equals(ent.origin, ent.pos2)) {
3301
+ ent.state = 1 /* Down */;
3302
+ ent.velocity = { x: 0, y: 0, z: 0 };
3303
+ return;
3304
+ }
3305
+ const move = distance(ent.origin, ent.pos2);
3306
+ ent.velocity = scaleVec3(normalizeVec3(subtractVec3(ent.pos2, ent.origin)), ent.speed);
3307
+ if (move <= ent.speed * 0.1) {
3308
+ ent.velocity = scaleVec3(subtractVec3(ent.pos2, ent.origin), 10);
3309
+ }
3310
+ context.scheduleThink(ent, context.timeSeconds + 0.1);
3311
+ }
3312
+ function plat_go_up(ent, context) {
3313
+ if (vec3Equals(ent.origin, ent.pos1)) {
3314
+ ent.state = 0 /* Up */;
3315
+ ent.velocity = { x: 0, y: 0, z: 0 };
3316
+ if (!(ent.spawnflags & 1)) {
3317
+ ent.think = plat_wait_top;
3318
+ context.scheduleThink(ent, context.timeSeconds + ent.wait);
3319
+ }
3320
+ return;
3321
+ }
3322
+ const move = distance(ent.origin, ent.pos1);
3323
+ ent.velocity = scaleVec3(normalizeVec3(subtractVec3(ent.pos1, ent.origin)), ent.speed);
3324
+ if (move <= ent.speed * 0.1) {
3325
+ ent.velocity = scaleVec3(subtractVec3(ent.pos1, ent.origin), 10);
3326
+ }
3327
+ context.scheduleThink(ent, context.timeSeconds + 0.1);
3328
+ }
3329
+ function plat_wait_top(ent, context) {
3330
+ ent.state = 3 /* GoingDown */;
3331
+ ent.think = plat_go_down;
3332
+ plat_go_down(ent, context);
3333
+ }
3334
+ var func_plat = (entity, context) => {
3335
+ entity.movedir = setMovedir(entity.angles);
3336
+ if (!entity.speed) entity.speed = 200;
3337
+ if (!entity.accel) entity.accel = 500;
3338
+ if (!entity.decel) entity.decel = 500;
3339
+ if (!entity.wait) entity.wait = 3;
3340
+ if (!entity.lip) entity.lip = 8;
3341
+ if (!entity.height) entity.height = entity.size.z - entity.lip;
3342
+ entity.solid = 3 /* Bsp */;
3343
+ entity.movetype = 2 /* Push */;
3344
+ entity.pos1 = { ...entity.origin };
3345
+ entity.pos2 = {
3346
+ x: entity.origin.x,
3347
+ y: entity.origin.y,
3348
+ z: entity.origin.z - entity.height
3349
+ };
3350
+ entity.origin = { ...entity.pos2 };
3351
+ entity.state = 1 /* Down */;
3352
+ entity.blocked = (self, other) => {
3353
+ if (other && other.takedamage) {
3354
+ other.health -= self.dmg || 2;
3355
+ }
3356
+ if (self.state === 2 /* GoingUp */) {
3357
+ self.state = 3 /* GoingDown */;
3358
+ self.think = (e) => plat_go_down(e, context.entities);
3359
+ } else if (self.state === 3 /* GoingDown */) {
3360
+ self.state = 2 /* GoingUp */;
3361
+ self.think = (e) => plat_go_up(e, context.entities);
3362
+ }
3363
+ };
3364
+ entity.use = (self) => {
3365
+ if (self.state === 1 /* Down */) {
3366
+ self.state = 2 /* GoingUp */;
3367
+ self.think = (e) => plat_go_up(e, context.entities);
3368
+ context.entities.scheduleThink(self, context.entities.timeSeconds + 0.1);
3369
+ }
3370
+ };
3371
+ const trigger = context.entities.spawn();
3372
+ trigger.classname = "plat_trigger";
3373
+ trigger.movetype = 0 /* None */;
3374
+ trigger.solid = 1 /* Trigger */;
3375
+ trigger.mins = { x: entity.mins.x + 25, y: entity.mins.y + 25, z: entity.maxs.z };
3376
+ trigger.maxs = { x: entity.maxs.x - 25, y: entity.maxs.y - 25, z: entity.maxs.z + 8 };
3377
+ trigger.touch = (t, other) => {
3378
+ if (entity.state === 1 /* Down */) {
3379
+ entity.use?.(entity, other, other);
3380
+ }
3381
+ };
3382
+ };
3383
+ var func_rotating = (entity, context) => {
3384
+ entity.solid = 3 /* Bsp */;
3385
+ entity.movetype = 2 /* Push */;
3386
+ if (!entity.speed) {
3387
+ entity.speed = 100;
3388
+ }
3389
+ if (entity.spawnflags & 4) {
3390
+ entity.avelocity = { x: entity.speed, y: 0, z: 0 };
3391
+ } else if (entity.spawnflags & 8) {
3392
+ entity.avelocity = { x: 0, y: entity.speed, z: 0 };
3393
+ } else {
3394
+ entity.avelocity = { x: 0, y: 0, z: entity.speed };
3395
+ }
3396
+ if (entity.dmg) {
3397
+ entity.blocked = (self, other) => {
3398
+ if (other && other.takedamage) {
3399
+ other.health -= self.dmg;
3400
+ }
3401
+ };
3402
+ }
3403
+ };
3404
+ var func_conveyor = (entity, context) => {
3405
+ entity.solid = 3 /* Bsp */;
3406
+ if (!entity.speed) entity.speed = 100;
3407
+ entity.movetype = 0 /* None */;
3408
+ };
3409
+ var func_water = (entity, context) => {
3410
+ entity.solid = 3 /* Bsp */;
3411
+ entity.movetype = 2 /* Push */;
3412
+ };
3413
+ var func_explosive = (entity, context) => {
3414
+ entity.solid = 3 /* Bsp */;
3415
+ entity.movetype = 2 /* Push */;
3416
+ if (!entity.health) entity.health = 100;
3417
+ if (!entity.dmg) entity.dmg = 120;
3418
+ entity.takedamage = true;
3419
+ entity.die = (self, inflictor, attacker, damage) => {
3420
+ context.entities.free(self);
3421
+ };
3422
+ };
3423
+ var func_killbox = (entity, context) => {
3424
+ entity.solid = 0 /* Not */;
3425
+ entity.movetype = 0 /* None */;
3426
+ entity.use = (self) => {
3427
+ context.entities.killBox(self);
3428
+ };
3429
+ };
3430
+ var func_areaportal = (entity, context) => {
3431
+ entity.use = (self, other, activator) => {
3432
+ entity.state = entity.state === 0 /* Open */ ? 2 /* Closed */ : 0 /* Open */;
3433
+ };
3434
+ };
3255
3435
  function registerFuncSpawns(registry) {
3256
3436
  registry.register("func_door", func_door);
3257
3437
  registry.register("func_button", func_button);
3438
+ registry.register("func_train", func_train);
3439
+ registry.register("func_plat", func_plat);
3440
+ registry.register("func_rotating", func_rotating);
3441
+ registry.register("func_conveyor", func_conveyor);
3442
+ registry.register("func_water", func_water);
3443
+ registry.register("func_explosive", func_explosive);
3444
+ registry.register("func_killbox", func_killbox);
3445
+ registry.register("func_areaportal", func_areaportal);
3446
+ }
3447
+
3448
+ // src/entities/paths.ts
3449
+ function pathCornerTouch(self, other) {
3450
+ if (other !== self.owner) {
3451
+ return;
3452
+ }
3453
+ }
3454
+ function registerPathSpawns(registry) {
3455
+ registry.register("path_corner", (entity) => {
3456
+ entity.solid = 0 /* Not */;
3457
+ entity.touch = pathCornerTouch;
3458
+ });
3459
+ }
3460
+
3461
+ // src/entities/lights.ts
3462
+ function registerLightSpawns(registry) {
3463
+ registry.register("light", (entity) => {
3464
+ entity.movetype = 0 /* None */;
3465
+ entity.solid = 0 /* Not */;
3466
+ });
3467
+ registry.register("light_mine1", (entity) => {
3468
+ entity.movetype = 0 /* None */;
3469
+ entity.solid = 0 /* Not */;
3470
+ });
3471
+ registry.register("light_mine2", (entity) => {
3472
+ entity.movetype = 0 /* None */;
3473
+ entity.solid = 0 /* Not */;
3474
+ });
3258
3475
  }
3259
3476
 
3260
3477
  // src/entities/spawn.ts
@@ -3469,6 +3686,8 @@ function registerDefaultSpawns(game, registry) {
3469
3686
  registerMiscSpawns(registry);
3470
3687
  registerItemSpawns(game, registry);
3471
3688
  registerFuncSpawns(registry);
3689
+ registerPathSpawns(registry);
3690
+ registerLightSpawns(registry);
3472
3691
  }
3473
3692
  function createDefaultSpawnRegistry(game) {
3474
3693
  const registry = new SpawnRegistry();