@gamebob/axon-surge 0.36.0 → 0.37.0

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 (31) hide show
  1. package/dist/axon-surge.js +604 -388
  2. package/dist/challenges/ChallengeSpawnProfile.d.ts +11 -0
  3. package/dist/challenges/ChallengeSpawnProfile.d.ts.map +1 -0
  4. package/dist/content/ContentRegistry.d.ts +1 -0
  5. package/dist/content/ContentRegistry.d.ts.map +1 -1
  6. package/dist/content/ContentTypes.d.ts +2 -0
  7. package/dist/content/ContentTypes.d.ts.map +1 -1
  8. package/dist/content/DefaultTutorials.d.ts.map +1 -1
  9. package/dist/core/GameEngineInitialization.d.ts.map +1 -1
  10. package/dist/director/TutorialSetup.d.ts +1 -1
  11. package/dist/director/TutorialSetup.d.ts.map +1 -1
  12. package/dist/director/WaveDirector.d.ts +3 -0
  13. package/dist/director/WaveDirector.d.ts.map +1 -1
  14. package/dist/director/WaveSpawnResolver.d.ts +4 -0
  15. package/dist/director/WaveSpawnResolver.d.ts.map +1 -1
  16. package/dist/entities/EnemyEntity.d.ts +1 -0
  17. package/dist/entities/EnemyEntity.d.ts.map +1 -1
  18. package/dist/i18n/locales.d.ts +8 -0
  19. package/dist/i18n/locales.d.ts.map +1 -1
  20. package/dist/objectives/DefaultObjectives.d.ts.map +1 -1
  21. package/dist/objectives/ObjectiveTypes.d.ts +4 -0
  22. package/dist/objectives/ObjectiveTypes.d.ts.map +1 -1
  23. package/dist/physics/PhysicsEngine.d.ts +2 -0
  24. package/dist/physics/PhysicsEngine.d.ts.map +1 -1
  25. package/dist/physics/handlers/CoreCollisionHandler.d.ts +5 -0
  26. package/dist/physics/handlers/CoreCollisionHandler.d.ts.map +1 -1
  27. package/dist/physics/handlers/SmasherCollisionHandler.d.ts +2 -0
  28. package/dist/physics/handlers/SmasherCollisionHandler.d.ts.map +1 -1
  29. package/dist/ui/ObjectiveToast.d.ts +3 -0
  30. package/dist/ui/ObjectiveToast.d.ts.map +1 -1
  31. package/package.json +1 -1
@@ -56,7 +56,7 @@ class xt {
56
56
  this.core.setRepelHoverDirection(null);
57
57
  }
58
58
  }
59
- class St {
59
+ class bt {
60
60
  constructor(e) {
61
61
  this.config = e, this.smasherImpactsRemaining = Math.max(1, e.smasherMaxImpacts), this.smasherSecondaryImpactsRemaining = Math.max(1, e.smasherMaxImpacts);
62
62
  }
@@ -150,7 +150,7 @@ class St {
150
150
  this.repelDirection = { x: 1, y: 0 }, this.repelHoverDirection = { x: 1, y: 0 }, this.repelHoverCompression = 0, this.repelPulse = 0, this.smasherImpactsRemaining = Math.max(1, this.config.smasherMaxImpacts), this.smasherSecondaryImpactsRemaining = Math.max(1, this.config.smasherMaxImpacts), this.smasherCooldownTimer = 0, this.smasherImpactPulse = 0, this.smasherBreakPulse = 0, this.smasherRetractionOrigin = null, this.smasherArmColor = "#ffffff", this.protectionTimer = 0, this.smasherFreshGrab = !1, this.smasherUsingSecondary = !1, this.smasherCapturedType = null, this.smasherPowerTimer = 0, this.repairProgress = 0;
151
151
  }
152
152
  }
153
- class bt {
153
+ class St {
154
154
  color = { r: 0, g: 240, b: 255 };
155
155
  powerUpColors = [];
156
156
  absorbPowerUpColor(e, t) {
@@ -204,7 +204,7 @@ class Ct {
204
204
  }
205
205
  class qe {
206
206
  constructor(e, t, a) {
207
- this.config = a, this.mechanics = new St(this.config), this.integrityController = new Ct(this.config), this.position = { x: e, y: t }, this.radius = this.config.radius, this.maxInvulnerabilityDuration = this.config.invulnerabilityDuration, this.organicSeed = Math.random() * 100;
207
+ this.config = a, this.mechanics = new bt(this.config), this.integrityController = new Ct(this.config), this.position = { x: e, y: t }, this.radius = this.config.radius, this.maxInvulnerabilityDuration = this.config.invulnerabilityDuration, this.organicSeed = Math.random() * 100;
208
208
  }
209
209
  position;
210
210
  radius;
@@ -212,7 +212,7 @@ class qe {
212
212
  organicSeed;
213
213
  maxInvulnerabilityDuration;
214
214
  mechanics;
215
- appearance = new bt();
215
+ appearance = new St();
216
216
  integrityController;
217
217
  get customColor() {
218
218
  return this.appearance.color;
@@ -552,9 +552,9 @@ class Tt {
552
552
  return a;
553
553
  }
554
554
  }
555
- class be {
555
+ class Se {
556
556
  static killEnemy(e, t, a, i) {
557
- !e.active || e.isDying || (i && (e.codexDeathSourceType = i), e.experienceDropPending = !0, a.shockwaves.push({
557
+ !e.active || e.isDying || e.isChallengeInvulnerable || (i && (e.codexDeathSourceType = i), e.experienceDropPending = !0, a.shockwaves.push({
558
558
  id: Math.random().toString(),
559
559
  position: { ...e.position },
560
560
  radius: 10,
@@ -621,23 +621,23 @@ const p = {
621
621
  };
622
622
  class $e {
623
623
  static update(e) {
624
- const { core: t, enemies: a } = e;
625
- for (const i of a) {
626
- if (!i.active || i.isGrabbed || i.isDying || i.launchDelay > 0 || this.tryAutoDeflectFragment({
627
- core: t,
628
- enemy: i,
629
- shockwaves: e.shockwaves,
630
- particles: e.particles,
631
- juice: e.juice,
632
- config: e.config
633
- }))
634
- continue;
635
- const o = t.position.x - i.position.x, n = t.position.y - i.position.y;
636
- if (Math.hypot(o, n) <= t.getHitboxRadius() + i.radius) {
637
- i.active = !1, this.damageCore({ ...e, direction: { x: o, y: n }, threatPosition: { ...i.position }, allowProtection: !0 });
638
- break;
639
- }
640
- }
624
+ const { enemies: t } = e;
625
+ for (const a of t)
626
+ if (this.processEnemyImpact(e, a)) break;
627
+ }
628
+ static processEnemyImpact(e, t) {
629
+ if (!this.isEnemyEligible(t) || this.isAutoDeflected(e, t)) return !1;
630
+ const { core: a } = e, i = a.position.x - t.position.x, o = a.position.y - t.position.y;
631
+ return Math.hypot(i, o) > a.getHitboxRadius() + t.radius ? !1 : (t.active = !1, this.damageCore({ ...e, direction: { x: i, y: o }, threatPosition: { ...t.position }, allowProtection: !0 }), this.notifyChallengeFailure(e, t), !0);
632
+ }
633
+ static isEnemyEligible(e) {
634
+ return e.active && !e.isGrabbed && !e.isDying && e.launchDelay <= 0;
635
+ }
636
+ static isAutoDeflected(e, t) {
637
+ return this.tryAutoDeflectFragment({ core: e.core, enemy: t, shockwaves: e.shockwaves, particles: e.particles, juice: e.juice, config: e.config });
638
+ }
639
+ static notifyChallengeFailure(e, t) {
640
+ t.isChallengeInvulnerable && e.onChallengeFailure?.();
641
641
  }
642
642
  static damageCore(e) {
643
643
  const { core: t, juice: a, eventBus: i, direction: o } = e;
@@ -806,17 +806,17 @@ const wt = (r, e) => {
806
806
  onKill: e.onKill,
807
807
  killEnemy: e.killEnemy
808
808
  }), e.killEnemy = (t, a, i) => {
809
- be.killEnemy(t, a, e.effectContext(), i);
809
+ Se.killEnemy(t, a, e.effectContext(), i);
810
810
  }, e;
811
811
  }, Dt = (r) => {
812
- const e = Mt(r), t = Ot(e);
812
+ const e = Mt(r), t = Nt(e);
813
813
  wt(e, t);
814
- }, Ot = (r) => {
814
+ }, Nt = (r) => {
815
815
  let e = !1;
816
816
  for (const t of r.enemies.slice())
817
- Nt(t) && (e = !0, Lt(r, t));
817
+ Ot(t) && (e = !0, Lt(r, t));
818
818
  return e;
819
- }, Nt = (r) => r.active && r.isThrown && !r.isDying && r.launchDelay <= 0, Lt = (r, e) => {
819
+ }, Ot = (r) => r.active && r.isThrown && !r.isDying && r.launchDelay <= 0, Lt = (r, e) => {
820
820
  if (_t(r, e)) {
821
821
  r = jt(r, e);
822
822
  return;
@@ -905,7 +905,7 @@ class Zt {
905
905
  for (const a of t.enemies.slice()) {
906
906
  if (!this.canEnterPool(a)) continue;
907
907
  const i = a.position.x - e.position.x, o = a.position.y - e.position.y;
908
- i * i + o * o > e.radius * e.radius || (be.killEnemy(a, 0, t.runtime, e.sourceType), t.currentThrowState.kills++, t.onKill?.());
908
+ i * i + o * o > e.radius * e.radius || (Se.killEnemy(a, 0, t.runtime, e.sourceType), t.currentThrowState.kills++, t.onKill?.());
909
909
  }
910
910
  }
911
911
  static canEnterPool(e) {
@@ -966,7 +966,12 @@ class Xt {
966
966
  this.canProcessGrab(e) && this.processGrabbed(e);
967
967
  }
968
968
  static processRelease(e) {
969
- const { releasedEnemy: t, enemies: a, core: i, context: o } = e, n = i.wasFreshSmasherGrab();
969
+ const { releasedEnemy: t, enemies: a, core: i, context: o } = e;
970
+ if (e.preserveCapturedEnemy) {
971
+ this.releasePreservedEnemy(t, i), i.preserveSmasherPower();
972
+ return;
973
+ }
974
+ const n = i.wasFreshSmasherGrab();
970
975
  this.crush(t, o, 0), o.config.core.smasherCreaturePowerTier >= 2 && this.applyCreaturePower({
971
976
  type: t.type,
972
977
  origin: t.position,
@@ -988,7 +993,7 @@ class Xt {
988
993
  const { grabbedEnemy: a, enemies: i, core: o, context: n, onArmBreak: s } = t;
989
994
  if (!this.isImpactTarget(e, a)) return !1;
990
995
  const c = e.position.x - a.position.x, l = e.position.y - a.position.y, d = Math.atan2(l, c);
991
- return n.currentThrowState.pos = { ...a.position }, n.killEnemy(e, d, a.type), n.currentThrowState.kills += 1, n.onKill(), n.config.core.smasherCreaturePowerTier >= 1 && this.applyCreaturePower({ type: a.type, origin: a.position, enemies: i, context: n, multiplier: 1 }), this.pushImpactFeedback(a, n, c, l), this.preservesImpact(t, e) || !o.consumeSmasherImpact() ? !1 : (o.startSmasherRetraction(a.position, a.color), this.crush(a, n, d), n.currentThrowState.kills += 1, n.onKill(), s(), !0);
996
+ return n.currentThrowState.pos = { ...a.position }, n.killEnemy(e, d, a.type), n.currentThrowState.kills += 1, n.onKill(), n.config.core.smasherCreaturePowerTier >= 1 && this.applyCreaturePower({ type: a.type, origin: a.position, enemies: i, context: n, multiplier: 1 }), this.pushImpactFeedback(a, n, c, l), this.preservesImpact(t, e) || !o.consumeSmasherImpact() ? !1 : (o.startSmasherRetraction(a.position, a.color), t.preserveCapturedEnemy ? (this.releasePreservedEnemy(a, o), s(), !0) : (this.crush(a, n, d), n.currentThrowState.kills += 1, n.onKill(), s(), !0));
992
997
  }
993
998
  static isImpactTarget(e, t) {
994
999
  if (!this.canCrushTarget(e, t)) return !1;
@@ -1005,6 +1010,16 @@ class Xt {
1005
1010
  static crush(e, t, a) {
1006
1011
  !e.active || e.isDying || t.killEnemy(e, a);
1007
1012
  }
1013
+ static releasePreservedEnemy(e, t) {
1014
+ e.isGrabbed = !1, e.isThrown = !1, e.wasManipulated = !1, e.bossLaunchPhase = "none";
1015
+ const a = t.position.x - e.position.x, i = t.position.y - e.position.y, o = Math.hypot(a, i);
1016
+ if (o <= 1e-3) return;
1017
+ const n = Math.max(e.maxSpeed, Math.hypot(e.velocity.x, e.velocity.y));
1018
+ e.velocity = {
1019
+ x: a / o * n,
1020
+ y: i / o * n
1021
+ };
1022
+ }
1008
1023
  static applyCreaturePower(e) {
1009
1024
  if (e.type === "spore") return this.applyToxicPower(e);
1010
1025
  if (e.type === "parasite") return this.applyAttractorPower(e);
@@ -1170,7 +1185,8 @@ class Qt {
1170
1185
  score: c,
1171
1186
  width: l,
1172
1187
  height: d,
1173
- config: u
1188
+ config: u,
1189
+ ...e.onChallengeFailure ? { onChallengeFailure: e.onChallengeFailure } : {}
1174
1190
  });
1175
1191
  }
1176
1192
  processThrownCollision(e) {
@@ -1203,7 +1219,8 @@ class Qt {
1203
1219
  core: a,
1204
1220
  context: i,
1205
1221
  onArmBreak: e.onSmasherArmBreak ?? (() => {
1206
- })
1222
+ }),
1223
+ preserveCapturedEnemy: e.preserveSmasherCapturedEnemy === !0
1207
1224
  });
1208
1225
  }
1209
1226
  processEnvironmentalCollisions(e) {
@@ -1248,7 +1265,7 @@ class Qt {
1248
1265
  E.merge(t, a, i, o.effectAggregation), i.length > 32 && i.splice(0, i.length - 32);
1249
1266
  }
1250
1267
  createRuntime(e) {
1251
- const t = {}, a = (i, o, n) => be.killEnemy(i, o, t, n);
1268
+ const t = {}, a = (i, o, n) => Se.killEnemy(i, o, t, n);
1252
1269
  return Object.assign(t, {
1253
1270
  enemies: e.enemies,
1254
1271
  pools: e.pools,
@@ -1473,6 +1490,20 @@ class or {
1473
1490
  setArea(e) {
1474
1491
  this.spawnResolver.setArea(e), this.reset();
1475
1492
  }
1493
+ setChallengeSpawnProfile(e) {
1494
+ this.spawnResolver.setChallengeSpawnProfile(e);
1495
+ }
1496
+ spawnInitialChallengeEnemies(e, t, a) {
1497
+ const i = this.spawnResolver.getChallengeSpawnProfile();
1498
+ return i ? i.initialEnemies.map((o) => {
1499
+ const n = this.pool.get();
1500
+ return this.factory.configureEnemy(n, o.enemyId, {
1501
+ spawnPos: f.getOffscreenPosition(e, t),
1502
+ corePos: a,
1503
+ variantId: o.variantId
1504
+ }), n.isChallengeInvulnerable = o.invulnerable === !0, n;
1505
+ }) : [];
1506
+ }
1476
1507
  getAvailableEnemyIds() {
1477
1508
  return this.spawnResolver.getAvailableEnemyIds();
1478
1509
  }
@@ -1546,9 +1577,16 @@ class nr {
1546
1577
  this.content = e, this.unlockState = t;
1547
1578
  }
1548
1579
  area = null;
1580
+ challengeSpawnProfile = null;
1549
1581
  setArea(e) {
1550
1582
  this.area = e;
1551
1583
  }
1584
+ setChallengeSpawnProfile(e) {
1585
+ this.challengeSpawnProfile = e;
1586
+ }
1587
+ getChallengeSpawnProfile() {
1588
+ return this.challengeSpawnProfile;
1589
+ }
1552
1590
  getAvailableEnemyIds() {
1553
1591
  return new Set(this.getAvailableEnemyDefinitions().map((e) => e.id));
1554
1592
  }
@@ -1591,12 +1629,14 @@ class nr {
1591
1629
  return Math.max(0, this.area?.patternWeights?.[e] ?? t);
1592
1630
  }
1593
1631
  selectVariantForSpawn(e) {
1594
- const t = this.area?.id;
1595
- if (!t) return;
1596
- const a = this.content.variants.values().filter((o) => o.baseEnemyId === e && (o.spawnChanceByArea[t] ?? 0) > 0);
1597
- let i = Math.random();
1598
- for (const o of a)
1599
- if (i -= o.spawnChanceByArea[t] ?? 0, i <= 0) return o.id;
1632
+ const t = this.challengeSpawnProfile?.variantByEnemyId[e];
1633
+ if (t) return t;
1634
+ const a = this.area?.id;
1635
+ if (!a) return;
1636
+ const i = this.content.variants.values().filter((n) => n.baseEnemyId === e && (n.spawnChanceByArea[a] ?? 0) > 0);
1637
+ let o = Math.random();
1638
+ for (const n of i)
1639
+ if (o -= n.spawnChanceByArea[a] ?? 0, o <= 0) return n.id;
1600
1640
  }
1601
1641
  }
1602
1642
  function A(r, e) {
@@ -2456,7 +2496,7 @@ class xr extends vr {
2456
2496
  return `#${s(0)}${s(2)}${s(4)}`;
2457
2497
  }
2458
2498
  }
2459
- class Sr extends xr {
2499
+ class br extends xr {
2460
2500
  render(e) {
2461
2501
  if (!this.renderer.ctx) return;
2462
2502
  const t = this.renderer.themeManager.getPalette(), { width: a, height: i } = this.renderer.canvas, o = e.juice.getShakeOffset();
@@ -2532,7 +2572,7 @@ class Sr extends xr {
2532
2572
  }), this.drawFloatingTexts(d), u && this.drawAreaIntro(u, t), h?.phase === "intro" && this.drawBossIntro(h, t, o.pulsePhase), m.flashAlpha > 0 && (g.fillStyle = `rgba(255, 255, 255, ${m.flashAlpha})`, g.fillRect(0, 0, a, i));
2533
2573
  }
2534
2574
  }
2535
- class br {
2575
+ class Sr {
2536
2576
  maxDistance = 800;
2537
2577
  maxThickness = 18;
2538
2578
  minThickness = 5;
@@ -2795,18 +2835,18 @@ function Mr(r) {
2795
2835
  e.save(), e.strokeStyle = o.effectHighlight, e.globalAlpha = 0.22, e.lineWidth = 1.5, e.beginPath(), e.arc(0, 0, n, 0, Math.PI * 2), e.stroke(), e.globalAlpha = 1, Dr(e, i, t.radius);
2796
2836
  for (let l = 0; l < s; l += 1) {
2797
2837
  const d = c + l * Math.PI * 2 / s, u = Math.cos(d) * n, h = Math.sin(d) * n, m = t.radius * (0.2 + Math.sin(a * 4 + l) * 0.025);
2798
- Or({ ctx: e, palette: o, color: i, x: u, y: h, radius: m });
2838
+ Nr({ ctx: e, palette: o, color: i, x: u, y: h, radius: m });
2799
2839
  }
2800
2840
  e.restore();
2801
2841
  }
2802
2842
  function Dr(r, e, t) {
2803
2843
  r.fillStyle = e, r.beginPath(), r.arc(0, 0, t * 0.5, 0, Math.PI * 2), r.fill();
2804
2844
  }
2805
- function Or(r) {
2845
+ function Nr(r) {
2806
2846
  const { ctx: e, palette: t, color: a, x: i, y: o, radius: n } = r;
2807
2847
  e.fillStyle = a, e.beginPath(), e.arc(i, o, n, 0, Math.PI * 2), e.fill(), e.fillStyle = t.effectHighlight, e.globalAlpha = 0.65, e.beginPath(), e.arc(i - n * 0.25, o - n * 0.25, n * 0.24, 0, Math.PI * 2), e.fill(), e.globalAlpha = 1;
2808
2848
  }
2809
- class Nr extends _ {
2849
+ class Or extends _ {
2810
2850
  drawShape(e) {
2811
2851
  const { ctx: t, enemy: a } = e;
2812
2852
  t.beginPath(), t.arc(0, 0, a.radius, 0, Math.PI * 2), this.isOutline(e) ? (t.stroke(), P(e)) : t.fill();
@@ -2994,7 +3034,7 @@ class $r {
2994
3034
  renderers = /* @__PURE__ */ new Map();
2995
3035
  variantStyles = /* @__PURE__ */ new Map([["mononreuronal", "outline"]]);
2996
3036
  constructor(e) {
2997
- this.register("circle", new Nr()), this.register("piercer", new Ur()), this.register("spore", new Wr()), this.register("cluster", new kr()), this.register("parasite", new Hr()), this.register("heavy", new Lr(e));
3037
+ this.register("circle", new Or()), this.register("piercer", new Ur()), this.register("spore", new Wr()), this.register("cluster", new kr()), this.register("parasite", new Hr()), this.register("heavy", new Lr(e));
2998
3038
  }
2999
3039
  register(e, t) {
3000
3040
  this.renderers.set(e, t);
@@ -3435,9 +3475,9 @@ class ea {
3435
3475
  smasherRenderer;
3436
3476
  pulpocrataRenderer;
3437
3477
  constructor(e, t, a) {
3438
- this.canvas = e, this.ctx = e.getContext("2d"), this.themeManager = t, this.indicatorRenderer = new br(), this.bgRenderer = new Cr(), this.tutorialArrowRenderer = new Ar(), this.enemyShapeRenderer = new J(a), this.coreDeathEffectRenderer = new Yr(), this.smasherRenderer = new Jr(), this.pulpocrataRenderer = new Xe(), this.configManager = a;
3478
+ this.canvas = e, this.ctx = e.getContext("2d"), this.themeManager = t, this.indicatorRenderer = new Sr(), this.bgRenderer = new Cr(), this.tutorialArrowRenderer = new Ar(), this.enemyShapeRenderer = new J(a), this.coreDeathEffectRenderer = new Yr(), this.smasherRenderer = new Jr(), this.pulpocrataRenderer = new Xe(), this.configManager = a;
3439
3479
  }
3440
- drawings = new Sr(this);
3480
+ drawings = new br(this);
3441
3481
  renderCorePortrait(e) {
3442
3482
  this.drawings.renderCorePortrait(e);
3443
3483
  }
@@ -6963,195 +7003,315 @@ const ia = {
6963
7003
  objectiveChallengeFirstSurgeTitle: "EL NÚCLEO HACE UNA COSA",
6964
7004
  objectiveChallengeFirstSurgeDescription: "Una run de la sopa: llega al nivel 3 sin cambiar las reglas.",
6965
7005
  objectiveChallengeFirstSurgeRule: "Usa El Lanzador y sobrevive hasta el nivel 3.",
7006
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7007
+ objectiveChallengeExcaliburDescription: "Usa The Smasher, conserva la única espada roja y derrota al boss.",
7008
+ objectiveChallengeExcaliburRule: "La espada roja sobrevive al soltarla; los Mononreuronal no se pueden controlar.",
6966
7009
  objectiveChallengeSoupNoFeetTitle: "LA SOPA NO TIENE PIES",
6967
7010
  objectiveChallengeSoupNoFeetDescription: "La sopa insiste en moverse. Llega al nivel 4 con El Lanzador.",
6968
7011
  objectiveChallengeSoupNoFeetRule: "Mantén El Lanzador y llega al nivel 4.",
6969
7012
  objectiveChallengeNotButtonTitle: "NO TOQUES ESE BOTÓN",
6970
7013
  objectiveChallengeNotButtonDescription: "La costra empieza a hablar. Llega al nivel 5 sin rerolls.",
6971
7014
  objectiveChallengeNotButtonRule: "Entra en La Costra y sobrevive hasta el nivel 5.",
6972
- objectiveChallengeNoRerolls: "Sin rerolls: las decisiones se quedan pegadas."
7015
+ objectiveChallengeNoRerolls: "Sin rerolls: las decisiones se quedan pegadas.",
7016
+ objectiveChallengeFailed: "DESAFÍO PERDIDO",
7017
+ objectiveChallengeFailedDescription: "La espada alcanzó al Núcleo. La run ha terminado.",
7018
+ tutorialExcaliburStep1Text: "DESENVAINA LA ESPADA, MI REY",
7019
+ tutorialExcaliburStep2Text: "ARRÁSTRALA CONTRA EL ENEMIGO. QUE LA SANGRE SEA DE OTRO.",
7020
+ tutorialExcaliburWarning: "NO LA SUELTES HACIA EL NÚCLEO: HASTA UNA ESPADA INVENCIBLE PUEDE TENER MALAS MANERAS."
6973
7021
  },
6974
7022
  en: {
6975
7023
  challengeModeHint: "ENTRIES TO PRESET RUNS",
6976
7024
  objectiveChallengeFirstSurgeTitle: "THE CORE DOES A THING",
6977
7025
  objectiveChallengeFirstSurgeDescription: "A Soup run: reach level 3 without changing the rules.",
6978
7026
  objectiveChallengeFirstSurgeRule: "Use The Launcher and survive to level 3.",
7027
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7028
+ objectiveChallengeExcaliburDescription: "Use The Smasher, keep the single red sword alive, and defeat the boss.",
7029
+ objectiveChallengeExcaliburRule: "The red sword survives release; Mononreuronal enemies cannot be controlled.",
6979
7030
  objectiveChallengeSoupNoFeetTitle: "THE SOUP HAS NO FEET",
6980
7031
  objectiveChallengeSoupNoFeetDescription: "The soup insists on moving. Reach level 4 with The Launcher.",
6981
7032
  objectiveChallengeSoupNoFeetRule: "Keep The Launcher and reach level 4.",
6982
7033
  objectiveChallengeNotButtonTitle: "DO NOT TOUCH THAT BUTTON",
6983
7034
  objectiveChallengeNotButtonDescription: "The Scab starts talking. Reach level 5 without rerolls.",
6984
7035
  objectiveChallengeNotButtonRule: "Enter The Scab and survive to level 5.",
6985
- objectiveChallengeNoRerolls: "No rerolls: decisions stay stuck."
7036
+ objectiveChallengeNoRerolls: "No rerolls: decisions stay stuck.",
7037
+ objectiveChallengeFailed: "CHALLENGE LOST",
7038
+ objectiveChallengeFailedDescription: "The sword reached the Core. The run is over.",
7039
+ tutorialExcaliburStep1Text: "DRAW THE SWORD, MY KING",
7040
+ tutorialExcaliburStep2Text: "DRAG IT INTO THE ENEMY. LET SOMEONE ELSE BLEED.",
7041
+ tutorialExcaliburWarning: "DO NOT RELEASE IT TOWARD THE CORE: EVEN AN INVINCIBLE SWORD CAN HAVE BAD MANNERS."
6986
7042
  },
6987
7043
  fr: {
6988
7044
  challengeModeHint: "ENTRÉES VERS DES RUNS PRÉRÉGLÉES",
6989
7045
  objectiveChallengeFirstSurgeTitle: "LE NOYAU FAIT UN TRUC",
6990
7046
  objectiveChallengeFirstSurgeDescription: "Une run de la Soupe : atteignez le niveau 3 sans changer les règles.",
6991
7047
  objectiveChallengeFirstSurgeRule: "Utilisez le Lanceur et survivez jusqu'au niveau 3.",
7048
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7049
+ objectiveChallengeExcaliburDescription: "Utilisez The Smasher, gardez l'unique épée rouge en vie et battez le boss.",
7050
+ objectiveChallengeExcaliburRule: "L'épée rouge survit lorsqu'elle est relâchée ; les Mononreuronal ne peuvent pas être contrôlés.",
6992
7051
  objectiveChallengeSoupNoFeetTitle: "LA SOUPE N'A PAS DE PIEDS",
6993
7052
  objectiveChallengeSoupNoFeetDescription: "La Soupe insiste pour bouger. Atteignez le niveau 4 avec le Lanceur.",
6994
7053
  objectiveChallengeSoupNoFeetRule: "Gardez le Lanceur et atteignez le niveau 4.",
6995
7054
  objectiveChallengeNotButtonTitle: "NE TOUCHEZ PAS CE BOUTON",
6996
7055
  objectiveChallengeNotButtonDescription: "La Croûte commence à parler. Atteignez le niveau 5 sans relance.",
6997
7056
  objectiveChallengeNotButtonRule: "Entrez dans la Croûte et survivez jusqu'au niveau 5.",
6998
- objectiveChallengeNoRerolls: "Sans relance : les décisions restent collées."
7057
+ objectiveChallengeNoRerolls: "Sans relance : les décisions restent collées.",
7058
+ objectiveChallengeFailed: "DÉFI PERDU",
7059
+ objectiveChallengeFailedDescription: "L'épée a atteint le Noyau. La run est terminée.",
7060
+ tutorialExcaliburStep1Text: "DÉGAINE L'ÉPÉE, MON ROI",
7061
+ tutorialExcaliburStep2Text: "TRAÎNE-LA CONTRE L'ENNEMI. QUE QUELQU'UN D'AUTRE SAIGNE.",
7062
+ tutorialExcaliburWarning: "NE LA RELÂCHE PAS VERS LE NOYAU : MÊME UNE ÉPÉE INVINCIBLE PEUT MANQUER DE MANIÈRES."
6999
7063
  },
7000
7064
  de: {
7001
7065
  challengeModeHint: "EINTRÄGE FÜR VORGEFERTIGTE RUNS",
7002
7066
  objectiveChallengeFirstSurgeTitle: "DER KERN MACHT EIN DING",
7003
7067
  objectiveChallengeFirstSurgeDescription: "Ein Suppen-Run: Erreiche Level 3 ohne die Regeln zu ändern.",
7004
7068
  objectiveChallengeFirstSurgeRule: "Nutze den Werfer und überlebe bis Level 3.",
7069
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7070
+ objectiveChallengeExcaliburDescription: "Nutze The Smasher, halte das einzige rote Schwert am Leben und besiege den Boss.",
7071
+ objectiveChallengeExcaliburRule: "Das rote Schwert überlebt das Loslassen; Mononreuronal können nicht kontrolliert werden.",
7005
7072
  objectiveChallengeSoupNoFeetTitle: "DIE SUPPE HAT KEINE FÜSSE",
7006
7073
  objectiveChallengeSoupNoFeetDescription: "Die Suppe will sich bewegen. Erreiche Level 4 mit dem Werfer.",
7007
7074
  objectiveChallengeSoupNoFeetRule: "Behalte den Werfer und erreiche Level 4.",
7008
7075
  objectiveChallengeNotButtonTitle: "DRÜCK DIESEN KNOPF NICHT",
7009
7076
  objectiveChallengeNotButtonDescription: "Die Kruste beginnt zu sprechen. Erreiche Level 5 ohne Neuwürfe.",
7010
7077
  objectiveChallengeNotButtonRule: "Betritt die Kruste und überlebe bis Level 5.",
7011
- objectiveChallengeNoRerolls: "Keine Neuwürfe: Entscheidungen kleben fest."
7078
+ objectiveChallengeNoRerolls: "Keine Neuwürfe: Entscheidungen kleben fest.",
7079
+ objectiveChallengeFailed: "HERAUSFORDERUNG VERLOREN",
7080
+ objectiveChallengeFailedDescription: "Das Schwert hat den Kern erreicht. Der Lauf ist vorbei.",
7081
+ tutorialExcaliburStep1Text: "ZIEH DAS SCHWERT, MEIN KÖNIG",
7082
+ tutorialExcaliburStep2Text: "ZIEH ES IN DEN FEIND. JEMAND ANDERES SOLL BLUTEN.",
7083
+ tutorialExcaliburWarning: "LASS ES NICHT AUF DEN KERN LOS: AUCH EIN UNVERWUNDBARES SCHWERT KANN SCHLECHTE MANIEREN HABEN."
7012
7084
  },
7013
7085
  it: {
7014
7086
  challengeModeHint: "INGRESSI A RUN PREIMPOSTATE",
7015
7087
  objectiveChallengeFirstSurgeTitle: "IL NUCLEO FA UNA COSA",
7016
7088
  objectiveChallengeFirstSurgeDescription: "Una run della Zuppa: raggiungi il livello 3 senza cambiare le regole.",
7017
7089
  objectiveChallengeFirstSurgeRule: "Usa il Lanciatore e sopravvivi fino al livello 3.",
7090
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7091
+ objectiveChallengeExcaliburDescription: "Usa The Smasher, mantieni viva l'unica spada rossa e sconfiggi il boss.",
7092
+ objectiveChallengeExcaliburRule: "La spada rossa sopravvive quando viene lasciata; i Mononreuronal non possono essere controllati.",
7018
7093
  objectiveChallengeSoupNoFeetTitle: "LA ZUPPA NON HA PIEDI",
7019
7094
  objectiveChallengeSoupNoFeetDescription: "La Zuppa insiste per muoversi. Raggiungi il livello 4 col Lanciatore.",
7020
7095
  objectiveChallengeSoupNoFeetRule: "Mantieni il Lanciatore e raggiungi il livello 4.",
7021
7096
  objectiveChallengeNotButtonTitle: "NON TOCCARE QUEL PULSANTE",
7022
7097
  objectiveChallengeNotButtonDescription: "La Crosta inizia a parlare. Raggiungi il livello 5 senza reroll.",
7023
7098
  objectiveChallengeNotButtonRule: "Entra nella Crosta e sopravvivi fino al livello 5.",
7024
- objectiveChallengeNoRerolls: "Niente reroll: le decisioni restano incollate."
7099
+ objectiveChallengeNoRerolls: "Niente reroll: le decisioni restano incollate.",
7100
+ objectiveChallengeFailed: "SFIDA PERSA",
7101
+ objectiveChallengeFailedDescription: "La spada ha raggiunto il Nucleo. La run è finita.",
7102
+ tutorialExcaliburStep1Text: "SFODERA LA SPADA, MIO RE",
7103
+ tutorialExcaliburStep2Text: "TRASCINALA CONTRO IL NEMICO. CHE SANGUINI QUALCUN ALTRO.",
7104
+ tutorialExcaliburWarning: "NON LASCIARLA ANDARE VERSO IL NUCLEO: ANCHE UNA SPADA INVINCIBILE PUÒ AVERE CATTIVE MANIERE."
7025
7105
  },
7026
7106
  pt: {
7027
7107
  challengeModeHint: "ENTRADAS PARA RUNS PRÉ-CONFIGURADAS",
7028
7108
  objectiveChallengeFirstSurgeTitle: "O NÚCLEO FAZ UMA COISA",
7029
7109
  objectiveChallengeFirstSurgeDescription: "Uma run da Sopa: chega ao nível 3 sem mudar as regras.",
7030
7110
  objectiveChallengeFirstSurgeRule: "Usa o Lançador e sobrevive até ao nível 3.",
7111
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7112
+ objectiveChallengeExcaliburDescription: "Usa The Smasher, mantém viva a única espada vermelha e derrota o boss.",
7113
+ objectiveChallengeExcaliburRule: "A espada vermelha sobrevive quando é largada; os Mononreuronal não podem ser controlados.",
7031
7114
  objectiveChallengeSoupNoFeetTitle: "A SOPA NÃO TEM PÉS",
7032
7115
  objectiveChallengeSoupNoFeetDescription: "A sopa insiste em mexer-se. Chega ao nível 4 com o Lançador.",
7033
7116
  objectiveChallengeSoupNoFeetRule: "Mantém o Lançador e chega ao nível 4.",
7034
7117
  objectiveChallengeNotButtonTitle: "NÃO TOQUES NESSE BOTÃO",
7035
7118
  objectiveChallengeNotButtonDescription: "A Crosta começa a falar. Chega ao nível 5 sem rerolls.",
7036
7119
  objectiveChallengeNotButtonRule: "Entra na Crosta e sobrevive até ao nível 5.",
7037
- objectiveChallengeNoRerolls: "Sem rerolls: as decisões ficam coladas."
7120
+ objectiveChallengeNoRerolls: "Sem rerolls: as decisões ficam coladas.",
7121
+ objectiveChallengeFailed: "DESAFIO PERDIDO",
7122
+ objectiveChallengeFailedDescription: "A espada alcançou o Núcleo. A run terminou.",
7123
+ tutorialExcaliburStep1Text: "DESEMBANHA A ESPADA, MEU REI",
7124
+ tutorialExcaliburStep2Text: "ARRASTA-A CONTRA O INIMIGO. QUE OUTRO SANGRE.",
7125
+ tutorialExcaliburWarning: "NÃO A SOLTES CONTRA O NÚCLEO: ATÉ UMA ESPADA INVENCÍVEL PODE TER MÁS MANEIRAS."
7038
7126
  },
7039
7127
  nl: {
7040
7128
  challengeModeHint: "TOEGANG TOT VOORAF INGESTELDE RUNS",
7041
7129
  objectiveChallengeFirstSurgeTitle: "DE KERN DOET EEN DING",
7042
7130
  objectiveChallengeFirstSurgeDescription: "Een Soep-run: bereik niveau 3 zonder de regels te veranderen.",
7043
7131
  objectiveChallengeFirstSurgeRule: "Gebruik de Werper en overleef tot niveau 3.",
7132
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7133
+ objectiveChallengeExcaliburDescription: "Gebruik The Smasher, houd het enige rode zwaard in leven en versla de baas.",
7134
+ objectiveChallengeExcaliburRule: "Het rode zwaard overleeft het loslaten; Mononreuronal kunnen niet worden bestuurd.",
7044
7135
  objectiveChallengeSoupNoFeetTitle: "DE SOEP HEEFT GEEN VOETEN",
7045
7136
  objectiveChallengeSoupNoFeetDescription: "De soep wil blijven bewegen. Bereik niveau 4 met de Werper.",
7046
7137
  objectiveChallengeSoupNoFeetRule: "Behoud de Werper en bereik niveau 4.",
7047
7138
  objectiveChallengeNotButtonTitle: "RAAK DIE KNOP NIET AAN",
7048
7139
  objectiveChallengeNotButtonDescription: "De Korst begint te praten. Bereik niveau 5 zonder rerolls.",
7049
7140
  objectiveChallengeNotButtonRule: "Ga de Korst in en overleef tot niveau 5.",
7050
- objectiveChallengeNoRerolls: "Geen rerolls: beslissingen blijven plakken."
7141
+ objectiveChallengeNoRerolls: "Geen rerolls: beslissingen blijven plakken.",
7142
+ objectiveChallengeFailed: "UITDAGING VERLOREN",
7143
+ objectiveChallengeFailedDescription: "Het zwaard bereikte de Kern. De run is voorbij.",
7144
+ tutorialExcaliburStep1Text: "TREK HET ZWAARD, MIJN KONING",
7145
+ tutorialExcaliburStep2Text: "SLEEP HET TEGEN DE VIJAND. LAAT IEMAND ANDERS BLOEDEN.",
7146
+ tutorialExcaliburWarning: "LAAT HET NIET NAAR DE KERN LOS: OOK EEN ONAANTASTBAAR ZWAARD KAN SLECHTE MANIEREN HEBBEN."
7051
7147
  },
7052
7148
  sv: {
7053
7149
  challengeModeHint: "INGÅNGAR TILL FÖRINSTÄLLDA RUNS",
7054
7150
  objectiveChallengeFirstSurgeTitle: "KÄRNAN GÖR EN SAK",
7055
7151
  objectiveChallengeFirstSurgeDescription: "En Soppa-run: nå nivå 3 utan att ändra reglerna.",
7056
7152
  objectiveChallengeFirstSurgeRule: "Använd Kastaren och överlev till nivå 3.",
7153
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7154
+ objectiveChallengeExcaliburDescription: "Använd The Smasher, håll det enda röda svärdet vid liv och besegra bossen.",
7155
+ objectiveChallengeExcaliburRule: "Det röda svärdet överlever när det släpps; Mononreuronal kan inte kontrolleras.",
7057
7156
  objectiveChallengeSoupNoFeetTitle: "SOPPAN HAR INGA FÖTTER",
7058
7157
  objectiveChallengeSoupNoFeetDescription: "Soppan vill röra sig. Nå nivå 4 med Kastaren.",
7059
7158
  objectiveChallengeSoupNoFeetRule: "Behåll Kastaren och nå nivå 4.",
7060
7159
  objectiveChallengeNotButtonTitle: "RÖR INTE DEN DÄR KNAPPEN",
7061
7160
  objectiveChallengeNotButtonDescription: "Skorpan börjar prata. Nå nivå 5 utan omkastningar.",
7062
7161
  objectiveChallengeNotButtonRule: "Gå in i Skorpan och överlev till nivå 5.",
7063
- objectiveChallengeNoRerolls: "Inga omkastningar: besluten sitter fast."
7162
+ objectiveChallengeNoRerolls: "Inga omkastningar: besluten sitter fast.",
7163
+ objectiveChallengeFailed: "UTMANING FÖRLORAD",
7164
+ objectiveChallengeFailedDescription: "Svärdet nådde kärnan. Runen är över.",
7165
+ tutorialExcaliburStep1Text: "DRA SVÄRDET, MIN KUNG",
7166
+ tutorialExcaliburStep2Text: "DRA DET MOT FIENDEN. LÅT NÅGON ANNAN BLÖDA.",
7167
+ tutorialExcaliburWarning: "SLÄPP DET INTE MOT KÄRNAN: ÄVEN ETT ODÖDLIGT SVÄRD KAN HA DÅLIGA MANÉR."
7064
7168
  },
7065
7169
  pl: {
7066
7170
  challengeModeHint: "WEJŚCIA DO USTAWIONYCH RUN",
7067
7171
  objectiveChallengeFirstSurgeTitle: "RDZEŃ ROBI RZECZ",
7068
7172
  objectiveChallengeFirstSurgeDescription: "Run z Zupą: osiągnij poziom 3 bez zmiany zasad.",
7069
7173
  objectiveChallengeFirstSurgeRule: "Użyj Wyrzutni i przetrwaj do poziomu 3.",
7174
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7175
+ objectiveChallengeExcaliburDescription: "Użyj The Smashera, utrzymaj przy życiu jedyny czerwony miecz i pokonaj bossa.",
7176
+ objectiveChallengeExcaliburRule: "Czerwony miecz przetrwa puszczenie; Mononreuronal nie można kontrolować.",
7070
7177
  objectiveChallengeSoupNoFeetTitle: "ZUPA NIE MA STÓP",
7071
7178
  objectiveChallengeSoupNoFeetDescription: "Zupa chce się ruszać. Osiągnij poziom 4 z Wyrzutnią.",
7072
7179
  objectiveChallengeSoupNoFeetRule: "Zachowaj Wyrzutnię i osiągnij poziom 4.",
7073
7180
  objectiveChallengeNotButtonTitle: "NIE DOTYKAJ TEGO PRZYCISKU",
7074
7181
  objectiveChallengeNotButtonDescription: "Strup zaczyna mówić. Osiągnij poziom 5 bez przerzutów.",
7075
7182
  objectiveChallengeNotButtonRule: "Wejdź w Strup i przetrwaj do poziomu 5.",
7076
- objectiveChallengeNoRerolls: "Bez przerzutów: decyzje przyklejają się."
7183
+ objectiveChallengeNoRerolls: "Bez przerzutów: decyzje przyklejają się.",
7184
+ objectiveChallengeFailed: "WYZWANIE PRZEGRANE",
7185
+ objectiveChallengeFailedDescription: "Miecz dotarł do Rdzenia. Run dobiegł końca.",
7186
+ tutorialExcaliburStep1Text: "DOBĄDŹ MIECZA, MÓJ KRÓLU",
7187
+ tutorialExcaliburStep2Text: "PRZECIĄGNIJ GO NA WROGA. NIECH KTOŚ INNY KRWAWI.",
7188
+ tutorialExcaliburWarning: "NIE WYPUSZCZAJ GO NA RDZEŃ: NAWET NIEZWYKŁY MIECZ MOŻE BYĆ NIEGRZECZNY."
7077
7189
  },
7078
7190
  id: {
7079
7191
  challengeModeHint: "MASUKAN KE RUN YANG SUDAH DIATUR",
7080
7192
  objectiveChallengeFirstSurgeTitle: "INTI MELAKUKAN SESUATU",
7081
7193
  objectiveChallengeFirstSurgeDescription: "Run Sup: capai level 3 tanpa mengubah aturan.",
7082
7194
  objectiveChallengeFirstSurgeRule: "Gunakan Peluncur dan bertahan sampai level 3.",
7195
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7196
+ objectiveChallengeExcaliburDescription: "Gunakan The Smasher, pertahankan satu-satunya pedang merah dan kalahkan bos.",
7197
+ objectiveChallengeExcaliburRule: "Pedang merah tetap hidup setelah dilepas; Mononreuronal tidak dapat dikendalikan.",
7083
7198
  objectiveChallengeSoupNoFeetTitle: "SUP TIDAK PUNYA KAKI",
7084
7199
  objectiveChallengeSoupNoFeetDescription: "Sup ingin terus bergerak. Capai level 4 dengan Peluncur.",
7085
7200
  objectiveChallengeSoupNoFeetRule: "Pertahankan Peluncur dan capai level 4.",
7086
7201
  objectiveChallengeNotButtonTitle: "JANGAN SENTUH TOMBOL ITU",
7087
7202
  objectiveChallengeNotButtonDescription: "Kerak mulai berbicara. Capai level 5 tanpa reroll.",
7088
7203
  objectiveChallengeNotButtonRule: "Masuk ke Kerak dan bertahan sampai level 5.",
7089
- objectiveChallengeNoRerolls: "Tanpa reroll: keputusan tetap menempel."
7204
+ objectiveChallengeNoRerolls: "Tanpa reroll: keputusan tetap menempel.",
7205
+ objectiveChallengeFailed: "TANTANGAN GAGAL",
7206
+ objectiveChallengeFailedDescription: "Pedang mencapai Inti. Run berakhir.",
7207
+ tutorialExcaliburStep1Text: "CABUT PEDANGNYA, RAJAKU",
7208
+ tutorialExcaliburStep2Text: "SERET KE MUSUH. BIARKAN YANG LAIN BERDARAH.",
7209
+ tutorialExcaliburWarning: "JANGAN LEPASKAN KE ARAH INTI: PEDANG TAK TERKALAHKAN PUN BISA TAK SOPAN."
7090
7210
  },
7091
7211
  tr: {
7092
7212
  challengeModeHint: "ÖNCEDEN AYARLANMIŞ KOŞULARA GİRİŞ",
7093
7213
  objectiveChallengeFirstSurgeTitle: "ÇEKİRDEK BİR ŞEY YAPIYOR",
7094
7214
  objectiveChallengeFirstSurgeDescription: "Bir Çorba koşusu: kuralları değiştirmeden 3. seviyeye ulaş.",
7095
7215
  objectiveChallengeFirstSurgeRule: "Fırlatıcıyı kullan ve 3. seviyeye kadar hayatta kal.",
7216
+ objectiveChallengeExcaliburTitle: "EXCALIBUR",
7217
+ objectiveChallengeExcaliburDescription: "The Smasher'ı kullan, tek kırmızı kılıcı hayatta tut ve boss'u yen.",
7218
+ objectiveChallengeExcaliburRule: "Kırmızı kılıç bırakıldığında hayatta kalır; Mononreuronal kontrol edilemez.",
7096
7219
  objectiveChallengeSoupNoFeetTitle: "ÇORBANIN AYAĞI YOK",
7097
7220
  objectiveChallengeSoupNoFeetDescription: "Çorba hareket etmekte ısrar ediyor. Fırlatıcı ile 4. seviyeye ulaş.",
7098
7221
  objectiveChallengeSoupNoFeetRule: "Fırlatıcıyı koru ve 4. seviyeye ulaş.",
7099
7222
  objectiveChallengeNotButtonTitle: "O DÜĞMEYE DOKUNMA",
7100
7223
  objectiveChallengeNotButtonDescription: "Kabuk konuşmaya başlıyor. Yenilemeden 5. seviyeye ulaş.",
7101
7224
  objectiveChallengeNotButtonRule: "Kabuğa gir ve 5. seviyeye kadar hayatta kal.",
7102
- objectiveChallengeNoRerolls: "Yenileme yok: kararlar yapışıp kalır."
7225
+ objectiveChallengeNoRerolls: "Yenileme yok: kararlar yapışıp kalır.",
7226
+ objectiveChallengeFailed: "MEYDAN OKUMA KAYBEDİLDİ",
7227
+ objectiveChallengeFailedDescription: "Kırmızı kılıç Çekirdeğe ulaştı. Koşu sona erdi.",
7228
+ tutorialExcaliburStep1Text: "KILIÇI ÇEK, KRALIM",
7229
+ tutorialExcaliburStep2Text: "ONU DÜŞMANA SÜRÜKLE. BAŞKASI KANASIN.",
7230
+ tutorialExcaliburWarning: "ONU ÇEKİRDEĞE DOĞRU BIRAKMA: ÖLÜMSÜZ BİR KILIÇ BİLE KÖTÜ TERBİYELİ OLABİLİR."
7103
7231
  },
7104
7232
  ru: {
7105
7233
  challengeModeHint: "ВХОДЫ В ЗАРАНЕЕ НАСТРОЕННЫЕ ЗАБЕГИ",
7106
7234
  objectiveChallengeFirstSurgeTitle: "ЯДРО ДЕЛАЕТ ШТУКУ",
7107
7235
  objectiveChallengeFirstSurgeDescription: "Забег по Супу: достигните 3 уровня, не меняя правил.",
7108
7236
  objectiveChallengeFirstSurgeRule: "Используйте Метателя и доживите до 3 уровня.",
7237
+ objectiveChallengeExcaliburTitle: "ЭКСКАЛИБУР",
7238
+ objectiveChallengeExcaliburDescription: "Используйте The Smasher, сохраните единственный красный меч и победите босса.",
7239
+ objectiveChallengeExcaliburRule: "Красный меч выживает после отпускания; Мононреуроналов нельзя контролировать.",
7109
7240
  objectiveChallengeSoupNoFeetTitle: "У СУПА НЕТ НОГ",
7110
7241
  objectiveChallengeSoupNoFeetDescription: "Суп настаивает, что он движется. Достигните 4 уровня с Метателем.",
7111
7242
  objectiveChallengeSoupNoFeetRule: "Сохраните Метателя и достигните 4 уровня.",
7112
7243
  objectiveChallengeNotButtonTitle: "НЕ ТРОГАЙТЕ ЭТУ КНОПКУ",
7113
7244
  objectiveChallengeNotButtonDescription: "Струп начинает говорить. Достигните 5 уровня без перебросов.",
7114
7245
  objectiveChallengeNotButtonRule: "Войдите в Струп и доживите до 5 уровня.",
7115
- objectiveChallengeNoRerolls: "Без перебросов: решения приклеились."
7246
+ objectiveChallengeNoRerolls: "Без перебросов: решения приклеились.",
7247
+ objectiveChallengeFailed: "ИСПЫТАНИЕ ПРОИГРАНО",
7248
+ objectiveChallengeFailedDescription: "Меч достиг Ядра. Забег окончен.",
7249
+ tutorialExcaliburStep1Text: "ВЫТАЩИ МЕЧ, МОЙ КОРОЛЬ",
7250
+ tutorialExcaliburStep2Text: "ТАЩИ ЕГО НА ВРАГА. ПУСТЬ КРОВЬ ПРОЛЬЁТСЯ У ДРУГОГО.",
7251
+ tutorialExcaliburWarning: "НЕ ОТПУСКАЙ ЕГО К ЯДРУ: ДАЖЕ НЕУЯЗВИМЫЙ МЕЧ МОЖЕТ БЫТЬ НЕВОСПИТАННЫМ."
7116
7252
  },
7117
7253
  ja: {
7118
7254
  challengeModeHint: "設定済みランへの入口",
7119
7255
  objectiveChallengeFirstSurgeTitle: "コアが何かをする",
7120
7256
  objectiveChallengeFirstSurgeDescription: "スープのラン:ルールを変えずにレベル3へ到達する。",
7121
7257
  objectiveChallengeFirstSurgeRule: "ランチャーでレベル3まで生き残る。",
7258
+ objectiveChallengeExcaliburTitle: "エクスカリバー",
7259
+ objectiveChallengeExcaliburDescription: "スマッシャーで、唯一の赤い剣を生かしたままボスを倒す。",
7260
+ objectiveChallengeExcaliburRule: "赤い剣は離しても生き残る。モノニューロナルは操作できない。",
7122
7261
  objectiveChallengeSoupNoFeetTitle: "スープに足はない",
7123
7262
  objectiveChallengeSoupNoFeetDescription: "スープは動きたがっている。ランチャーでレベル4へ。",
7124
7263
  objectiveChallengeSoupNoFeetRule: "ランチャーを維持してレベル4へ到達する。",
7125
7264
  objectiveChallengeNotButtonTitle: "そのボタンに触るな",
7126
7265
  objectiveChallengeNotButtonDescription: "かさぶたが話し始める。リロールなしでレベル5へ。",
7127
7266
  objectiveChallengeNotButtonRule: "かさぶたに入り、レベル5まで生き残る。",
7128
- objectiveChallengeNoRerolls: "リロール禁止:決断は貼りついたまま。"
7267
+ objectiveChallengeNoRerolls: "リロール禁止:決断は貼りついたまま。",
7268
+ objectiveChallengeFailed: "チャレンジ失敗",
7269
+ objectiveChallengeFailedDescription: "剣がコアに到達した。ランは終了した。",
7270
+ tutorialExcaliburStep1Text: "剣を抜け、我が王よ",
7271
+ tutorialExcaliburStep2Text: "敵へ引きずれ。血を流すのは別の者だ。",
7272
+ tutorialExcaliburWarning: "コアへ放してはいけない。不滅の剣にも礼儀は必要だ。"
7129
7273
  },
7130
7274
  ko: {
7131
7275
  challengeModeHint: "사전 설정 런으로 들어가기",
7132
7276
  objectiveChallengeFirstSurgeTitle: "코어가 뭔가를 한다",
7133
7277
  objectiveChallengeFirstSurgeDescription: "수프 런: 규칙을 바꾸지 않고 레벨 3에 도달하세요.",
7134
7278
  objectiveChallengeFirstSurgeRule: "런처를 사용해 레벨 3까지 생존하세요.",
7279
+ objectiveChallengeExcaliburTitle: "엑스칼리버",
7280
+ objectiveChallengeExcaliburDescription: "스매셔를 사용해 유일한 붉은 검을 살려 두고 보스를 물리치세요.",
7281
+ objectiveChallengeExcaliburRule: "붉은 검은 놓아도 살아남습니다. 모노뉴런은 조종할 수 없습니다.",
7135
7282
  objectiveChallengeSoupNoFeetTitle: "수프에게는 발이 없다",
7136
7283
  objectiveChallengeSoupNoFeetDescription: "수프가 움직이려 합니다. 런처로 레벨 4에 도달하세요.",
7137
7284
  objectiveChallengeSoupNoFeetRule: "런처를 유지하고 레벨 4에 도달하세요.",
7138
7285
  objectiveChallengeNotButtonTitle: "그 버튼을 누르지 마",
7139
7286
  objectiveChallengeNotButtonDescription: "딱지가 말을 시작합니다. 리롤 없이 레벨 5에 도달하세요.",
7140
7287
  objectiveChallengeNotButtonRule: "딱지에 들어가 레벨 5까지 생존하세요.",
7141
- objectiveChallengeNoRerolls: "리롤 금지: 결정이 붙어버립니다."
7288
+ objectiveChallengeNoRerolls: "리롤 금지: 결정이 붙어버립니다.",
7289
+ objectiveChallengeFailed: "도전 실패",
7290
+ objectiveChallengeFailedDescription: "검이 코어에 닿았습니다. 런이 끝났습니다.",
7291
+ tutorialExcaliburStep1Text: "검을 뽑으세요, 나의 왕이여",
7292
+ tutorialExcaliburStep2Text: "적에게 끌고 가세요. 피는 다른 자가 흘리게 하세요.",
7293
+ tutorialExcaliburWarning: "코어를 향해 놓지 마세요. 무적의 검도 예의가 필요합니다."
7142
7294
  },
7143
7295
  zh: {
7144
7296
  challengeModeHint: "进入预设挑战运行",
7145
7297
  objectiveChallengeFirstSurgeTitle: "核心在做一件事",
7146
7298
  objectiveChallengeFirstSurgeDescription: "汤之运行:不改变规则并达到3级。",
7147
7299
  objectiveChallengeFirstSurgeRule: "使用发射核心并存活到3级。",
7300
+ objectiveChallengeExcaliburTitle: "誓约之剑",
7301
+ objectiveChallengeExcaliburDescription: "使用粉碎核心,让唯一的红色剑存活并击败首领。",
7302
+ objectiveChallengeExcaliburRule: "红剑被释放后仍会存活;单神经元敌人无法被控制。",
7148
7303
  objectiveChallengeSoupNoFeetTitle: "汤没有脚",
7149
7304
  objectiveChallengeSoupNoFeetDescription: "汤坚持要移动。使用发射核心达到4级。",
7150
7305
  objectiveChallengeSoupNoFeetRule: "保留发射核心并达到4级。",
7151
7306
  objectiveChallengeNotButtonTitle: "不要碰那个按钮",
7152
7307
  objectiveChallengeNotButtonDescription: "血痂开始说话。不重掷并达到5级。",
7153
7308
  objectiveChallengeNotButtonRule: "进入血痂并存活到5级。",
7154
- objectiveChallengeNoRerolls: "禁止重掷:决定会粘住。"
7309
+ objectiveChallengeNoRerolls: "禁止重掷:决定会粘住。",
7310
+ objectiveChallengeFailed: "挑战失败",
7311
+ objectiveChallengeFailedDescription: "红剑抵达了核心。这次运行结束了。",
7312
+ tutorialExcaliburStep1Text: "拔剑吧,我的王",
7313
+ tutorialExcaliburStep2Text: "把它拖向敌人。让别人流血。",
7314
+ tutorialExcaliburWarning: "不要把它朝核心放开:即使是不死之剑,也可能不懂礼貌。"
7155
7315
  }
7156
7316
  };
7157
7317
  for (const [r, e] of Object.entries(ia))
@@ -8477,7 +8637,7 @@ const ca = ["es", "en", "fr", "de", "it", "pt", "nl", "sv", "pl", "id", "tr", "r
8477
8637
  function re(r) {
8478
8638
  return ca.includes(r);
8479
8639
  }
8480
- const Oe = {
8640
+ const Ne = {
8481
8641
  es: "ESPAÑOL (ES)",
8482
8642
  en: "ENGLISH (EN)",
8483
8643
  fr: "FRANÇAIS (FR)",
@@ -8519,9 +8679,9 @@ class la {
8519
8679
  i.className = "axon-select-wrapper";
8520
8680
  const o = this.document.createElement("select");
8521
8681
  o.className = "axon-select";
8522
- for (const s of Object.keys(Oe)) {
8682
+ for (const s of Object.keys(Ne)) {
8523
8683
  const c = this.document.createElement("option");
8524
- c.textContent = Oe[s], c.value = s, c.selected = e.language === s, o.appendChild(c);
8684
+ c.textContent = Ne[s], c.value = s, c.selected = e.language === s, o.appendChild(c);
8525
8685
  }
8526
8686
  o.addEventListener("change", () => t.onLanguageChanged(o.value));
8527
8687
  const n = this.document.createElement("span");
@@ -8654,7 +8814,7 @@ class ua {
8654
8814
  this.tutorial.isActive = !1;
8655
8815
  return;
8656
8816
  }
8657
- this.tutorial.isActive = !0, this.tutorial.showWarning = !1, a.length = 0, this.tutorial.corePosition.x = e / 2, this.tutorial.corePosition.y = t / 2, this.startMechanic(e, t, a);
8817
+ this.tutorial.isActive = !0, this.tutorial.showWarning = !1, this.tutorial.definition.primaryVariantId || (a.length = 0), this.tutorial.corePosition.x = e / 2, this.tutorial.corePosition.y = t / 2, this.startMechanic(e, t, a);
8658
8818
  }
8659
8819
  startMechanic(e, t, a) {
8660
8820
  const i = this.tutorial.definition;
@@ -8679,11 +8839,13 @@ class ua {
8679
8839
  }
8680
8840
  startSmasher(e, t, a) {
8681
8841
  const i = t / 2;
8682
- this.tutorial.initialPrimaryPos = { x: e * 0.58, y: i }, this.tutorial.initialSecondaryPos = { x: e * 0.78, y: i }, this.tutorial.repellentWaveElapsed = 0, this.tutorial.primary = this.createEnemy(this.tutorial.definition.primaryEnemyId, this.tutorial.initialPrimaryPos, this.tutorial.corePosition), this.tutorial.secondary = this.createEnemy(this.tutorial.definition.secondaryEnemyId, this.tutorial.initialSecondaryPos, this.tutorial.corePosition), this.tutorial.primary.velocity = { x: 0, y: 0 }, this.tutorial.secondary.velocity = { x: 0, y: 0 }, a.push(this.tutorial.primary, this.tutorial.secondary);
8842
+ this.tutorial.initialPrimaryPos = { x: e * 0.58, y: i }, this.tutorial.initialSecondaryPos = { x: e * 0.78, y: i }, this.tutorial.repellentWaveElapsed = 0;
8843
+ const o = this.tutorial.definition, n = o.primaryVariantId ? a.find((s) => s.active && s.variantId === o.primaryVariantId) ?? null : null;
8844
+ this.tutorial.primary = n ?? this.createEnemy(o.primaryEnemyId, this.tutorial.initialPrimaryPos, this.tutorial.corePosition, o.primaryVariantId), this.tutorial.primary.position = { ...this.tutorial.initialPrimaryPos }, this.tutorial.secondary = this.createEnemy(this.tutorial.definition.secondaryEnemyId, this.tutorial.initialSecondaryPos, this.tutorial.corePosition), this.tutorial.primary.velocity = { x: 0, y: 0 }, this.tutorial.secondary.velocity = { x: 0, y: 0 }, this.tutorial.primary.isChallengeInvulnerable = o.primaryChallengeInvulnerable === !0, a.includes(this.tutorial.primary) || a.push(this.tutorial.primary), a.includes(this.tutorial.secondary) || a.push(this.tutorial.secondary);
8683
8845
  }
8684
- createEnemy(e, t, a) {
8685
- const i = this.tutorial.factory.createEnemy(e, t, a);
8686
- return i.velocity = { x: 0, y: 0 }, i;
8846
+ createEnemy(e, t, a, i) {
8847
+ const o = this.tutorial.factory.createEnemy(e, t, a);
8848
+ return i && this.tutorial.factory.configureEnemy(o, e, { spawnPos: t, corePos: a, variantId: i }), o.velocity = { x: 0, y: 0 }, o;
8687
8849
  }
8688
8850
  isTooCloseToCore(e) {
8689
8851
  return Math.hypot(e.position.x - this.tutorial.corePosition.x, e.position.y - this.tutorial.corePosition.y) <= e.getHitRadius() + 70;
@@ -8703,11 +8865,12 @@ class ua {
8703
8865
  const { primary: t, secondary: a, primaryCore: i, secondaryCore: o } = e, n = this.tutorial.definition;
8704
8866
  this.tutorial.factory.configureEnemy(t, n.primaryEnemyId, {
8705
8867
  spawnPos: this.tutorial.initialPrimaryPos,
8706
- corePos: i
8868
+ corePos: i,
8869
+ variantId: n.primaryVariantId
8707
8870
  }), this.tutorial.factory.configureEnemy(a, n.secondaryEnemyId, {
8708
8871
  spawnPos: this.tutorial.initialSecondaryPos,
8709
8872
  corePos: o
8710
- }), t.velocity = { x: 0, y: 0 }, a.velocity = { x: 0, y: 0 };
8873
+ }), t.velocity = { x: 0, y: 0 }, a.velocity = { x: 0, y: 0 }, t.isChallengeInvulnerable = n.primaryChallengeInvulnerable === !0;
8711
8874
  }
8712
8875
  }
8713
8876
  class ha {
@@ -9122,7 +9285,7 @@ const va = () => `
9122
9285
  <circle cx="14.2" cy="12.4" r="2.2" fill="currentColor" opacity=".82"/>
9123
9286
  <circle cx="29.8" cy="21.8" r="2" fill="currentColor" opacity=".82"/>
9124
9287
  <circle cx="16.3" cy="29.4" r="1.8" fill="currentColor" opacity=".82"/>
9125
- `, Sa = () => `
9288
+ `, ba = () => `
9126
9289
  <path d="M24 5c7.8 0 14.1 4.8 14.1 11.2 0 4.5-3.2 6.9-2.1 11.3 1.3 5.1-3.5 9.5-9.6 9.5-4.4 0-6.5-2.7-10.4-2.1-5.7.8-9.7-3.8-8.5-8.7.9-3.8-1.4-6.2-.1-10.7C9 9.5 15.5 5 24 5Z" fill="currentColor" opacity=".08"/>
9127
9290
  <path d="M24 5c7.8 0 14.1 4.8 14.1 11.2 0 4.5-3.2 6.9-2.1 11.3 1.3 5.1-3.5 9.5-9.6 9.5-4.4 0-6.5-2.7-10.4-2.1-5.7.8-9.7-3.8-8.5-8.7.9-3.8-1.4-6.2-.1-10.7C9 9.5 15.5 5 24 5Z" stroke="currentColor" stroke-width="1.9" stroke-linejoin="round"/>
9128
9291
  <path d="M24 12c4.8 0 8.5 2.8 8.5 6.6 0 3.6-3.3 6.2-8.1 6.2-4.9 0-8.7-2.7-8.7-6.4 0-3.8 3.4-6.4 8.3-6.4Z" stroke="currentColor" stroke-width="1.8" opacity=".9"/>
@@ -9131,7 +9294,7 @@ const va = () => `
9131
9294
  <circle cx="10" cy="18" r="2" fill="currentColor" opacity=".75"/>
9132
9295
  <circle cx="38" cy="24" r="2" fill="currentColor" opacity=".75"/>
9133
9296
  <circle cx="14" cy="34" r="1.8" fill="currentColor" opacity=".75"/>
9134
- `, ba = () => `
9297
+ `, Sa = () => `
9135
9298
  <path d="M10 16c2.9-4.3 7-4.7 10.2-1.2 2.3 2.5 4.2 2.7 7.5.5 4.4-2.9 8.1-.3 9.4 3.9" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
9136
9299
  <path d="M10 31c2.8-4.1 6.7-4.5 10-.9 2.7 3 5.1 2.3 7.5-.2 3-3.2 6.4-2.2 9.2.2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" opacity=".8"/>
9137
9300
  <circle cx="9" cy="16" r="4" fill="currentColor" opacity=".18" stroke="currentColor" stroke-width="1.6"/>
@@ -9150,8 +9313,8 @@ const va = () => `
9150
9313
  "core-nucleus": va,
9151
9314
  "unlock-form": fa,
9152
9315
  "powerup-organ": xa,
9153
- "passive-membrane": Sa,
9154
- "synergy-synapse": ba,
9316
+ "passive-membrane": ba,
9317
+ "synergy-synapse": Sa,
9155
9318
  "area-biome": Ca,
9156
9319
  "story-memory": Aa
9157
9320
  }, Ra = () => `
@@ -9591,7 +9754,7 @@ class Da {
9591
9754
  return e === "powerup" ? this.i18n.translate("geneticTypePowerup") : e === "passive" ? this.i18n.translate("geneticTypePassive") : e === "enemy" ? this.i18n.translate("geneticTypeEnemy") : this.i18n.translate("geneticTypeCore");
9592
9755
  }
9593
9756
  }
9594
- class Oa {
9757
+ class Na {
9595
9758
  container;
9596
9759
  i18n;
9597
9760
  timeoutId = null;
@@ -9626,7 +9789,7 @@ function X(r) {
9626
9789
  <span class="axon-objective-organic-icon-filament"></span>
9627
9790
  </span>`;
9628
9791
  }
9629
- class Na {
9792
+ class Oa {
9630
9793
  i18n;
9631
9794
  objectives;
9632
9795
  kind;
@@ -9788,7 +9951,7 @@ class Na {
9788
9951
  }
9789
9952
  }
9790
9953
  }
9791
- class Ne {
9954
+ class Oe {
9792
9955
  container;
9793
9956
  i18n;
9794
9957
  objectives;
@@ -9801,7 +9964,7 @@ class Ne {
9801
9964
  this.isOpen && e.key === "Escape" && (e.preventDefault(), this.hide(), this.onClose());
9802
9965
  };
9803
9966
  constructor(e) {
9804
- this.i18n = e.i18n, this.objectives = e.objectives, this.kind = e.kind, this.onClose = e.onClose, this.onStartChallenge = e.onStartChallenge, this.renderer = new Na(e), this.container = document.createElement("section"), this.container.className = this.getOverlayClassName(), this.container.setAttribute("aria-live", "polite"), e.parent.appendChild(this.container), window.addEventListener("keydown", this.handleKeyDown), this.renderContent();
9967
+ this.i18n = e.i18n, this.objectives = e.objectives, this.kind = e.kind, this.onClose = e.onClose, this.onStartChallenge = e.onStartChallenge, this.renderer = new Oa(e), this.container = document.createElement("section"), this.container.className = this.getOverlayClassName(), this.container.setAttribute("aria-live", "polite"), e.parent.appendChild(this.container), window.addEventListener("keydown", this.handleKeyDown), this.renderContent();
9805
9968
  }
9806
9969
  show() {
9807
9970
  this.isOpen = !0, this.container.style.display = "flex", this.renderContent();
@@ -9866,7 +10029,7 @@ class La {
9866
10029
  return `
9867
10030
  <div class="axon-title-halo">
9868
10031
  <h1 class="axon-title">${this.i18n.translate("title")}</h1>
9869
- <p class="axon-version-mark">v0.36.0</p>
10032
+ <p class="axon-version-mark">v0.37.0</p>
9870
10033
  <button id="axon-start-btn" class="axon-start-button">${this.i18n.translate("startButton")}</button>
9871
10034
  ${this.renderSecondaryActions()}
9872
10035
  </div>
@@ -10110,6 +10273,7 @@ class L {
10110
10273
  canBeManipulatedByCore = !0;
10111
10274
  canBeDamagedByCore = !0;
10112
10275
  canBeKilledByCoreRepelWave = !1;
10276
+ isChallengeInvulnerable = !1;
10113
10277
  rotation = 0;
10114
10278
  color = "#ffffff";
10115
10279
  accentColor = null;
@@ -10158,10 +10322,10 @@ class L {
10158
10322
  return Math.abs(t) <= this.frontCoverageArc / 2;
10159
10323
  }
10160
10324
  triggerDissolveDeath(e = !1, t = null) {
10161
- e && (this.experienceDropPending = !0), t && (this.codexDeathSourceType = t), !this.isDying && (this.isDying = !0, this.deathType = "dissolve", this.deathTimer = 0, this.maxDeathTimer = 0.45, this.velocity = { x: 0, y: 0 });
10325
+ this.isChallengeInvulnerable || (e && (this.experienceDropPending = !0), t && (this.codexDeathSourceType = t), !this.isDying && (this.isDying = !0, this.deathType = "dissolve", this.deathTimer = 0, this.maxDeathTimer = 0.45, this.velocity = { x: 0, y: 0 }));
10162
10326
  }
10163
10327
  triggerSliceDeath(e, t = !1, a = null) {
10164
- t && (this.experienceDropPending = !0), a && (this.codexDeathSourceType = a), !this.isDying && (this.isDying = !0, this.deathType = "sliced", this.deathTimer = 0, this.maxDeathTimer = 0.35, this.sliceAngle = e, this.velocity = { x: 0, y: 0 });
10328
+ this.isChallengeInvulnerable || (t && (this.experienceDropPending = !0), a && (this.codexDeathSourceType = a), !this.isDying && (this.isDying = !0, this.deathType = "sliced", this.deathTimer = 0, this.maxDeathTimer = 0.35, this.sliceAngle = e, this.velocity = { x: 0, y: 0 }));
10165
10329
  }
10166
10330
  update(e) {
10167
10331
  this.active && (this.updateTimers(e), !(this.updateDeath(e) || this.updateLaunchDelay(e)) && (this.isGrabbed || this.isStationaryShield || (this.limitSpeed(), this.position.x += this.velocity.x * e, this.position.y += this.velocity.y * e, this.updateRotation())));
@@ -10189,7 +10353,7 @@ class L {
10189
10353
  this.resetFlags(), this.resetEffects(), this.resetVisuals();
10190
10354
  }
10191
10355
  resetFlags() {
10192
- this.active = !1, this.variantId = null, this.variantRendererId = null, this.isGrabbed = !1, this.isThrown = !1, this.wasManipulated = !1, this.isGrabbable = !0, this.canBeManipulatedByCore = !0, this.canBeDamagedByCore = !0, this.canBeKilledByCoreRepelWave = !1, this.behavior = _e, this.synergyKey = "", this.isDying = !1, this.deathType = "none", this.deathTimer = 0, this.sliceAngle = 0, this.isStationaryShield = !1, this.shieldAngle = 0, this.launchDelay = 0, this.bossLaunchPhase = "none", this.experienceDropPending = !1, this.codexDeathSourceType = null, this.psionicDeflectionCooldown = 0, this.psionicDeflectionTimer = 0;
10356
+ this.active = !1, this.variantId = null, this.variantRendererId = null, this.isGrabbed = !1, this.isThrown = !1, this.wasManipulated = !1, this.isGrabbable = !0, this.canBeManipulatedByCore = !0, this.canBeDamagedByCore = !0, this.canBeKilledByCoreRepelWave = !1, this.isChallengeInvulnerable = !1, this.behavior = _e, this.synergyKey = "", this.isDying = !1, this.deathType = "none", this.deathTimer = 0, this.sliceAngle = 0, this.isStationaryShield = !1, this.shieldAngle = 0, this.launchDelay = 0, this.bossLaunchPhase = "none", this.experienceDropPending = !1, this.codexDeathSourceType = null, this.psionicDeflectionCooldown = 0, this.psionicDeflectionTimer = 0;
10193
10357
  }
10194
10358
  resetEffects() {
10195
10359
  this.position = { x: 0, y: 0 }, this.velocity = { x: 0, y: 0 }, this.rotation = 0, this.maxSpeed = 200, this.variantPulseInterval = 0, this.variantPulseTimer = 0, this.blocksFrontImpacts = !1, this.frontCoverageArc = 0, this.frontCoverageRadiusMultiplier = 1, this.hitRadiusPadding = 0.2;
@@ -10198,11 +10362,11 @@ class L {
10198
10362
  this.accentColor = null, this.eyeProfile = "none", this.visualProfile = "default", this.variantState = {}, this.variantTrail = [], this.strategy = null;
10199
10363
  }
10200
10364
  }
10201
- const b = (r, e, t) => r?.[e] ?? t, Ee = (r, e) => r?.[e] ?? null, za = (r, e) => ({
10365
+ const S = (r, e, t) => r?.[e] ?? t, Ee = (r, e) => r?.[e] ?? null, za = (r, e) => ({
10202
10366
  ...r.behavior,
10203
10367
  ...e?.behaviorOverrides ?? {}
10204
10368
  }), Ka = (r, e) => e.synergyKey ?? e.behavior.synergyKey?.(r) ?? e.id, Fa = (r) => r.initialRotation === "random" ? Math.random() * Math.PI * 2 : 0, Ga = (r, e) => {
10205
- const t = b(e, "canBeManipulatedByCore", !0);
10369
+ const t = S(e, "canBeManipulatedByCore", !0);
10206
10370
  return {
10207
10371
  variantId: Ee(e, "id"),
10208
10372
  variantRendererId: Ee(e, "rendererId"),
@@ -10210,15 +10374,15 @@ const b = (r, e, t) => r?.[e] ?? t, Ee = (r, e) => r?.[e] ?? null, za = (r, e) =
10210
10374
  isGrabbed: !1,
10211
10375
  isThrown: !1,
10212
10376
  canBeManipulatedByCore: t,
10213
- canBeDamagedByCore: b(e, "canBeDamagedByCore", !0),
10214
- canBeKilledByCoreRepelWave: b(e, "canBeKilledByCoreRepelWave", !1),
10377
+ canBeDamagedByCore: S(e, "canBeDamagedByCore", !0),
10378
+ canBeKilledByCoreRepelWave: S(e, "canBeKilledByCoreRepelWave", !1),
10215
10379
  isGrabbable: !!r.canBeGrabbed && t,
10216
- variantPulseInterval: b(e, "pulseInterval", 0),
10380
+ variantPulseInterval: S(e, "pulseInterval", 0),
10217
10381
  variantPulseTimer: 0,
10218
- blocksFrontImpacts: b(e, "blocksFrontImpacts", !1),
10219
- frontCoverageArc: b(e, "frontCoverageArc", 0),
10220
- frontCoverageRadiusMultiplier: b(e, "frontCoverageRadiusMultiplier", 1),
10221
- visualProfile: b(e, "visualProfile", "default"),
10382
+ blocksFrontImpacts: S(e, "blocksFrontImpacts", !1),
10383
+ frontCoverageArc: S(e, "frontCoverageArc", 0),
10384
+ frontCoverageRadiusMultiplier: S(e, "frontCoverageRadiusMultiplier", 1),
10385
+ visualProfile: S(e, "visualProfile", "default"),
10222
10386
  variantState: {},
10223
10387
  variantTrail: []
10224
10388
  };
@@ -10245,7 +10409,7 @@ class Va {
10245
10409
  Object.assign(e, Ga(t, a));
10246
10410
  }
10247
10411
  applyDefinition(e, t, a) {
10248
- e.radius = t.radius, e.hitRadiusPadding = t.hitRadiusPadding ?? 0.2, e.color = b(a, "color", t.color), e.accentColor = Ee(a, "accentColor"), e.eyeProfile = b(a, "eyeProfile", t.eyeProfile), e.strategy = t.impactStrategyFactory?.() ?? null, e.behavior = za(t, a), e.synergyKey = Ka(e, t), e.maxSpeed = t.maxSpeed * b(a, "maxSpeedMultiplier", 1), e.rotation = Fa(t);
10412
+ e.radius = t.radius, e.hitRadiusPadding = t.hitRadiusPadding ?? 0.2, e.color = S(a, "color", t.color), e.accentColor = Ee(a, "accentColor"), e.eyeProfile = S(a, "eyeProfile", t.eyeProfile), e.strategy = t.impactStrategyFactory?.() ?? null, e.behavior = za(t, a), e.synergyKey = Ka(e, t), e.maxSpeed = t.maxSpeed * S(a, "maxSpeedMultiplier", 1), e.rotation = Fa(t);
10249
10413
  }
10250
10414
  applyMotion(e, t, a, i) {
10251
10415
  e.position = { ...t };
@@ -10424,14 +10588,14 @@ const Ie = {
10424
10588
  shockwaveMergeDistance: 120
10425
10589
  }
10426
10590
  };
10427
- class N {
10591
+ class O {
10428
10592
  static instance;
10429
10593
  config;
10430
10594
  constructor() {
10431
10595
  this.config = JSON.parse(JSON.stringify(je));
10432
10596
  }
10433
10597
  static getInstance() {
10434
- return N.instance || (N.instance = new N()), N.instance;
10598
+ return O.instance || (O.instance = new O()), O.instance;
10435
10599
  }
10436
10600
  getConfig() {
10437
10601
  return this.config;
@@ -10453,7 +10617,7 @@ class N {
10453
10617
  Object.assign(this.config.core, e.core), Object.assign(this.config.toxicPool, e.toxicPool), Object.assign(this.config.gravityVortex, e.gravityVortex), Object.assign(this.config.shield, e.shield), Object.assign(this.config.cluster, e.cluster), Object.assign(this.config.piercer, e.piercer), Object.assign(this.config.magnet, e.magnet), Object.assign(this.config.experience, e.experience), Object.assign(this.config.ecosoma, e.ecosoma), Object.assign(this.config.effectAggregation, e.effectAggregation);
10454
10618
  }
10455
10619
  }
10456
- class S {
10620
+ class b {
10457
10621
  constructor(e) {
10458
10622
  this.kind = e;
10459
10623
  }
@@ -10493,7 +10657,7 @@ class qa {
10493
10657
  constructor(e, t) {
10494
10658
  this.configPort = e, this.defaultPowerUps = t(e);
10495
10659
  }
10496
- registry = new S("power-up");
10660
+ registry = new b("power-up");
10497
10661
  defaultsRegistered = !1;
10498
10662
  defaultPowerUps;
10499
10663
  getDefinitions() {
@@ -11176,7 +11340,7 @@ const ve = (r) => [
11176
11340
  v(r, 18, "core-skin", { titleKey: "coreCommonSkinTitle", descriptionKey: "coreCommonSkinDescription", skinId: "core-expertise-1" }),
11177
11341
  v(r, 19, "core-skin", { titleKey: "coreCommonSkinTitle", descriptionKey: "coreCommonSkinDescription", skinId: "core-expertise-2" }),
11178
11342
  v(r, 20, "core-skin", { titleKey: "coreCommonSkinTitle", descriptionKey: "coreCommonSkinDescription", skinId: "core-expertise-3" })
11179
- ], Si = () => [
11343
+ ], bi = () => [
11180
11344
  ...ve("core-smasher"),
11181
11345
  v("core-smasher", 2, "smasher-extra-impact", { titleKey: "smasherExtraImpactTitle", descriptionKey: "smasherExtraImpactDescription" }),
11182
11346
  v("core-smasher", 3, "smasher-creature-power", { titleKey: "smasherCreaturePowerTitle", descriptionKey: "smasherCreaturePowerDescription", effectValue: 1 }),
@@ -11210,7 +11374,7 @@ function ie(r) {
11210
11374
  skillPointRewards: { ...xi }
11211
11375
  };
11212
11376
  }
11213
- const bi = [
11377
+ const Si = [
11214
11378
  ie({
11215
11379
  id: "core-origin",
11216
11380
  titleKey: "coreLauncherTitle",
@@ -11243,7 +11407,7 @@ const bi = [
11243
11407
  accent: "core",
11244
11408
  iconId: "core-nucleus",
11245
11409
  unlockCost: 20,
11246
- wisdomTrack: Si()
11410
+ wisdomTrack: bi()
11247
11411
  })
11248
11412
  ], tt = "axon_surge_core_roster", V = 2;
11249
11413
  function Ci(r, e) {
@@ -11328,9 +11492,9 @@ function Di(r, e) {
11328
11492
  if (r.has(e.id)) throw new Error(`Duplicate core definition: ${e.id}`);
11329
11493
  if (e.unlockCost < 0 || !Number.isFinite(e.unlockCost))
11330
11494
  throw new Error(`Invalid core unlock cost: ${e.id}`);
11331
- Oi(e);
11495
+ Ni(e);
11332
11496
  }
11333
- function Oi(r) {
11497
+ function Ni(r) {
11334
11498
  let e = -1;
11335
11499
  for (const t of r.wisdomTrack) {
11336
11500
  if (t.requiredSkillPoints < 0 || t.requiredSkillPoints <= e)
@@ -11338,7 +11502,7 @@ function Oi(r) {
11338
11502
  e = t.requiredSkillPoints;
11339
11503
  }
11340
11504
  }
11341
- function Ni(r) {
11505
+ function Oi(r) {
11342
11506
  return { ...r, defeatedBossIds: [...r.defeatedBossIds] };
11343
11507
  }
11344
11508
  function Li(r) {
@@ -11425,7 +11589,7 @@ class k {
11425
11589
  }
11426
11590
  finishRun(e) {
11427
11591
  if (!this.runCoreId) return null;
11428
- const t = this.runCoreId, a = this.requireDefinition(t), i = this.profiles.get(t) ?? k.createEmptyProfile(), o = this.getRunState(), n = Ni(o), s = i.wisdomLevel, c = Math.max(0, Math.floor(this.runSkillPoints)), l = i.skillPoints + c, d = this.getWisdomLevel(a, l), u = a.wisdomTrack.slice(s, d), h = {
11592
+ const t = this.runCoreId, a = this.requireDefinition(t), i = this.profiles.get(t) ?? k.createEmptyProfile(), o = this.getRunState(), n = Oi(o), s = i.wisdomLevel, c = Math.max(0, Math.floor(this.runSkillPoints)), l = i.skillPoints + c, d = this.getWisdomLevel(a, l), u = a.wisdomTrack.slice(s, d), h = {
11429
11593
  coreId: t,
11430
11594
  runLevel: Math.max(1, Math.floor(e)),
11431
11595
  skillPointsGained: c,
@@ -12302,7 +12466,7 @@ function fo(r, e, t, a) {
12302
12466
  function xo(r, e, t) {
12303
12467
  return r === "level-reached" ? Math.max(e, t) : e + t;
12304
12468
  }
12305
- function So(r, e) {
12469
+ function bo(r, e) {
12306
12470
  const t = [
12307
12471
  r.enemyId === void 0 || r.enemyId === e.enemyId,
12308
12472
  r.event !== "enemy-defeated" && r.variantId === void 0 || r.variantId === e.variantId,
@@ -12312,7 +12476,7 @@ function So(r, e) {
12312
12476
  ];
12313
12477
  return r.event === e.type && t.every(Boolean);
12314
12478
  }
12315
- class bo extends vo {
12479
+ class So extends vo {
12316
12480
  constructor(e, t, a = null) {
12317
12481
  super(e, t, a);
12318
12482
  }
@@ -12345,7 +12509,7 @@ class bo extends vo {
12345
12509
  }
12346
12510
  updateDefinition(e, t) {
12347
12511
  const a = this.progress.get(e.kind), i = a.get(e.id) ?? x();
12348
- if (i.completed || !So(e.condition, t)) return;
12512
+ if (i.completed || !bo(e.condition, t)) return;
12349
12513
  const o = Math.max(1, Math.floor(t.amount ?? 1)), n = xo(e.condition.event, i.progress, o), s = n >= e.condition.target;
12350
12514
  a.set(e.id, {
12351
12515
  ...i,
@@ -12361,22 +12525,30 @@ const Co = {
12361
12525
  missions: [],
12362
12526
  challenges: [
12363
12527
  {
12364
- id: "challenge-first-surge",
12528
+ id: "challenge-excalibur",
12365
12529
  kind: "challenge",
12366
- titleKey: "objectiveChallengeFirstSurgeTitle",
12367
- descriptionKey: "objectiveChallengeFirstSurgeDescription",
12368
- condition: { event: "level-reached", target: 3, coreId: "core-origin" },
12369
- rules: ["objectiveChallengeFirstSurgeRule", "objectiveChallengeNoRerolls"],
12370
- preset: { areaId: "area-caldo", disableRerolls: !0 },
12371
- requiredCoreId: "core-origin",
12372
- rewards: [
12373
- {
12374
- id: "challenge-first-surge-powerup",
12375
- type: "powerup",
12376
- unlockId: "vampirism_unlock",
12377
- titleKey: "pu_vampirism_unlock_title"
12530
+ titleKey: "objectiveChallengeExcaliburTitle",
12531
+ descriptionKey: "objectiveChallengeExcaliburDescription",
12532
+ condition: { event: "boss-defeated", target: 1, bossId: "boss-caldo-01", coreId: "core-smasher" },
12533
+ rules: ["objectiveChallengeExcaliburRule"],
12534
+ preset: {
12535
+ areaId: "area-caldo",
12536
+ disableRerolls: !1,
12537
+ tutorialId: "tutorial-challenge-excalibur",
12538
+ preserveSmasherCapturedEnemy: !0,
12539
+ spawnProfile: {
12540
+ variantByEnemyId: {
12541
+ piercer: "piercer-mononreuronal",
12542
+ spore: "spore-mononreuronal",
12543
+ cluster: "cluster-mononreuronal",
12544
+ parasite: "parasite-mononreuronal",
12545
+ heavy: "heavy-mononreuronal"
12546
+ },
12547
+ initialEnemies: [{ enemyId: "piercer", variantId: "piercer-blood-sword", invulnerable: !0 }]
12378
12548
  }
12379
- ]
12549
+ },
12550
+ requiredCoreId: "core-smasher",
12551
+ rewards: []
12380
12552
  }
12381
12553
  ],
12382
12554
  achievements: [
@@ -12751,16 +12923,16 @@ class To {
12751
12923
  }
12752
12924
  }
12753
12925
  class Po {
12754
- enemies = new S("enemy");
12755
- variants = new S("enemy variant");
12756
- powerUps = new S("power-up");
12757
- synergies = new S("synergy");
12758
- areas = new S("area");
12759
- bosses = new S("boss");
12760
- bossRewards = new S("boss reward");
12761
- cores = new S("core");
12762
- spawnerPatterns = new S("spawner pattern");
12763
- tutorials = new S("tutorial");
12926
+ enemies = new b("enemy");
12927
+ variants = new b("enemy variant");
12928
+ powerUps = new b("power-up");
12929
+ synergies = new b("synergy");
12930
+ areas = new b("area");
12931
+ bosses = new b("boss");
12932
+ bossRewards = new b("boss reward");
12933
+ cores = new b("core");
12934
+ spawnerPatterns = new b("spawner pattern");
12935
+ tutorials = new b("tutorial");
12764
12936
  constructor(e = {}) {
12765
12937
  this.registerCatalog(e);
12766
12938
  }
@@ -12828,6 +13000,9 @@ class Po {
12828
13000
  getTutorialForCore(e) {
12829
13001
  return this.tutorials.values().find((t) => t.coreId === e);
12830
13002
  }
13003
+ getTutorial(e) {
13004
+ return this.tutorials.get(e);
13005
+ }
12831
13006
  }
12832
13007
  class wo {
12833
13008
  execute(e) {
@@ -13012,12 +13187,12 @@ class Mo {
13012
13187
  class Do {
13013
13188
  execute(e) {
13014
13189
  const { targetEnemy: t } = e;
13015
- t.experienceDropPending = !0, t.active = !1, e.shockwaves.push(Oo(t));
13016
- for (let a = 0; a < 30; a++) e.particles.push(No(t));
13190
+ t.experienceDropPending = !0, t.active = !1, e.shockwaves.push(No(t));
13191
+ for (let a = 0; a < 30; a++) e.particles.push(Oo(t));
13017
13192
  e.floatingTexts.push(Lo(t));
13018
13193
  }
13019
13194
  }
13020
- function Oo(r) {
13195
+ function No(r) {
13021
13196
  return {
13022
13197
  id: Math.random().toString(),
13023
13198
  position: { ...r.position },
@@ -13029,7 +13204,7 @@ function Oo(r) {
13029
13204
  maxLifetime: 0.5
13030
13205
  };
13031
13206
  }
13032
- function No(r) {
13207
+ function Oo(r) {
13033
13208
  const e = Math.random() * Math.PI * 2, t = 180 + Math.random() * 320;
13034
13209
  return {
13035
13210
  id: Math.random().toString(),
@@ -13356,14 +13531,14 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13356
13531
  lifetime: 0,
13357
13532
  maxLifetime: 0.35
13358
13533
  });
13359
- }, Sn = (r, e) => {
13534
+ }, bn = (r, e) => {
13360
13535
  if (r.variantPulseInterval <= 0 || (r.variantPulseTimer -= e.dt, r.variantPulseTimer > 0)) return;
13361
13536
  r.variantPulseTimer += r.variantPulseInterval;
13362
13537
  const t = e.config.gravityVortex.baseRadius, a = e.config.gravityVortex.basePullForce * 0.12;
13363
13538
  for (const i of e.enemies)
13364
13539
  vn(r, i) && fn(r, i, t, a);
13365
13540
  xn(r, e, t);
13366
- }, bn = (r) => {
13541
+ }, Sn = (r) => {
13367
13542
  r.enemy.triggerDissolveDeath(!0);
13368
13543
  const e = r.config.gravityVortex;
13369
13544
  r.vortices.push({
@@ -13376,8 +13551,8 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13376
13551
  isRepulsive: !0
13377
13552
  });
13378
13553
  }, Cn = {
13379
- onUpdate: Sn,
13380
- onChainReaction: bn
13554
+ onUpdate: bn,
13555
+ onChainReaction: Sn
13381
13556
  }, An = (r) => {
13382
13557
  r.enemy.triggerSliceDeath(r.angle, !0);
13383
13558
  }, In = (r, e) => e !== "toxic-pool" && e !== "gravity-vortex", Rn = {
@@ -13432,7 +13607,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13432
13607
  autoDeflectFromCore: !0,
13433
13608
  synergyKey: (r) => r.color
13434
13609
  }
13435
- }, O = (r) => Rn[r] ?? {
13610
+ }, N = (r) => Rn[r] ?? {
13436
13611
  rendererId: "circle",
13437
13612
  rotatesWithVelocity: !0,
13438
13613
  canBeChainReactionTarget: !0,
@@ -13448,7 +13623,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13448
13623
  canBeGrabbed: !0,
13449
13624
  initialRotation: "none",
13450
13625
  impactStrategyFactory: () => new Do(),
13451
- behavior: O("piercer"),
13626
+ behavior: N("piercer"),
13452
13627
  spawnWeight: 0.2,
13453
13628
  ambientSpawn: !0
13454
13629
  },
@@ -13462,7 +13637,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13462
13637
  canBeGrabbed: !0,
13463
13638
  initialRotation: "none",
13464
13639
  impactStrategyFactory: () => new _o(),
13465
- behavior: O("spore"),
13640
+ behavior: N("spore"),
13466
13641
  spawnWeight: 0.2,
13467
13642
  ambientSpawn: !0
13468
13643
  },
@@ -13476,7 +13651,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13476
13651
  canBeGrabbed: !0,
13477
13652
  initialRotation: "none",
13478
13653
  impactStrategyFactory: () => new wo(),
13479
- behavior: O("cluster"),
13654
+ behavior: N("cluster"),
13480
13655
  spawnWeight: 0.2,
13481
13656
  ambientSpawn: !0
13482
13657
  },
@@ -13490,7 +13665,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13490
13665
  canBeGrabbed: !0,
13491
13666
  initialRotation: "none",
13492
13667
  impactStrategyFactory: () => new ko(),
13493
- behavior: O("parasite"),
13668
+ behavior: N("parasite"),
13494
13669
  spawnWeight: 0.2,
13495
13670
  ambientSpawn: !0
13496
13671
  },
@@ -13504,7 +13679,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13504
13679
  canBeGrabbed: !0,
13505
13680
  initialRotation: "random",
13506
13681
  impactStrategyFactory: () => new Mo(),
13507
- behavior: O("heavy"),
13682
+ behavior: N("heavy"),
13508
13683
  spawnWeight: 0.2,
13509
13684
  ambientSpawn: !0,
13510
13685
  requiredUnlockId: "heavy-shield"
@@ -13518,7 +13693,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13518
13693
  eyeProfile: "none",
13519
13694
  canBeGrabbed: !1,
13520
13695
  initialRotation: "none",
13521
- behavior: O("micro"),
13696
+ behavior: N("micro"),
13522
13697
  spawnWeight: 0,
13523
13698
  ambientSpawn: !1
13524
13699
  }
@@ -13577,6 +13752,18 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13577
13752
  step1TextKey: "tutorialSmasherStep1Text",
13578
13753
  step2TextKey: "tutorialSmasherStep2Text",
13579
13754
  warningTextKey: "tutorialSmasherWarning"
13755
+ },
13756
+ {
13757
+ id: "tutorial-challenge-excalibur",
13758
+ coreId: "core-smasher",
13759
+ mechanic: "smasher",
13760
+ primaryEnemyId: "piercer",
13761
+ primaryVariantId: "piercer-blood-sword",
13762
+ primaryChallengeInvulnerable: !0,
13763
+ secondaryEnemyId: "spore",
13764
+ step1TextKey: "tutorialExcaliburStep1Text",
13765
+ step2TextKey: "tutorialExcaliburStep2Text",
13766
+ warningTextKey: "tutorialExcaliburWarning"
13580
13767
  }
13581
13768
  ], kn = ["piercer", "spore", "cluster", "parasite", "heavy"], Mn = kn.map((r) => ({
13582
13769
  id: `${r}-mononreuronal`,
@@ -13632,7 +13819,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13632
13819
  canBeDamagedByCore: !0,
13633
13820
  canBeKilledByCoreRepelWave: !1
13634
13821
  }
13635
- ], On = [
13822
+ ], Nn = [
13636
13823
  {
13637
13824
  id: "spore-camuflaespora",
13638
13825
  baseEnemyId: "spore",
@@ -13652,7 +13839,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13652
13839
  canBeDamagedByCore: !0,
13653
13840
  canBeKilledByCoreRepelWave: !1
13654
13841
  }
13655
- ], Nn = [
13842
+ ], On = [
13656
13843
  {
13657
13844
  id: "cluster-orbital",
13658
13845
  baseEnemyId: "cluster",
@@ -13693,7 +13880,7 @@ const zo = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13693
13880
  }
13694
13881
  ], xe = new Po({
13695
13882
  enemies: Tn,
13696
- variants: [...Mn, ...Dn, ...On, ...Nn, ...Pn, ...Ln],
13883
+ variants: [...Mn, ...Dn, ...Nn, ...On, ...Pn, ...Ln],
13697
13884
  areas: [
13698
13885
  {
13699
13886
  id: "area-caldo",
@@ -14452,10 +14639,17 @@ class ps {
14452
14639
  timeout = null;
14453
14640
  titleKey = null;
14454
14641
  descriptionKey = null;
14642
+ eyebrowKey = "objectiveAchievementToast";
14455
14643
  constructor(e, t) {
14456
14644
  this.i18n = t, this.container = document.createElement("aside"), this.container.className = "axon-objective-toast", this.container.setAttribute("role", "status"), this.container.setAttribute("aria-live", "polite"), this.container.style.display = "none", e.appendChild(this.container);
14457
14645
  }
14458
14646
  show(e, t) {
14647
+ this.eyebrowKey = "objectiveAchievementToast", this.showInternal(e, t);
14648
+ }
14649
+ showChallengeFailed(e) {
14650
+ this.eyebrowKey = "objectiveChallengeFailed", this.showInternal(e, "objectiveChallengeFailedDescription");
14651
+ }
14652
+ showInternal(e, t) {
14459
14653
  this.titleKey = e, this.descriptionKey = t, this.render(), this.container.style.display = "block", this.timeout !== null && window.clearTimeout(this.timeout), this.timeout = window.setTimeout(() => {
14460
14654
  this.container.style.display = "none", this.timeout = null;
14461
14655
  }, 4200);
@@ -14470,7 +14664,7 @@ class ps {
14470
14664
  !this.titleKey || !this.descriptionKey || (this.container.innerHTML = `
14471
14665
  ${X("achievement")}
14472
14666
  <div class="axon-objective-toast-copy">
14473
- <p>${this.i18n.translate("objectiveAchievementToast")}</p>
14667
+ <p>${this.i18n.translate(this.eyebrowKey)}</p>
14474
14668
  <strong>${this.i18n.translate(this.titleKey)}</strong>
14475
14669
  <span>${this.i18n.translate(this.descriptionKey)}</span>
14476
14670
  </div>
@@ -14512,11 +14706,11 @@ function gs(r) {
14512
14706
  });
14513
14707
  }
14514
14708
  function ys(r, e) {
14515
- Es(r), vs(r, e), fs(r), xs(r), Ss(r), bs(r), Cs(r), As(r), ms(r), Is(r), _a(r), Rs(r), Ba(r);
14709
+ Es(r), vs(r, e), fs(r), xs(r), bs(r), Ss(r), Cs(r), As(r), ms(r), Is(r), _a(r), Rs(r), Ba(r);
14516
14710
  }
14517
14711
  function Es(r) {
14518
14712
  const e = Ei();
14519
- r.configManager = new N(), r.content = xe, r.corePreview = new qe(0, 0, r.configManager.getConfig().core), r.powerUpRegistry = new qa(r.configManager, gi), r.geneticMemory = new W(yi, new T(e)), r.coreRoster = new k(bi, r.geneticMemory, e), r.codex = new Gi(Ji, e), r.missionGenerator = new ro(r.codex), r.bossCodex = new K(ao, e), r.objectives = new bo(Co, e, (t) => r.applyObjectiveReward(t)), r.areaDirector = new Ao(xe), r.bossEncounter = new To(st());
14713
+ r.configManager = new O(), r.content = xe, r.corePreview = new qe(0, 0, r.configManager.getConfig().core), r.powerUpRegistry = new qa(r.configManager, gi), r.geneticMemory = new W(yi, new T(e)), r.coreRoster = new k(Si, r.geneticMemory, e), r.codex = new Gi(Ji, e), r.missionGenerator = new ro(r.codex), r.bossCodex = new K(ao, e), r.objectives = new So(Co, e, (t) => r.applyObjectiveReward(t)), r.areaDirector = new Ao(xe), r.bossEncounter = new To(st());
14520
14714
  }
14521
14715
  function vs(r, e) {
14522
14716
  r.container = e.root, r.container.classList.add("axon-game-root"), r.i18n = new Ha(e.language), r.themeManager = new cr(e.theme, r.container), r.platform = e.platform || new Ua(), r.canvas = document.createElement("canvas"), r.canvas.className = "axon-canvas", r.container.appendChild(r.canvas), r.resizeCanvas(), window.addEventListener("resize", () => r.resizeCanvas());
@@ -14541,12 +14735,12 @@ function xs(r) {
14541
14735
  }
14542
14736
  });
14543
14737
  }
14544
- function Ss(r) {
14738
+ function bs(r) {
14545
14739
  r.coreInteraction = new xt(r.inputManager, r.core), r.interactiveTutorial = new pa(r.entityFactory, new Ae(), null, Qe()), r.tutorialOverlay = new ma(r.container, r.i18n, r.interactiveTutorial), r.hud = new ga(r.container, () => {
14546
14740
  r.isPaused = !0, r.settingsModal.show();
14547
14741
  }), r.hud.show();
14548
14742
  }
14549
- function bs(r) {
14743
+ function Ss(r) {
14550
14744
  r.progressBar = new ya((e) => {
14551
14745
  r.waveDirector.wave = e, r.triggerLevelUp(e);
14552
14746
  }), r.performanceAudit = new Ea(r.container, r.debugPerformanceEnabled, r.i18n);
@@ -14585,10 +14779,10 @@ function As(r) {
14585
14779
  }
14586
14780
  }), r.geneticMemoryOverlay = new Da(r.container, r.i18n, r.geneticMemory, () => {
14587
14781
  r.geneticMemoryOverlay.hide(), r.showStartMenu();
14588
- }), r.codexToast = new Oa(r.container, r.i18n);
14782
+ }), r.codexToast = new Na(r.container, r.i18n);
14589
14783
  }
14590
14784
  function Is(r) {
14591
- r.challengesOverlay = new Ne({
14785
+ r.challengesOverlay = new Oe({
14592
14786
  parent: r.container,
14593
14787
  i18n: r.i18n,
14594
14788
  objectives: r.objectives,
@@ -14599,7 +14793,7 @@ function Is(r) {
14599
14793
  },
14600
14794
  onStartChallenge: (e) => r.startChallenge(e),
14601
14795
  getSelectedCoreId: () => r.coreRoster.getSelectedCoreId()
14602
- }), r.achievementsOverlay = new Ne({
14796
+ }), r.achievementsOverlay = new Oe({
14603
14797
  parent: r.container,
14604
14798
  i18n: r.i18n,
14605
14799
  objectives: r.objectives,
@@ -14621,15 +14815,25 @@ function Rs(r) {
14621
14815
  }), r.unsubscribeCoreRoster = r.coreRoster.subscribe(() => {
14622
14816
  r.syncSelectedCorePreview(), r.startMenu.renderContent();
14623
14817
  }), r.unsubscribeObjectives = r.objectives.subscribe((e) => {
14624
- if (r.startMenu.renderContent(), r.missionsDrawer.render(), r.challengesOverlay.renderContent(), r.achievementsOverlay.renderContent(), e.type === "completed" && e.kind === "achievement") {
14625
- const t = r.objectives.getSnapshot("achievement", e.id);
14626
- r.objectiveToast.show(t.titleKey, t.descriptionKey);
14627
- }
14628
- e.kind === "mission" && e.type === "claimed" && r.refreshGeneratedMission(!0);
14818
+ Ts(r), Ps(r, e);
14629
14819
  });
14630
14820
  }
14821
+ function Ts(r) {
14822
+ r.startMenu.renderContent(), r.missionsDrawer.render(), r.challengesOverlay.renderContent(), r.achievementsOverlay.renderContent();
14823
+ }
14824
+ function Ps(r, e) {
14825
+ if (e.type === "completed" && e.kind === "achievement") {
14826
+ const t = r.objectives.getSnapshot("achievement", e.id);
14827
+ r.objectiveToast.show(t.titleKey, t.descriptionKey);
14828
+ }
14829
+ if (e.type === "challenge-failed" && e.kind === "challenge") {
14830
+ const t = r.objectives.getSnapshot("challenge", e.id);
14831
+ r.objectiveToast.showChallengeFailed(t.titleKey);
14832
+ }
14833
+ e.kind === "mission" && e.type === "claimed" && r.refreshGeneratedMission(!0);
14834
+ }
14631
14835
  const Ve = 0.25, Q = 1.8;
14632
- class Ts {
14836
+ class ws {
14633
14837
  container;
14634
14838
  canvas;
14635
14839
  i18n;
@@ -14769,22 +14973,22 @@ class Ts {
14769
14973
  ys(this, e);
14770
14974
  }
14771
14975
  }
14772
- function Ps(r, e) {
14976
+ function ks(r, e) {
14773
14977
  r.i18n.setLanguage(e), r.onLanguageChanged(e);
14774
14978
  }
14775
- function ws(r, e) {
14979
+ function Ms(r, e) {
14776
14980
  r.themeManager.setTheme(e);
14777
14981
  }
14778
- function ks(r) {
14982
+ function Ds(r) {
14779
14983
  return r.i18n.getLanguage();
14780
14984
  }
14781
- function Ms(r) {
14985
+ function Ns(r) {
14782
14986
  return r.themeManager.getTheme();
14783
14987
  }
14784
- function Ds(r, e) {
14988
+ function Os(r, e) {
14785
14989
  r.startMenu.renderContent(), r.tutorialOverlay.updateLanguage(), r.coreRosterOverlay.updateLanguage(), r.geneticMemoryOverlay.updateLanguage(), r.coreRunSummaryOverlay.updateLanguage(), r.codexOverlay.updateLanguage(), r.codexToast.updateLanguage(), r.missionsDrawer.updateLanguage(), r.challengesOverlay.updateLanguage(), r.achievementsOverlay.updateLanguage(), r.objectiveToast.updateLanguage();
14786
14990
  }
14787
- function Os(r) {
14991
+ function Ls(r) {
14788
14992
  r.ambientEnemies = [];
14789
14993
  for (let e = 0; e < 16; e++) {
14790
14994
  const t = r.content.enemies.values().filter((c) => c.ambientSpawn && (!c.requiredUnlockId || r.geneticMemory.isUnlocked(c.requiredUnlockId))).map((c) => c.id);
@@ -14799,15 +15003,15 @@ function Os(r) {
14799
15003
  r.ambientEnemies.push(s);
14800
15004
  }
14801
15005
  }
14802
- function Ns(r) {
15006
+ function _s(r) {
14803
15007
  const e = r.coreRoster.getSelectedCore();
14804
15008
  r.core.setMechanic(e.mechanic), r.coreInteraction.setMechanic(e.mechanic);
14805
15009
  }
14806
- function Ls(r) {
15010
+ function js(r) {
14807
15011
  const e = r.container.clientWidth || window.innerWidth, t = r.container.clientHeight || window.innerHeight, a = 1100, i = 750, o = e / Math.max(1, t);
14808
15012
  o < 1 ? (r.canvas.width = a, r.canvas.height = Math.round(a / o)) : e < 1e3 || t < i ? (r.canvas.height = i, r.canvas.width = Math.round(i * o)) : (r.canvas.width = e, r.canvas.height = t), r.core && (r.core.position = { x: r.canvas.width / 2, y: r.canvas.height / 2 });
14809
15013
  }
14810
- class _s {
15014
+ class Bs {
14811
15015
  origin;
14812
15016
  position;
14813
15017
  previousPosition;
@@ -14841,7 +15045,7 @@ class _s {
14841
15045
  return this.origin;
14842
15046
  }
14843
15047
  }
14844
- const js = {
15048
+ const Hs = {
14845
15049
  "toxic-radius": (r) => {
14846
15050
  const e = r.getConfig().toxicPool;
14847
15051
  r.updateConfig({
@@ -14875,11 +15079,11 @@ const js = {
14875
15079
  r.addCoreRing(1);
14876
15080
  }
14877
15081
  };
14878
- function Bs(r, e) {
15082
+ function Us(r, e) {
14879
15083
  for (const t of r.getActivePassiveEffectIds())
14880
- js[t](e);
15084
+ Hs[t](e);
14881
15085
  }
14882
- const Hs = {
15086
+ const zs = {
14883
15087
  "core-life-ring": (r) => r.addCoreRing(1),
14884
15088
  "core-protection": (r, e) => {
14885
15089
  const t = e.effectValue ?? 120, a = r.getConfig().core;
@@ -14920,49 +15124,49 @@ const Hs = {
14920
15124
  "core-skin": () => {
14921
15125
  }
14922
15126
  };
14923
- function Us(r, e) {
15127
+ function Ks(r, e) {
14924
15128
  for (const t of r.getActiveWisdomEffects())
14925
- t.effectId && Hs[t.effectId](e, t);
15129
+ t.effectId && zs[t.effectId](e, t);
14926
15130
  }
14927
- function zs(r) {
14928
- Ks(r), Fs(r);
14929
- const e = Vs(r);
14930
- Zs(r, e);
15131
+ function Fs(r) {
15132
+ Gs(r), Vs(r);
15133
+ const e = qs(r);
15134
+ Xs(r, e);
14931
15135
  }
14932
- function Ks(r) {
15136
+ function Gs(r) {
14933
15137
  r.eventBus.on("onCoreDamaged", () => {
14934
15138
  r.settingsModal.isHapticsEnabled() && r.platform.haptics.notification("error");
14935
15139
  });
14936
15140
  }
14937
- function Fs(r) {
15141
+ function Vs(r) {
14938
15142
  r.eventBus.on("onGameOver", () => {
14939
- r.isDeathSequenceActive || (r.objectives.cancelActiveChallenge(), r.challengeRunId = null, r.pendingCoreRunSummary = r.coreRoster.finishRun(r.progressBar.getLevel()), Gs(r), r.clearTransientRunEntities(), r.bossCatalyst = null, r.resetBossExposureBurst(), r.bossEncounter.reset(), r.areaDirector.reset(), r.waveDirector.setArea(r.areaDirector.getArea()), r.isLevelUpActive = !1, r.tutorialOverlay.hide(), r.juice.triggerFlash(1), r.juice.triggerScreenShake({ x: 0, y: 1 }, 32));
15143
+ r.isDeathSequenceActive || (r.objectives.cancelActiveChallenge(), r.challengeRunId = null, r.pendingCoreRunSummary = r.coreRoster.finishRun(r.progressBar.getLevel()), Ws(r), r.clearTransientRunEntities(), r.bossCatalyst = null, r.resetBossExposureBurst(), r.bossEncounter.reset(), r.areaDirector.reset(), r.waveDirector.setArea(r.areaDirector.getArea()), r.isLevelUpActive = !1, r.tutorialOverlay.hide(), r.juice.triggerFlash(1), r.juice.triggerScreenShake({ x: 0, y: 1 }, 32));
14940
15144
  });
14941
15145
  }
14942
- function Gs(r) {
15146
+ function Ws(r) {
14943
15147
  r.isRunning = !1, r.isPaused = !1, r.isDeathSequenceActive = !0, r.deathSequenceElapsed = 0;
14944
15148
  }
14945
- function Vs(r) {
15149
+ function qs(r) {
14946
15150
  return {
14947
- pointerDown: (e = !1) => Ws(r, e),
14948
- pointerUp: () => Ys(r)
15151
+ pointerDown: (e = !1) => $s(r, e),
15152
+ pointerUp: () => Js(r)
14949
15153
  };
14950
15154
  }
14951
- function Ws(r, e) {
15155
+ function $s(r, e) {
14952
15156
  if (!r.isRunning || r.isPaused || r.isLevelUpActive) return;
14953
15157
  const t = r.coreInteraction.pointerDown(r.enemies, e);
14954
- qs(r, t), $s(r, t, e), t && r.settingsModal.isHapticsEnabled() && r.platform.haptics.impact("light");
15158
+ Ys(r, t), Zs(r, t, e), t && r.settingsModal.isHapticsEnabled() && r.platform.haptics.impact("light");
14955
15159
  }
14956
- function qs(r, e) {
15160
+ function Ys(r, e) {
14957
15161
  !e?.enemy || e.mechanic !== "launcher" && e.mechanic !== "smasher" || (r.codex.recordControlled(e.enemy.type), r.coreRoster.recordSkillEvent("controlled"), r.objectives.record({
14958
15162
  type: "enemy-controlled",
14959
15163
  enemyId: e.enemy.type,
14960
15164
  coreId: r.coreRoster.getSelectedCoreId()
14961
15165
  }));
14962
15166
  }
14963
- function $s(r, e, t) {
15167
+ function Zs(r, e, t) {
14964
15168
  e?.mechanic !== "repellent" || !e.waveOrigin || r.repelProjectiles.push(
14965
- new _s({
15169
+ new Bs({
14966
15170
  origin: r.core.position,
14967
15171
  target: e.waveOrigin,
14968
15172
  color: r.core.getColorHex(),
@@ -14971,12 +15175,12 @@ function $s(r, e, t) {
14971
15175
  })
14972
15176
  );
14973
15177
  }
14974
- function Ys(r) {
15178
+ function Js(r) {
14975
15179
  if (!r.isRunning || r.isPaused || r.isLevelUpActive) return;
14976
15180
  const e = r.coreInteraction.getMechanic(), t = r.coreInteraction.pointerUp();
14977
15181
  e === "smasher" && t && (r.pendingSmasherRelease = t), t && r.settingsModal.isHapticsEnabled() && r.platform.haptics.impact("medium");
14978
15182
  }
14979
- function Zs(r, e) {
15183
+ function Xs(r, e) {
14980
15184
  r.canvas.addEventListener("mousedown", (t) => {
14981
15185
  t.button === 0 && e.pointerDown(!1);
14982
15186
  }), r.canvas.addEventListener("mouseup", (t) => {
@@ -14985,33 +15189,40 @@ function Zs(r, e) {
14985
15189
  passive: !0
14986
15190
  }), r.canvas.addEventListener("touchend", e.pointerUp, { passive: !0 }), r.canvas.addEventListener("touchcancel", e.pointerUp, { passive: !0 });
14987
15191
  }
14988
- function Js(r) {
15192
+ function Qs(r) {
14989
15193
  r.missionsDrawer.setAvailable(!1), r.configManager.resetToDefault();
14990
15194
  const e = r.coreRoster.getSelectedCore(), t = r.challengeRunId ? r.objectives.getActiveChallenge() : void 0;
14991
- Xs(r, e, t), ec(r, e.id);
15195
+ ec(r, e, t), rc(r, e.id, t);
15196
+ }
15197
+ function ec(r, e, t) {
15198
+ r.core.setMechanic(e.mechanic), r.coreInteraction.setMechanic(e.mechanic), Us(r.geneticMemory, r.configManager), r.coreRoster.startRun(), Ks(r.coreRoster, r.configManager), r.objectives.record({ type: "run-started", coreId: e.id }), r.score.value = 0, r.combo.value = 0, r.clearTransientRunState(), r.isDeathSequenceActive = !1, r.deathSequenceElapsed = 0, r.enemies = [], r.ambientEnemies = [], r.experienceOrbs = [], r.ecosomaOrbs = [], r.bossCatalyst = null, r.resetBossExposureBurst(), r.orbitingOrbs = [], r.isLevelUpActive = !1, r.pendingLevelUps = [], r.rerollsRemaining = t?.preset?.disableRerolls ? 0 : r.getRerollLimit(), r.waveDirector.setChallengeSpawnProfile(t?.preset?.spawnProfile ?? null), tc(r, t);
14992
15199
  }
14993
- function Xs(r, e, t) {
14994
- r.core.setMechanic(e.mechanic), r.coreInteraction.setMechanic(e.mechanic), Bs(r.geneticMemory, r.configManager), r.coreRoster.startRun(), Us(r.coreRoster, r.configManager), r.objectives.record({ type: "run-started", coreId: e.id }), r.score.value = 0, r.combo.value = 0, r.clearTransientRunState(), r.isDeathSequenceActive = !1, r.deathSequenceElapsed = 0, r.enemies = [], r.ambientEnemies = [], r.experienceOrbs = [], r.ecosomaOrbs = [], r.bossCatalyst = null, r.resetBossExposureBurst(), r.orbitingOrbs = [], r.isLevelUpActive = !1, r.pendingLevelUps = [], r.rerollsRemaining = t?.preset?.disableRerolls ? 0 : r.getRerollLimit(), Qs(r, t);
15200
+ function tc(r, e) {
15201
+ r.core.reset(r.canvas.width / 2, r.canvas.height / 2), r.areaDirector.reset(e?.preset?.areaId ?? "area-caldo"), r.waveDirector.setArea(r.areaDirector.getArea()), r.enemies.push(...r.waveDirector.spawnInitialChallengeEnemies(r.canvas.width, r.canvas.height, r.core.position)), r.recordEnemyObservations(r.enemies), r.debugBossEnabled && r.areaDirector.recordKill(r.areaDirector.getKillThreshold()), r.bossEncounter.reset(), r.areaTransitionElapsed = 0, r.areaIntroElapsed = r.debugBossEnabled ? Q : 0, r.waveDirector.reset(), r.inputManager.reset(), r.hud.show(), r.hud.update(0), r.progressBar.reset(), r.isPaused = !1, r.isRunning = !0;
14995
15202
  }
14996
- function Qs(r, e) {
14997
- r.core.reset(r.canvas.width / 2, r.canvas.height / 2), r.areaDirector.reset(e?.preset?.areaId ?? "area-caldo"), r.waveDirector.setArea(r.areaDirector.getArea()), r.debugBossEnabled && r.areaDirector.recordKill(r.areaDirector.getKillThreshold()), r.bossEncounter.reset(), r.areaTransitionElapsed = 0, r.areaIntroElapsed = r.debugBossEnabled ? Q : 0, r.waveDirector.reset(), r.inputManager.reset(), r.hud.show(), r.hud.update(0), r.progressBar.reset(), r.isPaused = !1, r.isRunning = !0;
15203
+ function rc(r, e, t) {
15204
+ const a = t?.preset?.tutorialId, i = ac(r, e, a, !!t);
15205
+ r.interactiveTutorial.setDefinition(i), ic(r, a !== void 0) ? (r.interactiveTutorial.start(r.canvas.width, r.canvas.height, r.enemies), r.tutorialOverlay.show()) : (r.interactiveTutorial.isActive = !1, r.tutorialOverlay.hide());
14998
15206
  }
14999
- function ec(r, e) {
15000
- r.interactiveTutorial.setDefinition(r.content.getTutorialForCore(e) ?? null), r.interactiveTutorial.hasDefinition() && r.interactiveTutorial.isTutorialEnabled() && !r.debugBossEnabled ? (r.interactiveTutorial.start(r.canvas.width, r.canvas.height, r.enemies), r.tutorialOverlay.show()) : (r.interactiveTutorial.isActive = !1, r.tutorialOverlay.hide());
15207
+ function ac(r, e, t, a) {
15208
+ return a ? t ? r.content.getTutorial(t) ?? null : null : r.content.getTutorialForCore(e) ?? null;
15001
15209
  }
15002
- function tc(r) {
15210
+ function ic(r, e) {
15211
+ return !r.interactiveTutorial.hasDefinition() || r.debugBossEnabled ? !1 : e || r.interactiveTutorial.isTutorialEnabled();
15212
+ }
15213
+ function oc(r) {
15003
15214
  r.clearTransientRunEntities(), r.juice.reset();
15004
15215
  }
15005
- function rc(r, e) {
15216
+ function nc(r, e) {
15006
15217
  for (let t = r.repelProjectiles.length - 1; t >= 0; t--) {
15007
15218
  const a = r.repelProjectiles[t];
15008
- (!a || ac(r, a, e, t)) && r.repelProjectiles.splice(t, 1);
15219
+ (!a || sc(r, a, e, t)) && r.repelProjectiles.splice(t, 1);
15009
15220
  }
15010
15221
  }
15011
- function ac(r, e, t, a) {
15012
- return e.update(t) === !1 ? !1 : (r.isRepelProjectileBlocked(e) || (Math.hypot(e.target.x - r.core.position.x, e.target.y - r.core.position.y) <= r.core.getHitboxRadius() ? ic(r) : oc(r, e, a)), !0);
15222
+ function sc(r, e, t, a) {
15223
+ return e.update(t) === !1 ? !1 : (r.isRepelProjectileBlocked(e) || (Math.hypot(e.target.x - r.core.position.x, e.target.y - r.core.position.y) <= r.core.getHitboxRadius() ? cc(r) : lc(r, e, a)), !0);
15013
15224
  }
15014
- function ic(r) {
15225
+ function cc(r) {
15015
15226
  $e.damageCore({
15016
15227
  core: r.core,
15017
15228
  enemies: r.enemies,
@@ -15028,7 +15239,7 @@ function ic(r) {
15028
15239
  allowProtection: !1
15029
15240
  });
15030
15241
  }
15031
- function oc(r, e, t) {
15242
+ function lc(r, e, t) {
15032
15243
  const a = r.coreInteraction.resolveRepelWave(r.enemies, e.target, e.isTouch);
15033
15244
  for (const i of a)
15034
15245
  r.codex.recordControlled(i.type), r.objectives.record({
@@ -15047,12 +15258,12 @@ function oc(r, e, t) {
15047
15258
  maxLifetime: 0.34
15048
15259
  });
15049
15260
  }
15050
- function nc(r, e) {
15261
+ function dc(r, e) {
15051
15262
  const t = e.position.x - e.previousPosition.x, a = e.position.y - e.previousPosition.y, i = t * t + a * a;
15052
15263
  if (i <= 1e-4) return !1;
15053
15264
  const o = Math.atan2(-a, -t);
15054
15265
  return r.enemies.some(
15055
- (n) => sc({
15266
+ (n) => uc({
15056
15267
  enemy: n,
15057
15268
  projectile: e,
15058
15269
  movementX: t,
@@ -15062,16 +15273,16 @@ function nc(r, e) {
15062
15273
  })
15063
15274
  );
15064
15275
  }
15065
- function sc(r) {
15276
+ function uc(r) {
15066
15277
  const { enemy: e, projectile: t, movementX: a, movementY: i, segmentLengthSquared: o, approachAngle: n } = r;
15067
15278
  if (!e.active || e.isDying || e.isGrabbed || e.isThrown || !e.isFrontCoverageHit(n)) return !1;
15068
15279
  const s = e.position.x - t.previousPosition.x, c = e.position.y - t.previousPosition.y, l = Math.max(0, Math.min(1, (s * a + c * i) / o)), d = t.previousPosition.x + a * l, u = t.previousPosition.y + i * l, h = e.position.x - d, m = e.position.y - u, g = e.getFrontCoverageRadius() + t.radius;
15069
15280
  return h * h + m * m <= g * g;
15070
15281
  }
15071
- function cc(r) {
15282
+ function hc(r) {
15072
15283
  r.enemies = [], r.pools = [], r.vortices = [], r.shockwaves = [], r.repelProjectiles = [], r.pendingSmasherRelease = null, r.smasherBossImpactCooldown = 0, r.particles = [], r.floatingTexts = [], r.experienceOrbs = [], r.ecosomaOrbs = [], r.orbitingOrbs = [], r.pendingLevelUps = [], r.inputManager?.forceRelease();
15073
15284
  }
15074
- function lc(r, e) {
15285
+ function pc(r, e) {
15075
15286
  if (r.deathSequenceElapsed = Math.min(ye, r.deathSequenceElapsed + e), r.juice.update(e, r.floatingTexts, r.particles), !(r.deathSequenceElapsed < ye))
15076
15287
  if (r.isDeathSequenceActive = !1, r.clearTransientRunState(), r.initAmbientArena(), r.pendingCoreRunSummary) {
15077
15288
  const t = r.pendingCoreRunSummary;
@@ -15079,23 +15290,23 @@ function lc(r, e) {
15079
15290
  } else
15080
15291
  r.showStartMenu();
15081
15292
  }
15082
- function dc(r, e) {
15083
- if (r.performanceAudit.beginFrame(), uc(r), pc(r, e) || (r.core.update(e), r.smasherBossImpactCooldown = Math.max(0, r.smasherBossImpactCooldown - e), r.coreInteraction.updateHover(r.inputManager.pointerPosition, r.isRunning && r.inputManager.hasPointerPosition, r.inputManager.lastPointerWasTouch), mc(r, e), gc(r, e)) || (r.areaIntroElapsed = Math.min(Q, r.areaIntroElapsed + Math.max(0, e)), Ec(r, e))) return;
15084
- vc(r, e), fc(r, e);
15085
- const t = Cc(r, e);
15086
- Ac(r, e), r.spawnExperienceDrops(), r.isLevelUpActive || (r.updateExperienceOrbs(e), r.updateEcosomaOrbs(e)), r.progressBar.update(e), r.hud.update(r.combo.value), r.juice.update(e, r.floatingTexts, r.particles), r.enemies = r.enemies.filter((a) => a.active), F(r, r.enemies.length, t);
15293
+ function mc(r, e) {
15294
+ if (r.performanceAudit.beginFrame(), gc(r), Ec(r, e) || (r.core.update(e), r.smasherBossImpactCooldown = Math.max(0, r.smasherBossImpactCooldown - e), r.coreInteraction.updateHover(r.inputManager.pointerPosition, r.isRunning && r.inputManager.hasPointerPosition, r.inputManager.lastPointerWasTouch), vc(r, e), fc(r, e)) || (r.areaIntroElapsed = Math.min(Q, r.areaIntroElapsed + Math.max(0, e)), bc(r, e))) return;
15295
+ Sc(r, e), Cc(r, e);
15296
+ const t = Tc(r, e);
15297
+ wc(r, e), r.spawnExperienceDrops(), r.isLevelUpActive || (r.updateExperienceOrbs(e), r.updateEcosomaOrbs(e)), r.progressBar.update(e), r.hud.update(r.combo.value), r.juice.update(e, r.floatingTexts, r.particles), r.enemies = r.enemies.filter((a) => a.active), F(r, r.enemies.length, t);
15087
15298
  }
15088
- function uc(r) {
15089
- const e = r.isPaused ? "PAUSED" : hc(r);
15299
+ function gc(r) {
15300
+ const e = r.isPaused ? "PAUSED" : yc(r);
15090
15301
  r.performanceAudit.setState(e), r.performanceAudit.setEcosomaDropChance(r.getEcosomaDropPolicy().getChance(r.progressBar.getLevel()));
15091
15302
  }
15092
- function hc(r) {
15303
+ function yc(r) {
15093
15304
  return r.isRunning ? "GAME" : "MENU";
15094
15305
  }
15095
- function pc(r, e) {
15306
+ function Ec(r, e) {
15096
15307
  return r.areaDirector.getPhase() !== "boss" || !r.bossEncounter.isIntroPaused() ? !1 : (r.bossEncounter.update(e, r.core.position), F(r, 0), !0);
15097
15308
  }
15098
- function mc(r, e) {
15309
+ function vc(r, e) {
15099
15310
  r.isRunning && !r.isPaused && r.updateRepelProjectiles(e);
15100
15311
  }
15101
15312
  function F(r, e, t = 0) {
@@ -15108,22 +15319,22 @@ function F(r, e, t = 0) {
15108
15319
  floatingTexts: r.floatingTexts.length
15109
15320
  });
15110
15321
  }
15111
- function gc(r, e) {
15322
+ function fc(r, e) {
15112
15323
  if (r.isDeathSequenceActive)
15113
15324
  return r.updateDeathSequence(e), F(r, 0), !0;
15114
15325
  if (r.isRunning && !r.isPaused) return !1;
15115
15326
  for (const t of r.ambientEnemies)
15116
- t.update(e), yc(r, t);
15327
+ t.update(e), xc(r, t);
15117
15328
  return r.recordEnemyObservations(r.ambientEnemies), F(r, r.ambientEnemies.length), !0;
15118
15329
  }
15119
- function yc(r, e) {
15330
+ function xc(r, e) {
15120
15331
  e.position.x < -40 && (e.position.x = r.canvas.width + 40), e.position.x > r.canvas.width + 40 && (e.position.x = -40), e.position.y < -40 && (e.position.y = r.canvas.height + 40), e.position.y > r.canvas.height + 40 && (e.position.y = -40);
15121
15332
  }
15122
- function Ec(r, e) {
15333
+ function bc(r, e) {
15123
15334
  const t = r.areaDirector.getPhase();
15124
15335
  return t !== "reward" && t !== "transition" ? !1 : (t === "reward" ? r.updateBossReward(e) : r.updateAreaTransition(e), r.progressBar.update(e), r.juice.update(e, r.floatingTexts, r.particles), F(r, 0), !0);
15125
15336
  }
15126
- function vc(r, e) {
15337
+ function Sc(r, e) {
15127
15338
  const t = r.areaDirector.getPhase();
15128
15339
  if (r.interactiveTutorial.isActive) {
15129
15340
  r.interactiveTutorial.update({
@@ -15144,20 +15355,20 @@ function vc(r, e) {
15144
15355
  const a = r.waveDirector.update({ dt: e, activeEnemies: r.enemies, width: r.canvas.width, height: r.canvas.height, corePos: r.core.position });
15145
15356
  a && (r.enemies.push(a), r.recordEnemyObservation(a)), r.recordEnemyObservations(r.enemies);
15146
15357
  }
15147
- function fc(r, e) {
15358
+ function Cc(r, e) {
15148
15359
  if (!r.isLevelUpActive) return;
15149
15360
  r.inputManager.tryGrabOrb(r.orbitingOrbs);
15150
15361
  const t = r.inputManager.grabbedOrb;
15151
- !r.inputManager.isPointerDown && t && (t.isGrabbed = !1, r.inputManager.grabbedOrb = null), xc(r);
15362
+ !r.inputManager.isPointerDown && t && (t.isGrabbed = !1, r.inputManager.grabbedOrb = null), Ac(r);
15152
15363
  for (const a of r.orbitingOrbs)
15153
- a.isHovered = Math.hypot(r.inputManager.pointerPosition.x - a.position.x, r.inputManager.pointerPosition.y - a.position.y) <= a.radius * 1.5, a === t && r.inputManager.isPointerDown ? Sc(r, a) : a.update(e, r.core.position);
15364
+ a.isHovered = Math.hypot(r.inputManager.pointerPosition.x - a.position.x, r.inputManager.pointerPosition.y - a.position.y) <= a.radius * 1.5, a === t && r.inputManager.isPointerDown ? Ic(r, a) : a.update(e, r.core.position);
15154
15365
  }
15155
- function xc(r) {
15366
+ function Ac(r) {
15156
15367
  if (!r.inputManager.isPointerDown || r.inputManager.grabbedOrb || r.rerollsRemaining <= 0) return;
15157
15368
  const e = r.canvas.width / 2, t = r.canvas.height / 2 + 300;
15158
15369
  Math.hypot(r.inputManager.pointerPosition.x - e, r.inputManager.pointerPosition.y - t) <= 80 && (r.triggerReroll(), r.inputManager.consumePointerDown());
15159
15370
  }
15160
- function Sc(r, e) {
15371
+ function Ic(r, e) {
15161
15372
  e.position = { ...r.inputManager.pointerPosition };
15162
15373
  const t = r.core.position.x - e.position.x, a = r.core.position.y - e.position.y;
15163
15374
  if (!(Math.hypot(t, a) > r.core.radius + e.radius)) {
@@ -15172,11 +15383,11 @@ function Sc(r, e) {
15172
15383
  maxLifetime: 1.6,
15173
15384
  size: 26
15174
15385
  });
15175
- for (let i = 0; i < 45; i++) r.particles.push(bc(r, e.definition.color));
15386
+ for (let i = 0; i < 45; i++) r.particles.push(Rc(r, e.definition.color));
15176
15387
  r.inputManager.forceRelease(), r.orbitingOrbs = [], r.presentNextLevelUp();
15177
15388
  }
15178
15389
  }
15179
- function bc(r, e) {
15390
+ function Rc(r, e) {
15180
15391
  const t = Math.random() * Math.PI * 2, a = 200 + Math.random() * 400;
15181
15392
  return {
15182
15393
  id: Math.random().toString(),
@@ -15189,7 +15400,7 @@ function bc(r, e) {
15189
15400
  maxLifetime: 0.7
15190
15401
  };
15191
15402
  }
15192
- function Cc(r, e) {
15403
+ function Tc(r, e) {
15193
15404
  if (r.isLevelUpActive) return 0;
15194
15405
  const t = r.debugPerformanceEnabled ? performance.now() : 0;
15195
15406
  return r.physicsEngine.update({
@@ -15209,10 +15420,15 @@ function Cc(r, e) {
15209
15420
  onKill: () => r.handleEnemyKill(),
15210
15421
  smasherEnemy: r.coreInteraction.getMechanic() === "smasher" ? r.inputManager.grabbedEnemy : null,
15211
15422
  smasherRelease: r.pendingSmasherRelease,
15212
- onSmasherArmBreak: () => r.inputManager.forceRelease()
15423
+ onSmasherArmBreak: () => r.inputManager.forceRelease(),
15424
+ preserveSmasherCapturedEnemy: r.objectives.getActiveChallenge()?.preset?.preserveSmasherCapturedEnemy === !0,
15425
+ onChallengeFailure: () => Pc(r)
15213
15426
  }), r.pendingSmasherRelease = null, r.debugPerformanceEnabled ? performance.now() - t : 0;
15214
15427
  }
15215
- function Ac(r, e) {
15428
+ function Pc(r) {
15429
+ r.isChallengeRun() && (r.objectives.cancelActiveChallenge(), r.challengeRunId = null, r.isDeathSequenceActive || r.eventBus.emit("onGameOver", { score: r.score.value, wave: r.progressBar.getLevel() }));
15430
+ }
15431
+ function wc(r, e) {
15216
15432
  if (r.areaDirector.getPhase() !== "boss") return;
15217
15433
  const t = r.bossEncounter.update(e, r.core.position);
15218
15434
  if (t) {
@@ -15221,7 +15437,7 @@ function Ac(r, e) {
15221
15437
  }
15222
15438
  r.updateBossMinionReentryPaths(), r.updateBossExposureBurst(e), r.processSmasherBossImpact(), r.processBossImpacts(), r.finishBossIfDefeated();
15223
15439
  }
15224
- function Ic(r) {
15440
+ function kc(r) {
15225
15441
  r.coreRoster.recordSkillEvent("kill"), r.combo.value >= 2 && r.coreRoster.recordSkillEvent("combo", r.combo.value), r.combo.value >= 2 && r.objectives.record({
15226
15442
  type: "combo",
15227
15443
  amount: r.combo.value,
@@ -15238,7 +15454,7 @@ function Ic(r) {
15238
15454
  size: 22
15239
15455
  }));
15240
15456
  }
15241
- function Rc(r) {
15457
+ function Mc(r) {
15242
15458
  if (r.bossEncounter.getPhase() !== "inactive") return;
15243
15459
  const e = r.areaDirector.getArea().bossId;
15244
15460
  if (!e) return;
@@ -15254,20 +15470,20 @@ function Rc(r) {
15254
15470
  targetCandidates: r.waveDirector.getBossTentacleTargets()
15255
15471
  }), r.bossCodex.recordEncounter(t.id), r.bossCodex.recordPhase(t.id, 1), r.juice.triggerFlash(0.85), r.juice.triggerScreenShake({ x: 0, y: 1 }, 26);
15256
15472
  }
15257
- function Tc(r) {
15473
+ function Dc(r) {
15258
15474
  r.enemies = [], r.pools = [], r.vortices = [], r.shockwaves = [], r.experienceOrbs = [], r.inputManager.forceRelease();
15259
15475
  }
15260
- function Pc(r) {
15476
+ function Nc(r) {
15261
15477
  if (r.bossEncounter.getPhase() === "inactive") return;
15262
15478
  let e = !1;
15263
15479
  for (const t of r.enemies) {
15264
- if (!wc(t)) continue;
15480
+ if (!Oc(t)) continue;
15265
15481
  const a = r.bossEncounter.hit(t.position, t.type, r.core.position);
15266
15482
  a !== "none" && (pt(r, t.position, t.color, a), t.isThrown = !1, t.triggerDissolveDeath(!1), a === "tentacle-broken" && r.bossEncounter.getPhase() === "exposed" && (e = !0));
15267
15483
  }
15268
15484
  e && r.releaseBossExposureBurst();
15269
15485
  }
15270
- function wc(r) {
15486
+ function Oc(r) {
15271
15487
  return r.active && r.isThrown && !r.isDying;
15272
15488
  }
15273
15489
  function pt(r, e, t, a) {
@@ -15286,17 +15502,17 @@ function pt(r, e, t, a) {
15286
15502
  }
15287
15503
  a === "boss-damaged" && r.juice.triggerScreenShake({ x: 0, y: 1 }, 12), a === "defeated" && r.juice.triggerFlash(1);
15288
15504
  }
15289
- function kc(r) {
15290
- if (!Mc(r)) return;
15505
+ function Lc(r) {
15506
+ if (!_c(r)) return;
15291
15507
  const e = r.inputManager.grabbedEnemy;
15292
15508
  if (!e || !e.active || e.isDying) return;
15293
15509
  const t = r.bossEncounter.hit(e.position, e.type, r.core.position);
15294
- t !== "none" && (r.smasherBossImpactCooldown = 0.28, pt(r, e.position, e.color, t), Dc(r, e, t), Oc(r, e, t));
15510
+ t !== "none" && (r.smasherBossImpactCooldown = 0.28, pt(r, e.position, e.color, t), jc(r, e, t), Bc(r, e, t));
15295
15511
  }
15296
- function Mc(r) {
15512
+ function _c(r) {
15297
15513
  return r.coreInteraction.getMechanic() === "smasher" && r.smasherBossImpactCooldown <= 0;
15298
15514
  }
15299
- function Dc(r, e, t) {
15515
+ function jc(r, e, t) {
15300
15516
  r.juice.triggerHitstop(0.08), r.juice.triggerFlash(t === "area-impact" ? 0.25 : 0.5), r.juice.triggerScreenShake(
15301
15517
  {
15302
15518
  x: e.position.x - r.core.position.x,
@@ -15305,7 +15521,7 @@ function Dc(r, e, t) {
15305
15521
  t === "area-impact" ? 8 : 14
15306
15522
  );
15307
15523
  }
15308
- function Oc(r, e, t) {
15524
+ function Bc(r, e, t) {
15309
15525
  if (t === "tentacle-broken" && r.bossEncounter.getPhase() === "exposed" && r.releaseBossExposureBurst(), !r.core.consumeSmasherImpact()) return;
15310
15526
  r.core.startSmasherRetraction(e.position, e.color);
15311
15527
  const a = r.inputManager.releaseGrabbedEnemy();
@@ -15356,7 +15572,7 @@ class mt {
15356
15572
  }, !0;
15357
15573
  }
15358
15574
  }
15359
- class Nc {
15575
+ class Hc {
15360
15576
  id;
15361
15577
  radius = 17;
15362
15578
  interactionRadius = 132;
@@ -15392,10 +15608,10 @@ class Nc {
15392
15608
  }
15393
15609
  }
15394
15610
  }
15395
- function Lc(r, e) {
15611
+ function Uc(r, e) {
15396
15612
  return e === "area-impact" ? 290 : e === "defeated" ? 360 : 210;
15397
15613
  }
15398
- function _c(r) {
15614
+ function zc(r) {
15399
15615
  r.bossExposureBurstRemaining = 26, r.bossExposureBurstAccumulator = 0.22, r.bossExposureBurstSide = 1;
15400
15616
  const e = r.bossEncounter.getBossPosition(r.core.position);
15401
15617
  r.shockwaves.push({
@@ -15409,7 +15625,7 @@ function _c(r) {
15409
15625
  maxLifetime: 1.2
15410
15626
  }), r.juice.triggerFlash(0.75), r.juice.triggerScreenShake({ x: 0, y: 1 }, 42);
15411
15627
  }
15412
- function jc(r, e) {
15628
+ function Kc(r, e) {
15413
15629
  if (r.bossEncounter.getPhase() !== "exposed") {
15414
15630
  r.resetBossExposureBurst();
15415
15631
  return;
@@ -15425,30 +15641,30 @@ function jc(r, e) {
15425
15641
  i && (r.enemies.push(i), r.recordEnemyObservation(i)), r.bossExposureBurstRemaining -= 1;
15426
15642
  }
15427
15643
  }
15428
- function Bc(r) {
15644
+ function Fc(r) {
15429
15645
  for (const e of r.enemies)
15430
- Hc(r, e) && Kc(r, e);
15646
+ Gc(r, e) && qc(r, e);
15431
15647
  }
15432
- function Hc(r, e) {
15433
- return Uc(e) && zc(r, e);
15648
+ function Gc(r, e) {
15649
+ return Vc(e) && Wc(r, e);
15434
15650
  }
15435
- function Uc(r) {
15651
+ function Vc(r) {
15436
15652
  return r.active && r.bossLaunchPhase === "outbound" && !r.isGrabbed && !r.isThrown && !r.wasManipulated;
15437
15653
  }
15438
- function zc(r, e) {
15654
+ function Wc(r, e) {
15439
15655
  return e.position.x < -90 || e.position.x > r.canvas.width + 90 || e.position.y < -90 || e.position.y > r.canvas.height + 90;
15440
15656
  }
15441
- function Kc(r, e) {
15657
+ function qc(r, e) {
15442
15658
  const t = {
15443
15659
  x: r.core.position.x + (Math.random() - 0.5) * 140,
15444
15660
  y: r.core.position.y + (Math.random() - 0.5) * 140
15445
15661
  }, a = Math.atan2(t.y - e.position.y, t.x - e.position.x), i = Math.max(260, e.maxSpeed * 1.8);
15446
15662
  e.bossLaunchPhase = "reentry", e.velocity = { x: Math.cos(a) * i, y: Math.sin(a) * i }, e.launchDelay = 0.05;
15447
15663
  }
15448
- function Fc(r) {
15664
+ function $c(r) {
15449
15665
  r.bossExposureBurstRemaining = 0, r.bossExposureBurstAccumulator = 0, r.bossExposureBurstSide = 1;
15450
15666
  }
15451
- function Gc(r) {
15667
+ function Yc(r) {
15452
15668
  if (r.bossEncounter.getPhase() !== "defeated") return;
15453
15669
  const e = r.areaDirector.getArea().bossId;
15454
15670
  if (!e) return;
@@ -15459,9 +15675,9 @@ function Gc(r) {
15459
15675
  coreId: r.coreRoster.getSelectedCoreId()
15460
15676
  }), r.areaDirector.beginReward(), r.bossCodex.recordVictory(e);
15461
15677
  const a = r.getBossRewardPosition();
15462
- r.bossCatalyst = new Nc(a), Vc(r, a, t.ecosomaDropMin, t.ecosomaDropMax), Wc(r);
15678
+ r.bossCatalyst = new Hc(a), Zc(r, a, t.ecosomaDropMin, t.ecosomaDropMax), Jc(r);
15463
15679
  }
15464
- function Vc(r, e, t, a) {
15680
+ function Zc(r, e, t, a) {
15465
15681
  const i = Math.max(3, Math.floor(t ?? 3)), o = Math.max(i, Math.floor(a ?? 5)), n = i + Math.floor(Math.random() * (o - i + 1));
15466
15682
  for (let s = 0; s < n; s++) {
15467
15683
  const c = s * Math.PI * 2 / n, l = 24 + Math.random() * 28;
@@ -15473,30 +15689,30 @@ function Vc(r, e, t, a) {
15473
15689
  );
15474
15690
  }
15475
15691
  }
15476
- function Wc(r) {
15692
+ function Jc(r) {
15477
15693
  r.enemies = [], r.pools = [], r.vortices = [], r.shockwaves = [], r.repelProjectiles = [], r.bossEncounter.reset(), r.resetBossExposureBurst(), r.juice.triggerFlash(1);
15478
15694
  }
15479
- function qc(r) {
15695
+ function Xc(r) {
15480
15696
  const e = r.bossEncounter.getBossPosition(r.core.position), t = e.x - r.core.position.x, a = e.y - r.core.position.y, i = Math.hypot(t, a), o = Math.min(r.canvas.width, r.canvas.height) * 0.3, n = i > o ? o / i : 1, s = 28;
15481
15697
  return {
15482
15698
  x: Math.max(s, Math.min(r.canvas.width - s, r.core.position.x + t * n)),
15483
15699
  y: Math.max(s, Math.min(r.canvas.height - s, r.core.position.y + a * n))
15484
15700
  };
15485
15701
  }
15486
- function $c(r, e) {
15702
+ function Qc(r, e) {
15487
15703
  if (r.bossCatalyst?.active && (r.tryCollectCatalyst(), r.bossCatalyst.update(e, r.core.position, r.core.getHitboxRadius()), !r.bossCatalyst.active && r.bossCatalyst.absorbedByCore)) {
15488
15704
  const t = r.areaDirector.getArea().bossId;
15489
15705
  t && r.bossCodex.recordDropCollected(t), r.areaDirector.beginTransition(), r.areaTransitionElapsed = 0, r.juice.triggerFlash(0.75);
15490
15706
  }
15491
15707
  r.updateEcosomaOrbs(e), r.juice.update(e, r.floatingTexts, r.particles);
15492
15708
  }
15493
- function Yc(r) {
15709
+ function el(r) {
15494
15710
  const e = r.bossCatalyst;
15495
15711
  if (!e || !e.active || e.isAbsorbing) return;
15496
15712
  const t = r.configManager.getConfig().magnet, a = Math.hypot(r.core.position.x - e.position.x, r.core.position.y - e.position.y), i = Math.hypot(r.inputManager.pointerPosition.x - e.position.x, r.inputManager.pointerPosition.y - e.position.y);
15497
15713
  (a <= r.core.getHitboxRadius() + t.corePickupRadius || i <= Math.max(t.psionicRadius + t.pickupRadius + e.radius, e.interactionRadius)) && e.beginAbsorption();
15498
15714
  }
15499
- function Zc(r, e) {
15715
+ function tl(r, e) {
15500
15716
  if (r.areaTransitionElapsed = Math.min(r.areaTransitionDuration, r.areaTransitionElapsed + Math.max(0, e)), r.updateEcosomaOrbs(e), !(r.areaTransitionElapsed < r.areaTransitionDuration) && r.areaDirector.completeTransition()) {
15501
15717
  const t = r.areaDirector.getArea();
15502
15718
  r.coreRoster.setRunArea(t.areaNumber ?? 1, t.experienceMultiplier), r.coreRoster.recordSkillEvent("area"), r.objectives.record({
@@ -15506,15 +15722,15 @@ function Zc(r, e) {
15506
15722
  }), r.waveDirector.setArea(t), r.areaIntroElapsed = 0, r.bossEncounter.reset(), r.bossCatalyst = null, r.clearArenaForBoss(), r.juice.triggerFlash(0.65);
15507
15723
  }
15508
15724
  }
15509
- const Jc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, gt = (r, e) => {
15725
+ const rl = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, gt = (r, e) => {
15510
15726
  const t = /* @__PURE__ */ new Map();
15511
15727
  for (const a of r) {
15512
15728
  if (!a.active || a.isAbsorbing || a.isMerging) continue;
15513
- const i = Jc(a.position.x, a.position.y, e), o = t.get(i);
15729
+ const i = rl(a.position.x, a.position.y, e), o = t.get(i);
15514
15730
  o ? o.push(a) : t.set(i, [a]);
15515
15731
  }
15516
15732
  return t;
15517
- }, ee = (r) => !r.active || r.isAbsorbing || r.isMerging, Xc = (r, e) => {
15733
+ }, ee = (r) => !r.active || r.isAbsorbing || r.isMerging, al = (r, e) => {
15518
15734
  if (r.length < 2 || e <= 0) return;
15519
15735
  const t = gt(r, e);
15520
15736
  for (const a of r) {
@@ -15523,18 +15739,18 @@ const Jc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, gt = (r, e)
15523
15739
  for (let n = -1; n <= 1; n++)
15524
15740
  for (let s = -1; s <= 1; s++) {
15525
15741
  const c = t.get(`${i + n}:${o + s}`);
15526
- c && Qc(a, c, e);
15742
+ c && il(a, c, e);
15527
15743
  }
15528
15744
  }
15529
- }, Qc = (r, e, t) => {
15745
+ }, il = (r, e, t) => {
15530
15746
  for (const a of e) {
15531
15747
  if (a === r || ee(a)) continue;
15532
15748
  const i = Math.hypot(a.position.x - r.position.x, a.position.y - r.position.y), o = Math.min(12, Math.max(0, Math.max(r.radius, a.radius) - r.getBaseRadius()));
15533
15749
  i <= t + o && r.mergeWith(a);
15534
15750
  }
15535
- }, el = (r, e, t) => {
15751
+ }, ol = (r, e, t) => {
15536
15752
  const a = e.magneticAttractionDistance;
15537
- if (!tl(r, e)) return;
15753
+ if (!nl(r, e)) return;
15538
15754
  const i = gt(r, a);
15539
15755
  for (const o of r) {
15540
15756
  if (ee(o)) continue;
@@ -15542,7 +15758,7 @@ const Jc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, gt = (r, e)
15542
15758
  for (let c = -1; c <= 1; c++)
15543
15759
  for (let l = -1; l <= 1; l++) {
15544
15760
  const d = i.get(`${n + c}:${s + l}`);
15545
- d && rl({
15761
+ d && sl({
15546
15762
  orb: o,
15547
15763
  bucket: d,
15548
15764
  distanceLimit: a,
@@ -15551,7 +15767,7 @@ const Jc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, gt = (r, e)
15551
15767
  });
15552
15768
  }
15553
15769
  }
15554
- }, tl = (r, e) => r.length >= 2 && e.magneticAttractionDistance > 0 && e.magneticAttractionStrength > 0, rl = (r) => {
15770
+ }, nl = (r, e) => r.length >= 2 && e.magneticAttractionDistance > 0 && e.magneticAttractionStrength > 0, sl = (r) => {
15555
15771
  const { orb: e, bucket: t, distanceLimit: a, strength: i, dt: o } = r;
15556
15772
  for (const n of t) {
15557
15773
  if (n === e || ee(n) || n.id <= e.id) continue;
@@ -15560,12 +15776,12 @@ const Jc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, gt = (r, e)
15560
15776
  const d = i * (1 - l / a) ** 2 * o, u = s / l, h = c / l;
15561
15777
  e.velocity.x += u * d, e.velocity.y += h * d, n.velocity.x -= u * d, n.velocity.y -= h * d;
15562
15778
  }
15563
- }, al = (r, e) => {
15779
+ }, cl = (r, e) => {
15564
15780
  const t = Math.log2(r), a = Math.min(e.maxRadius, e.baseRadius + t * e.radiusGrowthPerLevel);
15565
15781
  let i = p.experience;
15566
15782
  return r >= e.blueThreshold && (i = p.experienceBlue), r >= e.yellowThreshold && (i = p.experienceYellow), r >= e.redThreshold && (i = p.experienceRed), { radius: a, color: i };
15567
15783
  };
15568
- class il {
15784
+ class ll {
15569
15785
  constructor(e) {
15570
15786
  this.config = e;
15571
15787
  }
@@ -15596,7 +15812,7 @@ class il {
15596
15812
  return e.velocity = { x: o / s * c, y: n / s * c }, !1;
15597
15813
  }
15598
15814
  }
15599
- const ol = {
15815
+ const dl = {
15600
15816
  mergeDistance: 34,
15601
15817
  magneticAttractionDistance: 190,
15602
15818
  magneticAttractionStrength: 900,
@@ -15608,7 +15824,7 @@ const ol = {
15608
15824
  yellowThreshold: 32,
15609
15825
  redThreshold: 256
15610
15826
  };
15611
- class Se {
15827
+ class be {
15612
15828
  id;
15613
15829
  position;
15614
15830
  velocity;
@@ -15623,8 +15839,8 @@ class Se {
15623
15839
  absorbedByCore = !1;
15624
15840
  config;
15625
15841
  lifecycle;
15626
- constructor(e, t = 1, a = ol) {
15627
- this.id = `xp_${Date.now()}_${Math.random()}`, this.position = { ...e }, this.value = Math.max(1, t), this.config = a, this.lifecycle = new il(a), this.radius = a.baseRadius, this.color = p.experience, this.updateAppearance();
15842
+ constructor(e, t = 1, a = dl) {
15843
+ this.id = `xp_${Date.now()}_${Math.random()}`, this.position = { ...e }, this.value = Math.max(1, t), this.config = a, this.lifecycle = new ll(a), this.radius = a.baseRadius, this.color = p.experience, this.updateAppearance();
15628
15844
  const i = Math.random() * Math.PI * 2, o = 25 + Math.random() * 45;
15629
15845
  this.velocity = {
15630
15846
  x: Math.cos(i) * o,
@@ -15632,10 +15848,10 @@ class Se {
15632
15848
  };
15633
15849
  }
15634
15850
  static mergeNearby(e, t) {
15635
- Xc(e, t);
15851
+ al(e, t);
15636
15852
  }
15637
15853
  static attractNearby(e, t, a) {
15638
- el(e, t, a);
15854
+ ol(e, t, a);
15639
15855
  }
15640
15856
  beginAbsorption() {
15641
15857
  this.active && (this.isAbsorbing = !0);
@@ -15668,7 +15884,7 @@ class Se {
15668
15884
  }
15669
15885
  }
15670
15886
  updateAppearance() {
15671
- const e = al(this.value, this.config);
15887
+ const e = cl(this.value, this.config);
15672
15888
  this.radius = e.radius, this.color = e.color;
15673
15889
  }
15674
15890
  getBaseRadius() {
@@ -15695,22 +15911,22 @@ class yt {
15695
15911
  this.active && !this.isGrabbed && !this.isHovered && (this.orbitAngle += e * 0.25, this.position.x = t.x + Math.cos(this.orbitAngle) * this.orbitDistance, this.position.y = t.y + Math.sin(this.orbitAngle) * this.orbitDistance);
15696
15912
  }
15697
15913
  }
15698
- function nl(r, e) {
15914
+ function ul(r, e) {
15699
15915
  r.objectives.record({
15700
15916
  type: "level-reached",
15701
15917
  amount: e,
15702
15918
  coreId: r.coreRoster.getSelectedCoreId()
15703
15919
  }), r.pendingLevelUps.push(e), r.isLevelUpActive || r.presentNextLevelUp();
15704
15920
  }
15705
- function sl(r) {
15921
+ function hl(r) {
15706
15922
  const e = r.pendingLevelUps.shift();
15707
15923
  if (e === void 0) {
15708
15924
  r.isLevelUpActive = !1;
15709
15925
  return;
15710
15926
  }
15711
- r.isLevelUpActive = !0, r.inputManager.forceRelease(), r.juice.triggerFlash(0.3), r.juice.triggerScreenShake({ x: 0, y: 1 }, 8), cl(r, e), r.orbitingOrbs = ll(r), r.rerollsRemaining = r.isChallengeRun() ? 0 : r.getRerollLimit();
15927
+ r.isLevelUpActive = !0, r.inputManager.forceRelease(), r.juice.triggerFlash(0.3), r.juice.triggerScreenShake({ x: 0, y: 1 }, 8), pl(r, e), r.orbitingOrbs = ml(r), r.rerollsRemaining = r.isChallengeRun() ? 0 : r.getRerollLimit();
15712
15928
  }
15713
- function cl(r, e) {
15929
+ function pl(r, e) {
15714
15930
  r.floatingTexts.push({
15715
15931
  id: Math.random().toString(),
15716
15932
  text: r.i18n.translate("levelUpChoose", { level: e }),
@@ -15736,26 +15952,26 @@ function cl(r, e) {
15736
15952
  });
15737
15953
  }
15738
15954
  }
15739
- function ll(r) {
15955
+ function ml(r) {
15740
15956
  const e = r.powerUpRegistry.getRandomOptions(3, r.geneticMemory, r.waveDirector.getAvailableEnemyIds(), r.coreRoster.getSelectedCoreId());
15741
15957
  return e.map((t, a) => new yt("orb_" + Date.now() + "_" + a, t, a * Math.PI * 2 / e.length));
15742
15958
  }
15743
- function dl(r) {
15959
+ function gl(r) {
15744
15960
  for (const e of r.enemies)
15745
15961
  e.experienceDropPending && (e.experienceDropPending = !1, r.codex.recordKill(e.type, e.codexDeathSourceType), r.objectives.record({
15746
15962
  type: "enemy-defeated",
15747
15963
  enemyId: e.type,
15748
15964
  ...e.variantId ? { variantId: e.variantId } : {},
15749
15965
  coreId: r.coreRoster.getSelectedCoreId()
15750
- }), r.experienceOrbs.push(new Se(e.position, 1, r.configManager.getConfig().experience)), r.getEcosomaDropPolicy().shouldDrop(r.progressBar.getLevel()) && r.ecosomaOrbs.push(new mt(e.position)));
15966
+ }), r.experienceOrbs.push(new be(e.position, 1, r.configManager.getConfig().experience)), r.getEcosomaDropPolicy().shouldDrop(r.progressBar.getLevel()) && r.ecosomaOrbs.push(new mt(e.position)));
15751
15967
  }
15752
- function ul(r, e) {
15968
+ function yl(r, e) {
15753
15969
  r.codex.recordSeen(e.type), e.variantId && r.isEnemyVisible(e) && r.codex.recordVariant(e.type, e.variantId);
15754
15970
  }
15755
- function hl(r, e) {
15971
+ function El(r, e) {
15756
15972
  for (const t of e) t.active && !t.isDying && r.recordEnemyObservation(t);
15757
15973
  }
15758
- function pl(r, e) {
15974
+ function vl(r, e) {
15759
15975
  const t = e.getHitRadius();
15760
15976
  return e.position.x >= -t && e.position.x <= r.canvas.width + t && e.position.y >= -t && e.position.y <= r.canvas.height + t;
15761
15977
  }
@@ -15771,26 +15987,26 @@ class We {
15771
15987
  return t >= 0 && t < this.getChance(e);
15772
15988
  }
15773
15989
  }
15774
- function ml(r, e) {
15990
+ function fl(r, e) {
15775
15991
  const t = r.configManager.getConfig();
15776
- Se.attractNearby(r.experienceOrbs, t.experience, e), Se.mergeNearby(r.experienceOrbs, t.experience.mergeDistance);
15777
- for (const a of r.experienceOrbs) gl(r, a, e, t.magnet);
15992
+ be.attractNearby(r.experienceOrbs, t.experience, e), be.mergeNearby(r.experienceOrbs, t.experience.mergeDistance);
15993
+ for (const a of r.experienceOrbs) xl(r, a, e, t.magnet);
15778
15994
  r.experienceOrbs = r.experienceOrbs.filter((a) => a.active);
15779
15995
  }
15780
- function gl(r, e, t, a) {
15996
+ function xl(r, e, t, a) {
15781
15997
  if (e.active) {
15782
15998
  if (e.isMerging) {
15783
15999
  e.update(t, r.core.position, r.core.getHitboxRadius(), a.absorptionSpeed);
15784
16000
  return;
15785
16001
  }
15786
- yl(r, e, a) && e.beginAbsorption(), e.update(t, r.core.position, r.core.getHitboxRadius(), a.absorptionSpeed), !e.active && e.absorbedByCore && El(r, e);
16002
+ bl(r, e, a) && e.beginAbsorption(), e.update(t, r.core.position, r.core.getHitboxRadius(), a.absorptionSpeed), !e.active && e.absorbedByCore && Sl(r, e);
15787
16003
  }
15788
16004
  }
15789
- function yl(r, e, t) {
16005
+ function bl(r, e, t) {
15790
16006
  const a = Math.hypot(r.core.position.x - e.position.x, r.core.position.y - e.position.y), i = Math.hypot(r.inputManager.pointerPosition.x - e.position.x, r.inputManager.pointerPosition.y - e.position.y);
15791
16007
  return a <= r.core.getHitboxRadius() + t.corePickupRadius || i <= t.psionicRadius + t.pickupRadius + e.radius;
15792
16008
  }
15793
- function El(r, e) {
16009
+ function Sl(r, e) {
15794
16010
  r.progressBar.addExperience(e.value), r.juice.triggerFlash(0.12), r.floatingTexts.push({
15795
16011
  id: Math.random().toString(),
15796
16012
  text: r.i18n.translate("experienceCollected", { amount: e.value }),
@@ -15803,14 +16019,14 @@ function El(r, e) {
15803
16019
  size: 18
15804
16020
  });
15805
16021
  }
15806
- function vl(r, e) {
16022
+ function Cl(r, e) {
15807
16023
  const { magnet: t, ecosoma: a } = r.configManager.getConfig();
15808
- for (const i of r.ecosomaOrbs) fl({ engine: r, orb: i, dt: e, magnet: t, ecosoma: a });
16024
+ for (const i of r.ecosomaOrbs) Al({ engine: r, orb: i, dt: e, magnet: t, ecosoma: a });
15809
16025
  r.ecosomaOrbs = r.ecosomaOrbs.filter((i) => i.active);
15810
16026
  }
15811
- function fl(r) {
16027
+ function Al(r) {
15812
16028
  const { engine: e, orb: t, dt: a, magnet: i, ecosoma: o } = r;
15813
- t.active && (xl(e, t, i) && t.beginAbsorption(), t.update(a, e.core.position, e.core.getHitboxRadius(), o), !t.active && t.absorbedByCore && (e.geneticMemory.collectEcosoma(t.value), e.objectives.record({ type: "ecosoma-collected", amount: t.value }), e.juice.triggerFlash(0.18), e.floatingTexts.push({
16029
+ t.active && (Il(e, t, i) && t.beginAbsorption(), t.update(a, e.core.position, e.core.getHitboxRadius(), o), !t.active && t.absorbedByCore && (e.geneticMemory.collectEcosoma(t.value), e.objectives.record({ type: "ecosoma-collected", amount: t.value }), e.juice.triggerFlash(0.18), e.floatingTexts.push({
15814
16030
  id: Math.random().toString(),
15815
16031
  text: e.i18n.translate("ecosomaCollected", { amount: t.value }),
15816
16032
  position: { ...e.core.position },
@@ -15822,11 +16038,11 @@ function fl(r) {
15822
16038
  size: 17
15823
16039
  })));
15824
16040
  }
15825
- function xl(r, e, t) {
16041
+ function Il(r, e, t) {
15826
16042
  const a = Math.hypot(r.core.position.x - e.position.x, r.core.position.y - e.position.y), i = Math.hypot(r.inputManager.pointerPosition.x - e.position.x, r.inputManager.pointerPosition.y - e.position.y);
15827
16043
  return a <= r.core.getHitboxRadius() + t.corePickupRadius || i <= t.psionicRadius + t.pickupRadius + e.radius;
15828
16044
  }
15829
- function Sl(r) {
16045
+ function Rl(r) {
15830
16046
  const e = r.configManager.getConfig().ecosoma;
15831
16047
  return r.debugPerformanceEnabled ? new We({
15832
16048
  ...e,
@@ -15835,7 +16051,7 @@ function Sl(r) {
15835
16051
  maxDropChance: Ve
15836
16052
  }) : new We(e);
15837
16053
  }
15838
- function bl(r) {
16054
+ function Tl(r) {
15839
16055
  if (r.rerollsRemaining <= 0) return;
15840
16056
  r.rerollsRemaining -= 1, r.juice.triggerFlash(0.4);
15841
16057
  const e = r.powerUpRegistry.getRandomOptions(3, r.geneticMemory, r.waveDirector.getAvailableEnemyIds(), r.coreRoster.getSelectedCoreId());
@@ -15844,11 +16060,11 @@ function bl(r) {
15844
16060
  return new yt(`orb_${Date.now()}_${a}`, t, i);
15845
16061
  });
15846
16062
  }
15847
- function Cl(r) {
16063
+ function Pl(r) {
15848
16064
  const e = r.debugPerformanceEnabled ? performance.now() : 0;
15849
- r.renderer.render(Al(r)), Rl(r), r.performanceAudit.finishRender(e);
16065
+ r.renderer.render(wl(r)), Ml(r), r.performanceAudit.finishRender(e);
15850
16066
  }
15851
- function Al(r) {
16067
+ function wl(r) {
15852
16068
  const e = {
15853
16069
  core: r.core,
15854
16070
  enemies: r.getRenderList(),
@@ -15867,13 +16083,13 @@ function Al(r) {
15867
16083
  experienceProgress: r.progressBar.getProgress(),
15868
16084
  levelUpPulse: r.progressBar.getLevelUpPulse(),
15869
16085
  levelUpActive: r.isLevelUpActive,
15870
- areaVisual: Il(r),
16086
+ areaVisual: kl(r),
15871
16087
  boss: r.bossEncounter.getSnapshot(r.core.position),
15872
16088
  bossCatalyst: r.bossCatalyst
15873
16089
  };
15874
16090
  return r.isRunning && r.interactiveTutorial.isActive && (e.tutorial = r.interactiveTutorial), r.isDeathSequenceActive && (e.deathSequenceProgress = r.deathSequenceElapsed / ye), e;
15875
16091
  }
15876
- function Il(r) {
16092
+ function kl(r) {
15877
16093
  const e = r.areaDirector.getPhase();
15878
16094
  return {
15879
16095
  areaId: r.areaDirector.getAreaId(),
@@ -15885,7 +16101,7 @@ function Il(r) {
15885
16101
  entryProgress: r.isRunning && e === "area" ? Math.min(1, r.areaIntroElapsed / Q) : 1
15886
16102
  };
15887
16103
  }
15888
- function Rl(r) {
16104
+ function Ml(r) {
15889
16105
  r.isLevelUpActive && r.orbitingOrbs.length > 0 && r.renderer.drawings.drawOrbitingModifierOrbs({
15890
16106
  orbs: r.orbitingOrbs,
15891
16107
  time: r.core.pulsePhase,
@@ -15894,207 +16110,207 @@ function Rl(r) {
15894
16110
  rerollsRemaining: r.rerollsRemaining
15895
16111
  });
15896
16112
  }
15897
- function Tl(r) {
16113
+ function Dl(r) {
15898
16114
  return r.isRunning ? r.enemies : r.isDeathSequenceActive ? [] : r.ambientEnemies;
15899
16115
  }
15900
- function Pl(r) {
16116
+ function Nl(r) {
15901
16117
  return r.debugRerollsEnabled ? 99 : 1;
15902
16118
  }
15903
- function wl(r, e = !1) {
16119
+ function Ol(r, e = !1) {
15904
16120
  if (!e && r.objectives.getSnapshots("mission").length > 0) return;
15905
16121
  const t = r.missionGenerator.generate();
15906
16122
  t && r.objectives.installMission(t);
15907
16123
  }
15908
- function kl(r) {
16124
+ function Ll(r) {
15909
16125
  if (!r.objectives.canRerollMission()) return;
15910
16126
  const e = r.missionGenerator.generate();
15911
16127
  e && r.objectives.rerollMission(e);
15912
16128
  }
15913
- function Ml(r) {
16129
+ function _l(r) {
15914
16130
  r.missionsDrawer.setAvailable(!0), r.startMenu.show();
15915
16131
  }
15916
- function Dl(r, e) {
16132
+ function jl(r, e) {
15917
16133
  r.objectives.startChallenge(e, r.coreRoster.getSelectedCoreId()) && (r.challengeRunId = e, r.challengesOverlay.hide(), r.startGame());
15918
16134
  }
15919
- function Ol(r) {
16135
+ function Bl(r) {
15920
16136
  return r.challengeRunId !== null;
15921
16137
  }
15922
- function Nl(r, e) {
16138
+ function Hl(r, e) {
15923
16139
  if (e.type === "ecosoma") {
15924
16140
  r.geneticMemory.collectEcosoma(e.amount);
15925
16141
  return;
15926
16142
  }
15927
16143
  e.type === "powerup" && r.geneticMemory.grantUnlock(e.unlockId);
15928
16144
  }
15929
- function Ll(r) {
16145
+ function Ul(r) {
15930
16146
  r.gameLoop.stop(), r.performanceAudit.destroy(), r.coreRosterOverlay.destroy(), r.geneticMemoryOverlay.destroy(), r.coreRunSummaryOverlay.destroy(), r.unsubscribeCodex?.(), r.unsubscribeBossCodex?.(), r.unsubscribeCoreRoster?.(), r.codexOverlay.destroy(), r.codexToast.destroy(), r.missionsDrawer.destroy(), r.challengesOverlay.destroy(), r.achievementsOverlay.destroy(), r.objectiveToast.destroy(), r.unsubscribeObjectives?.(), window.removeEventListener("keydown", r.handleLanguageHold), window.removeEventListener("keydown", r.handleDebugAchievement), window.removeEventListener("keyup", r.handleLanguageRelease), r.canvas.remove();
15931
16147
  }
15932
- class _l extends Ts {
16148
+ class zl extends ws {
15933
16149
  constructor(e) {
15934
16150
  super(e);
15935
16151
  }
15936
16152
  setLanguage(e) {
15937
- Ps(this, e);
16153
+ ks(this, e);
15938
16154
  }
15939
16155
  setTheme(e) {
15940
- ws(this, e);
16156
+ Ms(this, e);
15941
16157
  }
15942
16158
  getLanguage() {
15943
- return ks(this);
16159
+ return Ds(this);
15944
16160
  }
15945
16161
  getTheme() {
15946
- return Ms(this);
16162
+ return Ns(this);
15947
16163
  }
15948
16164
  onLanguageChanged(e) {
15949
- Ds(this);
16165
+ Os(this);
15950
16166
  }
15951
16167
  initAmbientArena() {
15952
- Os(this);
16168
+ Ls(this);
15953
16169
  }
15954
16170
  syncSelectedCorePreview() {
15955
- Ns(this);
16171
+ _s(this);
15956
16172
  }
15957
16173
  resizeCanvas() {
15958
- Ls(this);
16174
+ js(this);
15959
16175
  }
15960
16176
  setupEvents() {
15961
- zs(this);
16177
+ Fs(this);
15962
16178
  }
15963
16179
  startGame() {
15964
- Js(this);
16180
+ Qs(this);
15965
16181
  }
15966
16182
  clearTransientRunState() {
15967
- tc(this);
16183
+ oc(this);
15968
16184
  }
15969
16185
  updateRepelProjectiles(e) {
15970
- rc(this, e);
16186
+ nc(this, e);
15971
16187
  }
15972
16188
  isRepelProjectileBlocked(e) {
15973
- return nc(this, e);
16189
+ return dc(this, e);
15974
16190
  }
15975
16191
  clearTransientRunEntities() {
15976
- cc(this);
16192
+ hc(this);
15977
16193
  }
15978
16194
  updateDeathSequence(e) {
15979
- lc(this, e);
16195
+ pc(this, e);
15980
16196
  }
15981
16197
  update(e) {
15982
- dc(this, e);
16198
+ mc(this, e);
15983
16199
  }
15984
16200
  handleEnemyKill() {
15985
- Ic(this);
16201
+ kc(this);
15986
16202
  }
15987
16203
  startBossIfReady() {
15988
- Rc(this);
16204
+ Mc(this);
15989
16205
  }
15990
16206
  clearArenaForBoss() {
15991
- Tc(this);
16207
+ Dc(this);
15992
16208
  }
15993
16209
  processBossImpacts() {
15994
- Pc(this);
16210
+ Nc(this);
15995
16211
  }
15996
16212
  processSmasherBossImpact() {
15997
- kc(this);
16213
+ Lc(this);
15998
16214
  }
15999
16215
  getBossImpactRadius(e) {
16000
- return Lc(this, e);
16216
+ return Uc(this, e);
16001
16217
  }
16002
16218
  releaseBossExposureBurst() {
16003
- _c(this);
16219
+ zc(this);
16004
16220
  }
16005
16221
  updateBossExposureBurst(e) {
16006
- jc(this, e);
16222
+ Kc(this, e);
16007
16223
  }
16008
16224
  updateBossMinionReentryPaths() {
16009
- Bc(this);
16225
+ Fc(this);
16010
16226
  }
16011
16227
  resetBossExposureBurst() {
16012
- Fc(this);
16228
+ $c(this);
16013
16229
  }
16014
16230
  finishBossIfDefeated() {
16015
- Gc(this);
16231
+ Yc(this);
16016
16232
  }
16017
16233
  getBossRewardPosition() {
16018
- return qc(this);
16234
+ return Xc(this);
16019
16235
  }
16020
16236
  updateBossReward(e) {
16021
- $c(this, e);
16237
+ Qc(this, e);
16022
16238
  }
16023
16239
  tryCollectCatalyst() {
16024
- Yc(this);
16240
+ el(this);
16025
16241
  }
16026
16242
  updateAreaTransition(e) {
16027
- Zc(this, e);
16243
+ tl(this, e);
16028
16244
  }
16029
16245
  triggerLevelUp(e) {
16030
- nl(this, e);
16246
+ ul(this, e);
16031
16247
  }
16032
16248
  presentNextLevelUp() {
16033
- sl(this);
16249
+ hl(this);
16034
16250
  }
16035
16251
  spawnExperienceDrops() {
16036
- dl(this);
16252
+ gl(this);
16037
16253
  }
16038
16254
  recordEnemyObservation(e) {
16039
- ul(this, e);
16255
+ yl(this, e);
16040
16256
  }
16041
16257
  recordEnemyObservations(e) {
16042
- hl(this, e);
16258
+ El(this, e);
16043
16259
  }
16044
16260
  isEnemyVisible(e) {
16045
- return pl(this, e);
16261
+ return vl(this, e);
16046
16262
  }
16047
16263
  updateExperienceOrbs(e) {
16048
- ml(this, e);
16264
+ fl(this, e);
16049
16265
  }
16050
16266
  updateEcosomaOrbs(e) {
16051
- vl(this, e);
16267
+ Cl(this, e);
16052
16268
  }
16053
16269
  getEcosomaDropPolicy() {
16054
- return Sl(this);
16270
+ return Rl(this);
16055
16271
  }
16056
16272
  triggerReroll() {
16057
- bl(this);
16273
+ Tl(this);
16058
16274
  }
16059
16275
  render() {
16060
- Cl(this);
16276
+ Pl(this);
16061
16277
  }
16062
16278
  getRenderList() {
16063
- return Tl(this);
16279
+ return Dl(this);
16064
16280
  }
16065
16281
  getRerollLimit() {
16066
- return Pl(this);
16282
+ return Nl(this);
16067
16283
  }
16068
16284
  refreshGeneratedMission(e = !1) {
16069
- wl(this, e);
16285
+ Ol(this, e);
16070
16286
  }
16071
16287
  rerollMission() {
16072
- kl(this);
16288
+ Ll(this);
16073
16289
  }
16074
16290
  showStartMenu() {
16075
- Ml(this);
16291
+ _l(this);
16076
16292
  }
16077
16293
  startChallenge(e) {
16078
- Dl(this, e);
16294
+ jl(this, e);
16079
16295
  }
16080
16296
  isChallengeRun() {
16081
- return Ol(this);
16297
+ return Bl(this);
16082
16298
  }
16083
16299
  applyObjectiveReward(e) {
16084
- Nl(this, e);
16300
+ Hl(this, e);
16085
16301
  }
16086
16302
  destroy() {
16087
- Ll(this);
16303
+ Ul(this);
16088
16304
  }
16089
16305
  }
16090
- function jl(r) {
16091
- return new _l(r);
16306
+ function Kl(r) {
16307
+ return new zl(r);
16092
16308
  }
16093
16309
  export {
16094
16310
  Ua as BrowserPlatform,
16095
- _l as GameEngine,
16311
+ zl as GameEngine,
16096
16312
  ca as LANGUAGES,
16097
16313
  cr as ThemeManager,
16098
- jl as createAxonSurge,
16314
+ Kl as createAxonSurge,
16099
16315
  re as isLanguage
16100
16316
  };