@gamebob/axon-surge 0.38.0 → 0.40.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.
@@ -2303,7 +2303,7 @@ class xr extends fr {
2303
2303
  t.restore();
2304
2304
  }
2305
2305
  }
2306
- class br extends xr {
2306
+ class Sr extends xr {
2307
2307
  drawMiasmaClouds(e, t, a) {
2308
2308
  if (this.renderer.ctx)
2309
2309
  for (const i of e)
@@ -2341,13 +2341,13 @@ class br extends xr {
2341
2341
  this.renderer.ctx.save(), this.renderer.ctx.globalAlpha = t.alpha, this.renderer.ctx.fillStyle = t.color, this.renderer.ctx.font = `900 ${t.size}px ${M}`, this.renderer.ctx.textAlign = "center", this.renderer.ctx.shadowColor = t.color, this.renderer.ctx.shadowBlur = 12, this.renderer.ctx.fillText(t.text, t.position.x, t.position.y), this.renderer.ctx.restore();
2342
2342
  }
2343
2343
  }
2344
- const Sr = {
2344
+ const br = {
2345
2345
  common: p.spore,
2346
2346
  rare: p.parasite,
2347
2347
  epic: p.cluster,
2348
2348
  legendary: p.core
2349
2349
  };
2350
- class Cr extends br {
2350
+ class Cr extends Sr {
2351
2351
  drawOrbitingModifierOrbs(e) {
2352
2352
  if (!this.renderer.ctx) return;
2353
2353
  const { orbs: t, time: a, i18nService: i, canReroll: o = !0, rerollsRemaining: n = 1 } = e, s = this.renderer.themeManager.getPalette(), l = this.getDisplayScale();
@@ -2359,7 +2359,7 @@ class Cr extends br {
2359
2359
  }
2360
2360
  }
2361
2361
  drawOrbitingOrb(e) {
2362
- const { orb: t, time: a, palette: i, displayScale: o, i18nService: n } = e, s = Sr[t.definition.rarity], l = t.radius + Math.sin(a * 6 + t.orbitAngle) * 3, c = this.renderer.ctx;
2362
+ const { orb: t, time: a, palette: i, displayScale: o, i18nService: n } = e, s = br[t.definition.rarity], l = t.radius + Math.sin(a * 6 + t.orbitAngle) * 3, c = this.renderer.ctx;
2363
2363
  c.save(), c.shadowColor = s, c.shadowBlur = t.isGrabbed ? 36 : this.getOrbShadowBlur(t), this.drawOrbAura(t, l, s), this.drawOrbBody({ orb: t, pulseR: l, time: a, palette: i, rarityColor: s }), this.drawOrbLabel({ orb: t, pulseR: l, palette: i, rarityColor: s, displayScale: o, i18nService: n }), c.restore();
2364
2364
  }
2365
2365
  getOrbShadowBlur(e) {
@@ -2593,7 +2593,7 @@ class Rr {
2593
2593
  });
2594
2594
  }
2595
2595
  drawParticle(e) {
2596
- const { ctx: t, w: a, h: i, time: o, hue: n, secondaryHue: s, level: l, isLight: c, centerX: d, centerY: u, clearRadius: h, index: m } = e, g = m + l * 17, y = this.unitNoise(g * 1.7) * a, j = this.unitNoise(g * 2.9 + 13) * i, R = Math.hypot(y - d, j - u), k = Math.min(1, Math.max(0, (R - h) / (Math.min(a, i) * 0.28))), St = 0.7 + Math.sin(o * (0.6 + m % 4 * 0.08) + g) * 0.3, Ct = (c ? 0.34 : 0.3) * k * St;
2596
+ const { ctx: t, w: a, h: i, time: o, hue: n, secondaryHue: s, level: l, isLight: c, centerX: d, centerY: u, clearRadius: h, index: m } = e, g = m + l * 17, y = this.unitNoise(g * 1.7) * a, j = this.unitNoise(g * 2.9 + 13) * i, R = Math.hypot(y - d, j - u), k = Math.min(1, Math.max(0, (R - h) / (Math.min(a, i) * 0.28))), bt = 0.7 + Math.sin(o * (0.6 + m % 4 * 0.08) + g) * 0.3, Ct = (c ? 0.34 : 0.3) * k * bt;
2597
2597
  t.fillStyle = `hsla(${m % 3 === 0 ? s : n}, ${c ? 82 : 78}%, ${c ? 40 : 70}%, ${Ct})`, t.beginPath(), t.arc(y, j, 0.65 + m % 3 * 0.45, 0, Math.PI * 2), t.fill();
2598
2598
  }
2599
2599
  unitNoise(e) {
@@ -3961,6 +3961,8 @@ const C = {
3961
3961
  coreRosterSkillPoints: "EXPERIENCIA NUCLEICA",
3962
3962
  coreRosterNext: "SIGUIENTE DESBLOQUEO",
3963
3963
  coreRosterNoNext: "No hay otro desbloqueo definido.",
3964
+ coreRosterScrollUp: "Ver elevaciones anteriores",
3965
+ coreRosterScrollDown: "Ver más elevaciones",
3964
3966
  coreOriginStyleDescription: "Agarra, arrastra y lanza enemigos para convertirlos en munición.",
3965
3967
  coreLauncherTitle: "EL LANZADOR",
3966
3968
  coreLauncherDescription: "La conciencia que convierte cada criatura en munición.",
@@ -4203,6 +4205,8 @@ const C = {
4203
4205
  coreRosterSkillPoints: "NUCLEIC EXPERIENCE",
4204
4206
  coreRosterNext: "NEXT UNLOCK",
4205
4207
  coreRosterNoNext: "No further unlock is defined.",
4208
+ coreRosterScrollUp: "View previous elevations",
4209
+ coreRosterScrollDown: "View more elevations",
4206
4210
  coreOriginStyleDescription: "Grab, drag, and throw enemies to turn them into ammunition.",
4207
4211
  coreLauncherTitle: "THE LAUNCHER",
4208
4212
  coreLauncherDescription: "The consciousness that turns every creature into ammunition.",
@@ -4405,6 +4409,8 @@ const C = {
4405
4409
  coreRosterSkillPoints: "EXPÉRIENCE NUCLÉIQUE",
4406
4410
  coreRosterNext: "PROCHAIN DÉVERROUILLAGE",
4407
4411
  coreRosterNoNext: "Aucun autre déverrouillage n'est défini.",
4412
+ coreRosterScrollUp: "Voir les élévations précédentes",
4413
+ coreRosterScrollDown: "Voir plus d'élévations",
4408
4414
  coreOriginStyleDescription: "Saisissez, faites glisser et lancez les ennemis pour en faire des munitions.",
4409
4415
  coreSmasherTitle: "L'ÉCRASEUR",
4410
4416
  coreSmasherDescription: "La conscience qui soutient que tout corps est infiniment plus utile lorsqu'il est plat.",
@@ -4592,6 +4598,8 @@ const C = {
4592
4598
  coreRosterSkillPoints: "NUKLEARE ERFAHRUNG",
4593
4599
  coreRosterNext: "NÄCHSTE FREISCHALTUNG",
4594
4600
  coreRosterNoNext: "Keine weitere Freischaltung definiert.",
4601
+ coreRosterScrollUp: "Vorherige Elevationen anzeigen",
4602
+ coreRosterScrollDown: "Weitere Elevationen anzeigen",
4595
4603
  coreOriginStyleDescription: "Greife, ziehe und schleudere Feinde, um sie in Munition zu verwandeln.",
4596
4604
  coreSmasherTitle: "DER ZERMALMER",
4597
4605
  coreSmasherDescription: "Das Bewusstsein, das behauptet, dass jeder Körper unendlich nützlicher ist, wenn er flach ist.",
@@ -4779,6 +4787,8 @@ const C = {
4779
4787
  coreRosterSkillPoints: "ESPERIENZA NUCLEICA",
4780
4788
  coreRosterNext: "PROSSIMO SBLOCCO",
4781
4789
  coreRosterNoNext: "Nessun altro sblocco definito.",
4790
+ coreRosterScrollUp: "Mostra elevazioni precedenti",
4791
+ coreRosterScrollDown: "Mostra altre elevazioni",
4782
4792
  coreOriginStyleDescription: "Afferra, trascina e lancia i nemici per trasformarli in munizioni.",
4783
4793
  coreSmasherTitle: "IL FRANTUMATORE",
4784
4794
  coreSmasherDescription: "La coscienza che sostiene che ogni corpo sia infinitamente più utile quando è piatto.",
@@ -4966,6 +4976,8 @@ const C = {
4966
4976
  coreRosterSkillPoints: "EXPERIÊNCIA NUCLEICA",
4967
4977
  coreRosterNext: "PRÓXIMO DESBLOQUEIO",
4968
4978
  coreRosterNoNext: "Nenhum outro desbloqueio definido.",
4979
+ coreRosterScrollUp: "Ver elevações anteriores",
4980
+ coreRosterScrollDown: "Ver mais elevações",
4969
4981
  coreOriginStyleDescription: "Agarra, arrasta e lança inimigos para transformá-los em munição.",
4970
4982
  coreSmasherTitle: "O ESMAGADOR",
4971
4983
  coreSmasherDescription: "A consciência que transforma um agarre num esmagamento.",
@@ -5153,6 +5165,8 @@ const C = {
5153
5165
  coreRosterSkillPoints: "NUCLEAIRE ERVARING",
5154
5166
  coreRosterNext: "VOLGENDE VRIJSPELING",
5155
5167
  coreRosterNoNext: "Geen volgende vrijspeling gedefinieerd.",
5168
+ coreRosterScrollUp: "Vorige elevaties bekijken",
5169
+ coreRosterScrollDown: "Meer elevaties bekijken",
5156
5170
  coreOriginStyleDescription: "Grijp, sleep en werp vijanden om ze in munitie te veranderen.",
5157
5171
  coreSmasherTitle: "DE VERPLETTERAAR",
5158
5172
  coreSmasherDescription: "Het bewustzijn dat een greep in een verpletterende klap verandert.",
@@ -5340,6 +5354,8 @@ const C = {
5340
5354
  coreRosterSkillPoints: "NUKLEÄR ERFARENHET",
5341
5355
  coreRosterNext: "NÄSTA UPPLÅSNING",
5342
5356
  coreRosterNoNext: "Ingen ytterligare upplåsning definierad.",
5357
+ coreRosterScrollUp: "Visa tidigare elevationer",
5358
+ coreRosterScrollDown: "Visa fler elevationer",
5343
5359
  coreOriginStyleDescription: "Greppa, dra och kasta fiender för att göra dem till ammunition.",
5344
5360
  coreSmasherTitle: "MIAŻDŻYCEL",
5345
5361
  coreSmasherDescription: "Medvetandet som förvandlar ett grepp till en krossande smäll.",
@@ -5527,6 +5543,8 @@ const C = {
5527
5543
  coreRosterSkillPoints: "DOŚWIADCZENIE NUKLEICZNE",
5528
5544
  coreRosterNext: "NASTĘPNE ODBLOKOWANIE",
5529
5545
  coreRosterNoNext: "Nie zdefiniowano kolejnego odblokowania.",
5546
+ coreRosterScrollUp: "Pokaż wcześniejsze elewacje",
5547
+ coreRosterScrollDown: "Pokaż więcej elewacji",
5530
5548
  coreOriginStyleDescription: "Chwytaj, przeciągaj i rzucaj wrogami, zmieniając ich w amunicję.",
5531
5549
  coreSmasherTitle: "SANG PENGHANCUR",
5532
5550
  coreSmasherDescription: "Świadomość, która zmienia chwyt w miażdżące uderzenie.",
@@ -5714,6 +5732,8 @@ const C = {
5714
5732
  coreRosterSkillPoints: "PENGALAMAN NUKLEAT",
5715
5733
  coreRosterNext: "PEMBUKAAN BERIKUTNYA",
5716
5734
  coreRosterNoNext: "Belum ada pembukaan lain.",
5735
+ coreRosterScrollUp: "Lihat elevasi sebelumnya",
5736
+ coreRosterScrollDown: "Lihat elevasi lainnya",
5717
5737
  coreOriginStyleDescription: "Tangkap, seret, dan lempar musuh untuk mengubahnya menjadi amunisi.",
5718
5738
  coreSmasherTitle: "EZİCİ",
5719
5739
  coreSmasherDescription: "Kesadaran yang mengubah cengkeraman menjadi hantaman penghancur.",
@@ -5901,6 +5921,8 @@ const C = {
5901
5921
  coreRosterSkillPoints: "NÜKLEİK DENEYİM",
5902
5922
  coreRosterNext: "SONRAKİ AÇILIM",
5903
5923
  coreRosterNoNext: "Başka açılım tanımlanmadı.",
5924
+ coreRosterScrollUp: "Önceki yükselişleri gör",
5925
+ coreRosterScrollDown: "Daha fazla yükseliş gör",
5904
5926
  coreOriginStyleDescription: "Düşmanları yakala, sürükle ve fırlat; onları mühimmata dönüştür.",
5905
5927
  coreSmasherTitle: "КРУШИТЕЛЬ",
5906
5928
  coreSmasherDescription: "Kavrayışı ezici bir darbeye dönüştüren bilinç.",
@@ -6088,6 +6110,8 @@ const C = {
6088
6110
  coreRosterSkillPoints: "НУКЛЕИЧЕСКИЙ ОПЫТ",
6089
6111
  coreRosterNext: "СЛЕДУЮЩЕЕ ОТКРЫТИЕ",
6090
6112
  coreRosterNoNext: "Следующее открытие не определено.",
6113
+ coreRosterScrollUp: "Показать предыдущие возвышения",
6114
+ coreRosterScrollDown: "Показать другие возвышения",
6091
6115
  coreOriginStyleDescription: "Хватайте, тащите и бросайте врагов, превращая их в боеприпасы.",
6092
6116
  coreSmasherTitle: "スマッシャー",
6093
6117
  coreSmasherDescription: "Сознание, превращающее захват в сокрушительный удар.",
@@ -6275,6 +6299,8 @@ const C = {
6275
6299
  coreRosterSkillPoints: "ヌクレア経験",
6276
6300
  coreRosterNext: "次のアンロック",
6277
6301
  coreRosterNoNext: "次のアンロックは未定義です。",
6302
+ coreRosterScrollUp: "前のエレベーションを見る",
6303
+ coreRosterScrollDown: "さらにエレベーションを見る",
6278
6304
  coreOriginStyleDescription: "敵をつかみ、引き寄せ、投げて弾薬に変える。",
6279
6305
  coreSmasherTitle: "THE SMASHER",
6280
6306
  coreSmasherDescription: "つかんだものを粉砕の一撃に変える意識。",
@@ -6462,6 +6488,8 @@ const C = {
6462
6488
  coreRosterSkillPoints: "뉴클레익 경험",
6463
6489
  coreRosterNext: "다음 해금",
6464
6490
  coreRosterNoNext: "다음 해금은 정의되지 않았습니다.",
6491
+ coreRosterScrollUp: "이전 엘리베이션 보기",
6492
+ coreRosterScrollDown: "더 많은 엘리베이션 보기",
6465
6493
  coreOriginStyleDescription: "적을 붙잡고 끌어당기고 던져 탄약으로 바꿉니다.",
6466
6494
  coreSmasherTitle: "분쇄기",
6467
6495
  coreSmasherDescription: "붙잡기를 분쇄의 일격으로 바꾸는 의식입니다.",
@@ -6649,6 +6677,8 @@ const C = {
6649
6677
  coreRosterSkillPoints: "核质经验",
6650
6678
  coreRosterNext: "下一个解锁",
6651
6679
  coreRosterNoNext: "尚未定义下一个解锁。",
6680
+ coreRosterScrollUp: "查看之前的晋升",
6681
+ coreRosterScrollDown: "查看更多晋升",
6652
6682
  coreOriginStyleDescription: "抓住、拖拽并投掷敌人,将其变成弹药。",
6653
6683
  coreSmasherTitle: "粉碎者",
6654
6684
  coreSmasherDescription: "将抓取转化为粉碎一击的意识。",
@@ -6741,6 +6771,7 @@ const C = {
6741
6771
  objectivesSubtitle: "MISIÓN • DESAFÍO • LOGRO",
6742
6772
  objectivesMissions: "MISIONES",
6743
6773
  objectivesChallenges: "DESAFÍOS",
6774
+ challengeSingular: "DESAFÍO",
6744
6775
  objectivesAchievements: "LOGROS",
6745
6776
  objectiveSystemHint: "ELIGE TU PRÓXIMO PROPÓSITO",
6746
6777
  objectiveNoObjectives: "SIN OBJETIVOS DISPONIBLES",
@@ -6767,6 +6798,7 @@ const C = {
6767
6798
  objectivesSubtitle: "MISSION • CHALLENGE • ACHIEVEMENT",
6768
6799
  objectivesMissions: "MISSIONS",
6769
6800
  objectivesChallenges: "CHALLENGES",
6801
+ challengeSingular: "CHALLENGE",
6770
6802
  objectivesAchievements: "ACHIEVEMENTS",
6771
6803
  objectiveSystemHint: "CHOOSE YOUR NEXT PURPOSE",
6772
6804
  objectiveNoObjectives: "NO OBJECTIVES AVAILABLE",
@@ -6793,6 +6825,7 @@ const C = {
6793
6825
  objectivesSubtitle: "MISSION • DÉFI • SUCCÈS",
6794
6826
  objectivesMissions: "MISSIONS",
6795
6827
  objectivesChallenges: "DÉFIS",
6828
+ challengeSingular: "DÉFI",
6796
6829
  objectivesAchievements: "SUCCÈS",
6797
6830
  objectiveSystemHint: "CHOISISSEZ VOTRE PROCHAIN BUT",
6798
6831
  objectiveNoObjectives: "AUCUN OBJECTIF DISPONIBLE",
@@ -6819,6 +6852,7 @@ const C = {
6819
6852
  objectivesSubtitle: "MISSION • HERAUSFORDERUNG • ERFOLG",
6820
6853
  objectivesMissions: "MISSIONEN",
6821
6854
  objectivesChallenges: "HERAUSFORDERUNGEN",
6855
+ challengeSingular: "HERAUSFORDERUNG",
6822
6856
  objectivesAchievements: "ERFOLGE",
6823
6857
  objectiveSystemHint: "WÄHLE DEIN NÄCHSTES ZIEL",
6824
6858
  objectiveNoObjectives: "KEINE ZIELE VERFÜGBAR",
@@ -6845,6 +6879,7 @@ const C = {
6845
6879
  objectivesSubtitle: "MISSIONE • SFIDA • OBIETTIVO",
6846
6880
  objectivesMissions: "MISSIONI",
6847
6881
  objectivesChallenges: "SFIDE",
6882
+ challengeSingular: "SFIDA",
6848
6883
  objectivesAchievements: "OBIETTIVI",
6849
6884
  objectiveSystemHint: "SCEGLI IL TUO PROSSIMO SCOPO",
6850
6885
  objectiveNoObjectives: "NESSUN OBIETTIVO DISPONIBILE",
@@ -6871,6 +6906,7 @@ const C = {
6871
6906
  objectivesSubtitle: "MISSÃO • DESAFIO • CONQUISTA",
6872
6907
  objectivesMissions: "MISSÕES",
6873
6908
  objectivesChallenges: "DESAFIOS",
6909
+ challengeSingular: "DESAFIO",
6874
6910
  objectivesAchievements: "CONQUISTAS",
6875
6911
  objectiveSystemHint: "ESCOLHE O TEU PRÓXIMO PROPÓSITO",
6876
6912
  objectiveNoObjectives: "SEM OBJETIVOS DISPONÍVEIS",
@@ -6897,6 +6933,7 @@ const C = {
6897
6933
  objectivesSubtitle: "MISSIE • UITDAGING • PRESTATIE",
6898
6934
  objectivesMissions: "MISSIES",
6899
6935
  objectivesChallenges: "UITDAGINGEN",
6936
+ challengeSingular: "UITDAGING",
6900
6937
  objectivesAchievements: "PRESTATIES",
6901
6938
  objectiveSystemHint: "KIES JE VOLGENDE DOEL",
6902
6939
  objectiveNoObjectives: "GEEN DOELEN BESCHIKBAAR",
@@ -6923,6 +6960,7 @@ const C = {
6923
6960
  objectivesSubtitle: "UPPDRAG • UTMANING • PRESTATION",
6924
6961
  objectivesMissions: "UPPDRAG",
6925
6962
  objectivesChallenges: "UTMANINGAR",
6963
+ challengeSingular: "UTMANING",
6926
6964
  objectivesAchievements: "PRESTATIONER",
6927
6965
  objectiveSystemHint: "VÄLJ DITT NÄSTA MÅL",
6928
6966
  objectiveNoObjectives: "INGA MÅL TILLGÄNGLIGA",
@@ -6949,6 +6987,7 @@ const C = {
6949
6987
  objectivesSubtitle: "MISJA • WYZWANIE • OSIĄGNIĘCIE",
6950
6988
  objectivesMissions: "MISJE",
6951
6989
  objectivesChallenges: "WYZWANIA",
6990
+ challengeSingular: "WYZWANIE",
6952
6991
  objectivesAchievements: "OSIĄGNIĘCIA",
6953
6992
  objectiveSystemHint: "WYBIERZ NASTĘPNY CEL",
6954
6993
  objectiveNoObjectives: "BRAK DOSTĘPNYCH CELÓW",
@@ -6975,6 +7014,7 @@ const C = {
6975
7014
  objectivesSubtitle: "MISI • TANTANGAN • PENCAPAIAN",
6976
7015
  objectivesMissions: "MISI",
6977
7016
  objectivesChallenges: "TANTANGAN",
7017
+ challengeSingular: "TANTANGAN",
6978
7018
  objectivesAchievements: "PENCAPAIAN",
6979
7019
  objectiveSystemHint: "PILIH TUJUAN BERIKUTNYA",
6980
7020
  objectiveNoObjectives: "TIDAK ADA TUJUAN",
@@ -7001,6 +7041,7 @@ const C = {
7001
7041
  objectivesSubtitle: "GÖREV • MEYDAN OKUMA • BAŞARIM",
7002
7042
  objectivesMissions: "GÖREVLER",
7003
7043
  objectivesChallenges: "MEYDAN OKUMALAR",
7044
+ challengeSingular: "MEYDAN OKUMA",
7004
7045
  objectivesAchievements: "BAŞARIMLAR",
7005
7046
  objectiveSystemHint: "SONRAKİ AMACINI SEÇ",
7006
7047
  objectiveNoObjectives: "KULLANILABİLİR HEDEF YOK",
@@ -7027,6 +7068,7 @@ const C = {
7027
7068
  objectivesSubtitle: "МИССИЯ • ИСПЫТАНИЕ • ДОСТИЖЕНИЕ",
7028
7069
  objectivesMissions: "МИССИИ",
7029
7070
  objectivesChallenges: "ИСПЫТАНИЯ",
7071
+ challengeSingular: "ИСПЫТАНИЕ",
7030
7072
  objectivesAchievements: "ДОСТИЖЕНИЯ",
7031
7073
  objectiveSystemHint: "ВЫБЕРИТЕ СЛЕДУЮЩУЮ ЦЕЛЬ",
7032
7074
  objectiveNoObjectives: "НЕТ ДОСТУПНЫХ ЦЕЛЕЙ",
@@ -7053,6 +7095,7 @@ const C = {
7053
7095
  objectivesSubtitle: "ミッション • チャレンジ • 実績",
7054
7096
  objectivesMissions: "ミッション",
7055
7097
  objectivesChallenges: "チャレンジ",
7098
+ challengeSingular: "チャレンジ",
7056
7099
  objectivesAchievements: "実績",
7057
7100
  objectiveSystemHint: "次の目的を選択",
7058
7101
  objectiveNoObjectives: "利用可能な目標はありません",
@@ -7079,6 +7122,7 @@ const C = {
7079
7122
  objectivesSubtitle: "임무 • 도전 • 업적",
7080
7123
  objectivesMissions: "임무",
7081
7124
  objectivesChallenges: "도전",
7125
+ challengeSingular: "도전",
7082
7126
  objectivesAchievements: "업적",
7083
7127
  objectiveSystemHint: "다음 목적을 선택하세요",
7084
7128
  objectiveNoObjectives: "사용 가능한 목표가 없습니다",
@@ -7105,6 +7149,7 @@ const C = {
7105
7149
  objectivesSubtitle: "任务 • 挑战 • 成就",
7106
7150
  objectivesMissions: "任务",
7107
7151
  objectivesChallenges: "挑战",
7152
+ challengeSingular: "挑战",
7108
7153
  objectivesAchievements: "成就",
7109
7154
  objectiveSystemHint: "选择你的下一个目标",
7110
7155
  objectiveNoObjectives: "没有可用目标",
@@ -7965,7 +8010,7 @@ const xa = {
7965
8010
  };
7966
8011
  for (const [r, e] of Object.entries(xa))
7967
8012
  Object.assign(C[r], e);
7968
- const ba = {
8013
+ const Sa = {
7969
8014
  es: {
7970
8015
  codexSporeLore: "Organismo tóxico que convierte el rechazo en una reunión útil.",
7971
8016
  codexClusterLore: "Energía dopaminérgica contenida en una criatura que no sabe bajar el ritmo.",
@@ -8897,9 +8942,9 @@ const ba = {
8897
8942
  codexHeavyEntryCaused6: "最后一次放电落下时,大寂静仍在寻找最弱者。它在一个已经无用的地方继续执行使命,并因此哭泣。"
8898
8943
  }
8899
8944
  };
8900
- for (const [r, e] of Object.entries(ba))
8945
+ for (const [r, e] of Object.entries(Sa))
8901
8946
  Object.assign(C[r], e);
8902
- const Sa = {
8947
+ const ba = {
8903
8948
  es: {
8904
8949
  codexPiercerLore: "Criatura puntiaguda que atraviesa la materia siguiendo campos electromagnéticos.",
8905
8950
  codexParasiteLore: "Criatura social que convierte cada encuentro en un abrazo gravitatorio."
@@ -8961,7 +9006,7 @@ const Sa = {
8961
9006
  codexParasiteLore: "把每次相遇都变成引力拥抱的社交生物。"
8962
9007
  }
8963
9008
  };
8964
- for (const [r, e] of Object.entries(Sa))
9009
+ for (const [r, e] of Object.entries(ba))
8965
9010
  Object.assign(C[r], e);
8966
9011
  const Ca = ["es", "en", "fr", "de", "it", "pt", "nl", "sv", "pl", "id", "tr", "ru", "ja", "ko", "zh"];
8967
9012
  function re(r) {
@@ -9701,7 +9746,7 @@ class Ka {
9701
9746
  }
9702
9747
  renderSkinSelector(e, t) {
9703
9748
  const a = t.id === "core-default" ? "DEFAULT" : t.id.replace("core-", "").replaceAll("-", " ").toUpperCase(), i = this.getSkinStatus(t);
9704
- return `<button type="button" class="axon-core-skin-selector-entry ${this.getSkinStateClass(t)}" data-core-action="equip-skin" data-core-id="${e.id}" data-skin-id="${t.id}" ${this.getDisabledAttribute(t.unlocked)} aria-label="${a} · ${i}" aria-pressed="${t.selected}"><span class="axon-core-skin-portrait"><canvas class="axon-core-skin-miniature" width="120" height="120" data-skin-preview-id="${t.id}" data-skin-preview-silhouette="${t.unlocked ? "false" : "true"}" aria-hidden="true"></canvas></span>${this.renderSelectionMark()}</button>`;
9749
+ return `<button type="button" class="axon-core-skin-selector-entry ${this.getSkinStateClass(t)}" data-core-action="equip-skin" data-core-id="${e.id}" data-skin-id="${t.id}" ${this.getDisabledAttribute(t.unlocked)} aria-label="${a} · ${i}" aria-pressed="${t.selected}"><span class="axon-core-skin-portrait"><canvas class="axon-core-skin-miniature" width="120" height="120" data-skin-preview-id="${t.id}" data-skin-preview-silhouette="${t.unlocked ? "false" : "true"}" aria-hidden="true"></canvas></span></button>`;
9705
9750
  }
9706
9751
  getSkinStatus(e) {
9707
9752
  return e.selected ? this.i18n.translate("coreRosterSelected") : e.unlocked ? this.i18n.translate("coreRosterSelect") : this.i18n.translate("coreRosterLocked");
@@ -9712,9 +9757,6 @@ class Ka {
9712
9757
  getDisabledAttribute(e) {
9713
9758
  return e ? "" : "disabled";
9714
9759
  }
9715
- renderSelectionMark() {
9716
- return '<svg class="axon-core-skin-selected-mark" viewBox="0 0 24 24" aria-hidden="true"><path d="m12 3 2.1 6.1L20 12l-5.9 2.1L12 21l-2.1-6.9L4 12l5.9-2.9L12 3Z"/></svg>';
9717
- }
9718
9760
  renderOrganicGrowthIcon() {
9719
9761
  return '<svg viewBox="0 0 44 44" role="img" aria-hidden="true"><circle cx="22" cy="22" r="3.2"/><ellipse cx="22" cy="22" rx="17" ry="7"/><ellipse cx="22" cy="22" rx="17" ry="7" transform="rotate(60 22 22)"/><ellipse cx="22" cy="22" rx="17" ry="7" transform="rotate(-60 22 22)"/><circle class="axon-atom-electron" cx="39" cy="22" r="2.3"/><circle class="axon-atom-electron" cx="13.5" cy="7.3" r="2.3"/><circle class="axon-atom-electron" cx="13.5" cy="36.7" r="2.3"/></svg>';
9720
9762
  }
@@ -9739,7 +9781,10 @@ class Ka {
9739
9781
  }
9740
9782
  renderSkillTree(e) {
9741
9783
  const t = this.getWisdomProgress(e), a = e.wisdomTrack.map((i, o) => this.renderElevationRow(i, o, e.profile.wisdomLevel, t)).join("");
9742
- return `<div class="axon-core-tree-layout"><section class="axon-core-elevation-ledger"><header class="axon-core-elevation-ledger-header"><div><span>${this.i18n.translate("coreRosterWisdom")}</span><strong>${e.profile.wisdomLevel}/${e.wisdomTrack.length}</strong></div><div class="axon-core-elevation-legend"><span class="is-complete">${this.i18n.translate("coreRosterCurrent")}</span><span class="is-next">${this.i18n.translate("coreRosterNext")}</span><span class="is-locked">${this.i18n.translate("coreRosterLocked")}</span></div></header><div class="axon-core-elevation-list">${a}</div></section></div>`;
9784
+ return `<div class="axon-core-tree-layout"><section class="axon-core-elevation-ledger"><header class="axon-core-elevation-ledger-header"><div><span>${this.i18n.translate("coreRosterWisdom")}</span><strong>${e.profile.wisdomLevel}/${e.wisdomTrack.length}</strong></div><div class="axon-core-elevation-legend"><span class="is-complete">${this.i18n.translate("coreRosterCurrent")}</span><span class="is-next">${this.i18n.translate("coreRosterNext")}</span><span class="is-locked">${this.i18n.translate("coreRosterLocked")}</span></div></header><div class="axon-core-elevation-list-shell"><button type="button" class="axon-core-elevation-scroll-button axon-core-elevation-scroll-up" data-elevation-scroll="up" aria-label="${this.i18n.translate("coreRosterScrollUp")}" hidden>${this.renderScrollArrow("up")}</button><div class="axon-core-elevation-list">${a}</div><button type="button" class="axon-core-elevation-scroll-button axon-core-elevation-scroll-down" data-elevation-scroll="down" aria-label="${this.i18n.translate("coreRosterScrollDown")}" hidden>${this.renderScrollArrow("down")}</button></div></section></div>`;
9785
+ }
9786
+ renderScrollArrow(e) {
9787
+ return `<svg viewBox="0 0 24 24" aria-hidden="true"><path d="m5 9 7 7 7-7" transform="${e === "up" ? "rotate(180 12 12)" : ""}"/></svg>`;
9743
9788
  }
9744
9789
  renderElevationRow(e, t, a, i) {
9745
9790
  const o = this.getElevationRowState(t, a), n = this.getElevationRowStateLabel(o), s = o === "next" ? i : 0;
@@ -9810,7 +9855,9 @@ class Fa {
9810
9855
  }
9811
9856
  render() {
9812
9857
  const e = this.roster.getSnapshots(), t = this.previewCoreId ? this.roster.getSnapshot(this.previewCoreId) : this.roster.getSelectedCore();
9813
- this.stopPreview(), this.container.innerHTML = this.view === "elevations" ? this.renderElevationsMarkup(t) : this.renderMarkup(e, t), this.bindEvents(), this.isOpen && this.startPreview();
9858
+ this.stopPreview();
9859
+ const a = this.view === "elevations";
9860
+ this.container.classList.toggle("axon-core-roster-elevations-view", a), this.container.innerHTML = this.view === "elevations" ? this.renderElevationsMarkup(t) : this.renderMarkup(e, t), this.bindEvents(), this.isOpen && this.startPreview();
9814
9861
  }
9815
9862
  renderMarkup(e, t) {
9816
9863
  return `<div class="axon-core-roster-shell axon-core-roster-immersive-shell axon-genetic-memory-shell">${this.renderHeader()}<p class="axon-core-roster-hint">${this.i18n.translate("coreRosterHint")}</p><div class="axon-core-roster-stage"><nav class="axon-core-roster-selector" aria-label="${this.i18n.translate("coreRosterTitle")}"><div class="axon-core-selector-heading"><span>${this.i18n.translate("coreRosterCombatProfile")}</span><small>${this.i18n.translate("coreRosterSelected")}</small></div><div class="axon-core-selector-list">${e.map((a, i) => this.renderer.renderSelector(a, i)).join("")}</div></nav><main class="axon-core-showcase" data-accent="${t.accent}">${this.renderer.renderShowcase(t)}</main></div></div>`;
@@ -9824,7 +9871,28 @@ class Fa {
9824
9871
  bindEvents() {
9825
9872
  this.container.querySelector("#axon-core-roster-close")?.addEventListener("click", this.onClose), this.container.querySelectorAll("[data-core-action]").forEach((e) => {
9826
9873
  e.addEventListener("click", () => this.handleCoreAction(e));
9827
- });
9874
+ }), this.bindElevationScrollControls();
9875
+ }
9876
+ bindElevationScrollControls() {
9877
+ const e = this.container.querySelector(".axon-core-elevation-list");
9878
+ e && (this.container.querySelectorAll("[data-elevation-scroll]").forEach((t) => {
9879
+ t.addEventListener("click", () => this.scrollElevations(e, t.dataset.elevationScroll === "up" ? -1 : 1));
9880
+ }), e.addEventListener("scroll", () => this.updateElevationScrollControls(e)), this.focusCurrentElevation(e), this.updateElevationScrollControls(e));
9881
+ }
9882
+ focusCurrentElevation(e) {
9883
+ const t = [...e.querySelectorAll(".axon-core-elevation-row")], a = e.querySelector(".axon-core-elevation-next") ?? t[t.length - 1];
9884
+ if (!a) return;
9885
+ const i = a.offsetTop - Math.max(0, (e.clientHeight - a.offsetHeight) / 2);
9886
+ e.scrollTop = Math.max(0, i);
9887
+ }
9888
+ scrollElevations(e, t) {
9889
+ e.scrollBy({ top: t * Math.max(120, e.clientHeight * 0.72), behavior: "smooth" });
9890
+ }
9891
+ updateElevationScrollControls(e) {
9892
+ const t = [...this.container.querySelectorAll("[data-elevation-scroll]")], a = t.find((n) => n.dataset.elevationScroll === "up"), i = t.find((n) => n.dataset.elevationScroll === "down");
9893
+ if (!a || !i) return;
9894
+ const o = e.scrollHeight > e.clientHeight + 2;
9895
+ a.hidden = !o, i.hidden = !o, a.disabled = e.scrollTop <= 2, i.disabled = e.scrollTop + e.clientHeight >= e.scrollHeight - 2;
9828
9896
  }
9829
9897
  handleCoreAction(e) {
9830
9898
  const t = e.dataset.coreAction;
@@ -10179,7 +10247,7 @@ class Va {
10179
10247
  return `
10180
10248
  <div class="axon-title-halo">
10181
10249
  <h1 class="axon-title">${this.i18n.translate("title")}</h1>
10182
- <p class="axon-version-mark">v0.38.0</p>
10250
+ <p class="axon-version-mark">v0.40.0</p>
10183
10251
  <button id="axon-start-btn" class="axon-start-button">${this.i18n.translate("startButton")}</button>
10184
10252
  ${this.renderSecondaryActions()}
10185
10253
  </div>
@@ -10513,11 +10581,11 @@ class L {
10513
10581
  this.accentColor = null, this.eyeProfile = "none", this.visualProfile = "default", this.variantState = {}, this.variantTrail = [], this.strategy = null;
10514
10582
  }
10515
10583
  }
10516
- const b = (r, e, t) => r?.[e] ?? t, Ee = (r, e) => r?.[e] ?? null, Ja = (r, e) => ({
10584
+ const S = (r, e, t) => r?.[e] ?? t, Ee = (r, e) => r?.[e] ?? null, Ja = (r, e) => ({
10517
10585
  ...r.behavior,
10518
10586
  ...e?.behaviorOverrides ?? {}
10519
10587
  }), Xa = (r, e) => e.synergyKey ?? e.behavior.synergyKey?.(r) ?? e.id, Qa = (r) => r.initialRotation === "random" ? Math.random() * Math.PI * 2 : 0, ei = (r, e) => {
10520
- const t = b(e, "canBeManipulatedByCore", !0);
10588
+ const t = S(e, "canBeManipulatedByCore", !0);
10521
10589
  return {
10522
10590
  variantId: Ee(e, "id"),
10523
10591
  variantRendererId: Ee(e, "rendererId"),
@@ -10525,15 +10593,15 @@ const b = (r, e, t) => r?.[e] ?? t, Ee = (r, e) => r?.[e] ?? null, Ja = (r, e) =
10525
10593
  isGrabbed: !1,
10526
10594
  isThrown: !1,
10527
10595
  canBeManipulatedByCore: t,
10528
- canBeDamagedByCore: b(e, "canBeDamagedByCore", !0),
10529
- canBeKilledByCoreRepelWave: b(e, "canBeKilledByCoreRepelWave", !1),
10596
+ canBeDamagedByCore: S(e, "canBeDamagedByCore", !0),
10597
+ canBeKilledByCoreRepelWave: S(e, "canBeKilledByCoreRepelWave", !1),
10530
10598
  isGrabbable: !!r.canBeGrabbed && t,
10531
- variantPulseInterval: b(e, "pulseInterval", 0),
10599
+ variantPulseInterval: S(e, "pulseInterval", 0),
10532
10600
  variantPulseTimer: 0,
10533
- blocksFrontImpacts: b(e, "blocksFrontImpacts", !1),
10534
- frontCoverageArc: b(e, "frontCoverageArc", 0),
10535
- frontCoverageRadiusMultiplier: b(e, "frontCoverageRadiusMultiplier", 1),
10536
- visualProfile: b(e, "visualProfile", "default"),
10601
+ blocksFrontImpacts: S(e, "blocksFrontImpacts", !1),
10602
+ frontCoverageArc: S(e, "frontCoverageArc", 0),
10603
+ frontCoverageRadiusMultiplier: S(e, "frontCoverageRadiusMultiplier", 1),
10604
+ visualProfile: S(e, "visualProfile", "default"),
10537
10605
  variantState: {},
10538
10606
  variantTrail: []
10539
10607
  };
@@ -10560,7 +10628,7 @@ class ti {
10560
10628
  Object.assign(e, ei(t, a));
10561
10629
  }
10562
10630
  applyDefinition(e, t, a) {
10563
- 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 = Ja(t, a), e.synergyKey = Xa(e, t), e.maxSpeed = t.maxSpeed * b(a, "maxSpeedMultiplier", 1), e.rotation = Qa(t);
10631
+ 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 = Ja(t, a), e.synergyKey = Xa(e, t), e.maxSpeed = t.maxSpeed * S(a, "maxSpeedMultiplier", 1), e.rotation = Qa(t);
10564
10632
  }
10565
10633
  applyMotion(e, t, a, i) {
10566
10634
  e.position = { ...t };
@@ -11079,7 +11147,7 @@ const ii = (r) => ({
11079
11147
  const e = r.getConfig().cluster;
11080
11148
  r.updateConfig({ cluster: { ...e, hasHoming: !0 } });
11081
11149
  }
11082
- }), bi = (r) => ({
11150
+ }), Si = (r) => ({
11083
11151
  id: "piercer_aoe",
11084
11152
  titleKey: "pu_piercer_aoe_title",
11085
11153
  descKey: "pu_piercer_aoe_desc",
@@ -11093,7 +11161,7 @@ const ii = (r) => ({
11093
11161
  const e = r.getConfig().piercer;
11094
11162
  r.updateConfig({ piercer: { ...e, terminalAoERadius: (e.terminalAoERadius || 0) + 160 } });
11095
11163
  }
11096
- }), Si = (r) => ({
11164
+ }), bi = (r) => ({
11097
11165
  id: "piercer_homing",
11098
11166
  requiredUnlockId: "piercer_homing",
11099
11167
  requiredEnemyId: "piercer",
@@ -11131,8 +11199,8 @@ const ii = (r) => ({
11131
11199
  vi(r),
11132
11200
  fi(r),
11133
11201
  xi(r),
11134
- bi(r),
11135
11202
  Si(r),
11203
+ bi(r),
11136
11204
  Ci(r)
11137
11205
  ], Ii = (r) => [
11138
11206
  ...ui(r),
@@ -12399,17 +12467,17 @@ function xo(r) {
12399
12467
  const e = /* @__PURE__ */ new Set();
12400
12468
  for (const [t, a] of Object.entries(r))
12401
12469
  for (const i of a)
12402
- bo(i.id, t, i.condition.target, e);
12470
+ So(i.id, t, i.condition.target, e);
12403
12471
  return r;
12404
12472
  }
12405
- function bo(r, e, t, a) {
12473
+ function So(r, e, t, a) {
12406
12474
  const i = `${e}:${r}`;
12407
12475
  if (!r || a.has(i)) throw new Error(`Duplicate or empty ${e} objective: ${r}`);
12408
12476
  if (t <= 0 || !Number.isFinite(t))
12409
12477
  throw new Error(`Invalid ${e} objective target: ${r}`);
12410
12478
  a.add(i);
12411
12479
  }
12412
- function So(r, e) {
12480
+ function bo(r, e) {
12413
12481
  const t = Co(e);
12414
12482
  if (!r) return t;
12415
12483
  try {
@@ -12494,7 +12562,7 @@ function Z(r) {
12494
12562
  function ue(r) {
12495
12563
  return Object.fromEntries(r);
12496
12564
  }
12497
- const wo = 2, qe = 1, ko = 480 * 60 * 1e3, S = () => ({
12565
+ const wo = 2, qe = 1, ko = 480 * 60 * 1e3, b = () => ({
12498
12566
  progress: 0,
12499
12567
  completed: !1,
12500
12568
  claimed: !1,
@@ -12547,7 +12615,7 @@ class Oo {
12547
12615
  return (e ? this.getDefinitions(e) : [...this.definitions.missions, ...this.definitions.challenges, ...this.definitions.achievements]).filter((a) => e !== "mission" || this.activeMissionIds.includes(a.id)).map((a) => this.getSnapshot(a.kind, a.id));
12548
12616
  }
12549
12617
  getSnapshot(e, t) {
12550
- const a = this.getDefinition(e, t), i = this.progress.get(e).get(t) ?? S(), o = {
12618
+ const a = this.getDefinition(e, t), i = this.progress.get(e).get(t) ?? b(), o = {
12551
12619
  ...i,
12552
12620
  kind: e,
12553
12621
  id: t,
@@ -12560,7 +12628,7 @@ class Oo {
12560
12628
  return n.rules !== void 0 && (o.rules = n.rules), n.preset !== void 0 && (o.preset = n.preset), n.requiredCoreId !== void 0 && (o.requiredCoreId = n.requiredCoreId), n.providerId !== void 0 && (o.providerId = n.providerId), o;
12561
12629
  }
12562
12630
  installMission(e, t = Date.now()) {
12563
- this.missionDefinitions.set(e.id, e), this.progress.get("mission").set(e.id, S()), this.activeMissionIds = [e.id], this.missionAssignedAt = t, this.persist(), this.notify({ kind: "mission", id: e.id, type: "rotated" });
12631
+ this.missionDefinitions.set(e.id, e), this.progress.get("mission").set(e.id, b()), this.activeMissionIds = [e.id], this.missionAssignedAt = t, this.persist(), this.notify({ kind: "mission", id: e.id, type: "rotated" });
12564
12632
  }
12565
12633
  canRerollMission(e = Date.now()) {
12566
12634
  return !!(this.getSnapshots("mission")[0] && (this.missionRerolls > 0 || e - this.missionAssignedAt >= ko));
@@ -12583,13 +12651,13 @@ class Oo {
12583
12651
  }
12584
12652
  startChallenge(e, t) {
12585
12653
  if (!this.canStartChallenge(e, t)) return !1;
12586
- const a = this.progress.get("challenge").get(e) ?? S();
12587
- return this.progress.get("challenge").set(e, { ...S(), claims: a.claims }), this.activeChallengeId = e, this.persist(), this.notify({ kind: "challenge", id: e, type: "challenge-started" }), !0;
12654
+ const a = this.progress.get("challenge").get(e) ?? b();
12655
+ return this.progress.get("challenge").set(e, { ...b(), claims: a.claims }), this.activeChallengeId = e, this.persist(), this.notify({ kind: "challenge", id: e, type: "challenge-started" }), !0;
12588
12656
  }
12589
12657
  cancelActiveChallenge() {
12590
12658
  if (!this.activeChallengeId) return;
12591
- const e = this.activeChallengeId, t = this.progress.get("challenge").get(e) ?? S();
12592
- t.completed || (this.progress.get("challenge").set(e, { ...S(), claims: t.claims }), this.notify({ kind: "challenge", id: e, type: "challenge-failed" })), this.activeChallengeId = null, this.persist();
12659
+ const e = this.activeChallengeId, t = this.progress.get("challenge").get(e) ?? b();
12660
+ t.completed || (this.progress.get("challenge").set(e, { ...b(), claims: t.claims }), this.notify({ kind: "challenge", id: e, type: "challenge-failed" })), this.activeChallengeId = null, this.persist();
12593
12661
  }
12594
12662
  getDefinitions(e) {
12595
12663
  return Mo(this.definitions, this.missionDefinitions, e);
@@ -12626,10 +12694,10 @@ class Oo {
12626
12694
  hydrateDefaults() {
12627
12695
  for (const e of ["mission", "challenge", "achievement"])
12628
12696
  for (const t of this.getDefinitions(e))
12629
- this.progress.get(e).set(t.id, S());
12697
+ this.progress.get(e).set(t.id, b());
12630
12698
  }
12631
12699
  load() {
12632
- const e = So(this.storage, this.activeMissionIds);
12700
+ const e = bo(this.storage, this.activeMissionIds);
12633
12701
  e.activeMissionDefinition && this.registerStoredMission(e.activeMissionDefinition), this.loadProgress("mission", e.missions), this.loadProgress("challenge", e.challenges), this.loadProgress("achievement", e.achievements), this.activeMissionIds = this.getKnownMissionIds(e.activeMissionIds), this.missionAssignedAt = e.missionAssignedAt ?? Date.now(), this.missionRerolls = typeof e.missionRerolls == "number" ? Math.max(0, Math.floor(e.missionRerolls)) : 1, this.activeChallengeId = null, this.unlockedRewardIds = new Set(e.unlockedRewardIds), e.version !== wo && this.persist();
12634
12702
  }
12635
12703
  getKnownMissionIds(e) {
@@ -12637,7 +12705,7 @@ class Oo {
12637
12705
  return a.length > 0 ? a : this.definitions.missions.slice(0, qe).map((i) => i.id);
12638
12706
  }
12639
12707
  registerStoredMission(e) {
12640
- this.missionDefinitions.set(e.id, e), this.progress.get("mission").set(e.id, S());
12708
+ this.missionDefinitions.set(e.id, e), this.progress.get("mission").set(e.id, b());
12641
12709
  }
12642
12710
  loadProgress(e, t) {
12643
12711
  const a = this.progress.get(e);
@@ -12676,14 +12744,14 @@ class jo extends Oo {
12676
12744
  }
12677
12745
  claim(e, t) {
12678
12746
  if (e !== "mission") return !1;
12679
- const a = this.getDefinition(e, t), i = this.progress.get(e).get(t) ?? S();
12747
+ const a = this.getDefinition(e, t), i = this.progress.get(e).get(t) ?? b();
12680
12748
  if (!i.completed || i.claimed) return !1;
12681
12749
  for (const n of a.rewards) this.applyReward(n);
12682
12750
  const o = i.claims + 1;
12683
12751
  return this.progress.get(e).set(t, No(e, a, i, o)), this.persist(), this.notify({ kind: e, id: t, type: "claimed" }), !0;
12684
12752
  }
12685
12753
  debugComplete(e, t) {
12686
- const a = this.getDefinition(e, t), i = this.progress.get(e), o = i.get(t) ?? S();
12754
+ const a = this.getDefinition(e, t), i = this.progress.get(e), o = i.get(t) ?? b();
12687
12755
  return i.set(t, {
12688
12756
  ...o,
12689
12757
  progress: a.condition.target,
@@ -12698,7 +12766,7 @@ class jo extends Oo {
12698
12766
  for (const i of t) this.updateDefinition(i, a);
12699
12767
  }
12700
12768
  updateDefinition(e, t) {
12701
- const a = this.progress.get(e.kind), i = a.get(e.id) ?? S();
12769
+ const a = this.progress.get(e.kind), i = a.get(e.id) ?? b();
12702
12770
  if (i.completed || !_o(e.condition, t)) return;
12703
12771
  const o = Math.max(1, Math.floor(t.amount ?? 1)), n = Lo(e.condition.event, i.progress, o), s = n >= e.condition.target;
12704
12772
  a.set(e.id, {
@@ -13643,7 +13711,7 @@ const rn = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13643
13711
  const t = e.right - e.left, a = e.bottom - e.top, i = gt(e);
13644
13712
  let o = Me(r) * i;
13645
13713
  return o <= t ? { x: e.left + o, y: e.top } : (o -= t, o <= a ? { x: e.right, y: e.top + o } : (o -= a, o <= t ? { x: e.right - o, y: e.bottom } : (o -= t, { x: e.left, y: e.bottom - o })));
13646
- }, bn = (r, e) => {
13714
+ }, Sn = (r, e) => {
13647
13715
  const t = e.right - e.left, a = e.bottom - e.top;
13648
13716
  return [
13649
13717
  {
@@ -13663,14 +13731,14 @@ const rn = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13663
13731
  progress: 0.75 + (1 - Math.max(0, Math.min(1, (r.y - e.top) / a))) * 0.25
13664
13732
  }
13665
13733
  ].reduce((o, n) => n.distance < o.distance ? n : o).progress;
13666
- }, Sn = (r, e) => {
13734
+ }, bn = (r, e) => {
13667
13735
  const t = Me(r);
13668
13736
  return t < 0.25 ? 0 : t < 0.5 ? Math.PI / 2 : t < 0.75 ? Math.PI : -Math.PI / 2;
13669
13737
  }, Cn = (r, e) => {
13670
13738
  const t = r.variantState;
13671
13739
  if (t.initialized === 1) return;
13672
13740
  const a = mt(r, e.width, e.height);
13673
- t.initialized = 1, t.phase = 0, t.progress = bn(r.position, a), t.direction = Math.random() < 0.5 ? 1 : -1, t.remaining = 0.25, t.perimeterSpeed = 520, t.chargeSpeed = 560;
13741
+ t.initialized = 1, t.phase = 0, t.progress = Sn(r.position, a), t.direction = Math.random() < 0.5 ? 1 : -1, t.remaining = 0.25, t.perimeterSpeed = 520, t.chargeSpeed = 560;
13674
13742
  }, An = (r, e) => {
13675
13743
  const t = r.variantState;
13676
13744
  t.phase = 1;
@@ -13683,7 +13751,7 @@ const rn = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
13683
13751
  return;
13684
13752
  }
13685
13753
  r.position = xn(t.progress, a), r.velocity = { x: 0, y: 0 };
13686
- const o = Sn(t.progress);
13754
+ const o = bn(t.progress);
13687
13755
  r.rotation = (t.direction ?? 1) > 0 ? o : o + Math.PI;
13688
13756
  }, Rn = (r, e) => {
13689
13757
  r.isGrabbed || r.isThrown || (Cn(r, e), r.variantState.phase === 0 && In(r, e));
@@ -14077,7 +14145,7 @@ const rn = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
14077
14145
  canBeDamagedByCore: !0,
14078
14146
  canBeKilledByCoreRepelWave: !1
14079
14147
  }
14080
- ], be = new Fo({
14148
+ ], Se = new Fo({
14081
14149
  enemies: Kn,
14082
14150
  variants: [...Wn, ...qn, ...$n, ...Yn, ...Fn, ...Zn],
14083
14151
  areas: [
@@ -14156,7 +14224,7 @@ const rn = (r, e, t) => e !== r && !t.includes(e) && e.active && !e.isGrabbed &&
14156
14224
  ],
14157
14225
  tutorials: Gn
14158
14226
  });
14159
- be.validate();
14227
+ Se.validate();
14160
14228
  class Jn {
14161
14229
  canvas;
14162
14230
  context;
@@ -14642,19 +14710,19 @@ class vs {
14642
14710
  }
14643
14711
  function fs(r, e) {
14644
14712
  const t = new L("mission-specimen");
14645
- return xs(t, r), bs(t, r, e), t.behavior = Ss(r.behavior, e?.behaviorOverrides), t.position = { x: 0, y: 0 }, t.active = !0, t;
14713
+ return xs(t, r), Ss(t, r, e), t.behavior = bs(r.behavior, e?.behaviorOverrides), t.position = { x: 0, y: 0 }, t.active = !0, t;
14646
14714
  }
14647
14715
  function xs(r, e) {
14648
14716
  r.type = e.id, r.radius = e.radius;
14649
14717
  }
14650
- function bs(r, e, t) {
14718
+ function Ss(r, e, t) {
14651
14719
  if (t) {
14652
14720
  r.variantId = t.id, r.variantRendererId = t.rendererId ?? null, r.color = t.color ?? e.color, r.accentColor = t.accentColor ?? null, r.eyeProfile = t.eyeProfile ?? e.eyeProfile, r.visualProfile = t.visualProfile ?? "default";
14653
14721
  return;
14654
14722
  }
14655
14723
  r.variantId = null, r.variantRendererId = null, r.color = e.color, r.accentColor = null, r.eyeProfile = e.eyeProfile, r.visualProfile = "default";
14656
14724
  }
14657
- function Ss(r, e) {
14725
+ function bs(r, e) {
14658
14726
  return { ...r, ...e ?? {} };
14659
14727
  }
14660
14728
  function Cs(r, e) {
@@ -14901,8 +14969,8 @@ function Ps(r) {
14901
14969
  }
14902
14970
  });
14903
14971
  }
14904
- const Ms = 1500, Ds = 4700;
14905
- class Os {
14972
+ const Ms = 7600;
14973
+ class Ds {
14906
14974
  container;
14907
14975
  i18n;
14908
14976
  onClose;
@@ -14916,9 +14984,7 @@ class Os {
14916
14984
  }
14917
14985
  show(e, t) {
14918
14986
  this.stopTimer(), this.titleKey = e, this.descriptionKey = t, this.phase = "blackout", this.isOpen = !0, this.container.style.display = "flex", this.render(), this.timer = window.setTimeout(() => {
14919
- this.phase = "reveal", this.render(), this.timer = window.setTimeout(() => {
14920
- this.phase = "final", this.render();
14921
- }, Ds);
14987
+ this.phase = "final", this.render();
14922
14988
  }, Ms);
14923
14989
  }
14924
14990
  hide() {
@@ -14934,20 +15000,10 @@ class Os {
14934
15000
  !this.titleKey || !this.descriptionKey || (this.container.dataset.phase = this.phase, this.container.innerHTML = `<div class="axon-challenge-completion-scene">
14935
15001
  <div class="axon-challenge-completion-void"></div>
14936
15002
  <div class="axon-challenge-completion-stars" aria-hidden="true"></div>
14937
- <div class="axon-challenge-completion-echo axon-challenge-echo-one" aria-hidden="true"></div>
14938
- <div class="axon-challenge-completion-echo axon-challenge-echo-two" aria-hidden="true"></div>
14939
15003
  <div class="axon-challenge-completion-announcement">
14940
- <span class="axon-challenge-completion-kicker">${this.i18n.translate("objectivesChallenges")}</span>
15004
+ <span class="axon-challenge-completion-kicker">${this.i18n.translate("challengeSingular")}</span>
14941
15005
  <strong>${this.i18n.translate("objectiveCompleted")}</strong>
14942
15006
  </div>
14943
- <div class="axon-challenge-completion-relic" aria-hidden="true">
14944
- <span class="axon-challenge-completion-orbit axon-challenge-orbit-one"></span>
14945
- <span class="axon-challenge-completion-orbit axon-challenge-orbit-two"></span>
14946
- <span class="axon-challenge-completion-core"></span>
14947
- <span class="axon-challenge-completion-blade"></span>
14948
- <span class="axon-challenge-completion-guard"></span>
14949
- <span class="axon-challenge-completion-hilt"></span>
14950
- </div>
14951
15007
  <div class="axon-challenge-completion-card">
14952
15008
  <span class="axon-challenge-completion-card-kicker">${this.i18n.translate("objectiveCompleted")}</span>
14953
15009
  <h2>${this.i18n.translate(this.titleKey)}</h2>
@@ -14960,7 +15016,7 @@ class Os {
14960
15016
  this.timer !== null && window.clearTimeout(this.timer), this.timer = null;
14961
15017
  }
14962
15018
  }
14963
- class Ns {
15019
+ class Os {
14964
15020
  container;
14965
15021
  i18n;
14966
15022
  onRetry;
@@ -15002,7 +15058,7 @@ class Ns {
15002
15058
  }), this.container.querySelector("[data-challenge-exit]")?.addEventListener("click", this.onExit));
15003
15059
  }
15004
15060
  }
15005
- class Ls {
15061
+ class Ns {
15006
15062
  container;
15007
15063
  i18n;
15008
15064
  timeoutId = null;
@@ -15021,7 +15077,7 @@ class Ls {
15021
15077
  this.timeoutId !== null && window.clearTimeout(this.timeoutId), this.container.remove();
15022
15078
  }
15023
15079
  }
15024
- class _s {
15080
+ class Ls {
15025
15081
  container;
15026
15082
  i18n;
15027
15083
  roster;
@@ -15107,7 +15163,7 @@ class _s {
15107
15163
  this.animationFrame !== null && window.cancelAnimationFrame(this.animationFrame), this.animationFrame = null;
15108
15164
  }
15109
15165
  }
15110
- class js {
15166
+ class _s {
15111
15167
  constructor(e) {
15112
15168
  this.map = e, e.addEventListener("pointerdown", this.handlePointerDown), e.addEventListener("pointermove", this.handlePointerMove), e.addEventListener("pointerup", this.handlePointerUp), e.addEventListener("pointercancel", this.handlePointerUp);
15113
15169
  }
@@ -15133,7 +15189,7 @@ class js {
15133
15189
  };
15134
15190
  }
15135
15191
  const me = 22;
15136
- class Bs {
15192
+ class js {
15137
15193
  constructor(e, t, a, i) {
15138
15194
  this.container = e, this.i18n = t, this.memory = a, this.onNodeSelected = i;
15139
15195
  }
@@ -15200,7 +15256,7 @@ class Bs {
15200
15256
  ${i}`, a.addEventListener("click", () => this.onNodeSelected(e.id)), a;
15201
15257
  }
15202
15258
  }
15203
- class Hs {
15259
+ class Bs {
15204
15260
  container;
15205
15261
  i18n;
15206
15262
  memory;
@@ -15214,14 +15270,14 @@ class Hs {
15214
15270
  this.isOpen && e.key === "Escape" && (e.preventDefault(), this.hide(), this.onClose());
15215
15271
  };
15216
15272
  constructor(e, t, a, i) {
15217
- this.i18n = t, this.memory = a, this.onClose = i, this.container = document.createElement("section"), this.container.className = "axon-genetic-memory", this.container.setAttribute("aria-label", this.i18n.translate("geneticMemoryTitle")), this.mapRenderer = new Bs(this.container, this.i18n, this.memory, (o) => {
15273
+ this.i18n = t, this.memory = a, this.onClose = i, this.container = document.createElement("section"), this.container.className = "axon-genetic-memory", this.container.setAttribute("aria-label", this.i18n.translate("geneticMemoryTitle")), this.mapRenderer = new js(this.container, this.i18n, this.memory, (o) => {
15218
15274
  this.selectedNodeId = o, this.renderDetail();
15219
15275
  }), this.unsubscribe = a.subscribe(() => this.render()), e.appendChild(this.container), window.addEventListener("keydown", this.handleKeyDown), this.render();
15220
15276
  }
15221
15277
  render() {
15222
15278
  this.mapPan?.destroy(), this.container.innerHTML = this.renderShell(), this.container.querySelector("#axon-genetic-close")?.addEventListener("click", this.onClose), this.mapRenderer.render(this.memory.getNodes(), this.isOpen);
15223
15279
  const e = this.container.querySelector(".axon-genetic-map");
15224
- this.mapPan = e ? new js(e) : null, this.renderDetail();
15280
+ this.mapPan = e ? new _s(e) : null, this.renderDetail();
15225
15281
  }
15226
15282
  renderShell() {
15227
15283
  return `<div class="axon-genetic-memory-shell">
@@ -15313,11 +15369,11 @@ class Hs {
15313
15369
  return e === "powerup" ? this.i18n.translate("geneticTypePowerup") : e === "passive" ? this.i18n.translate("geneticTypePassive") : e === "enemy" ? this.i18n.translate("geneticTypeEnemy") : this.i18n.translate("geneticTypeCore");
15314
15370
  }
15315
15371
  }
15316
- function Us(r) {
15317
- r.coreRunSummaryOverlay = zs(r), r.geneticMemoryOverlay = Ks(r), r.codexToast = new Ls(r.container, r.i18n), r.challengeResultOverlay = Fs(r), r.challengeCompletionCinematic = Gs(r);
15372
+ function Hs(r) {
15373
+ r.coreRunSummaryOverlay = Us(r), r.geneticMemoryOverlay = zs(r), r.codexToast = new Ns(r.container, r.i18n), r.challengeResultOverlay = Ks(r), r.challengeCompletionCinematic = Fs(r);
15318
15374
  }
15319
- function zs(r) {
15320
- return new _s({
15375
+ function Us(r) {
15376
+ return new Ls({
15321
15377
  parent: r.container,
15322
15378
  i18n: r.i18n,
15323
15379
  roster: r.coreRoster,
@@ -15329,13 +15385,13 @@ function zs(r) {
15329
15385
  }
15330
15386
  });
15331
15387
  }
15332
- function Ks(r) {
15333
- return new Hs(r.container, r.i18n, r.geneticMemory, () => {
15388
+ function zs(r) {
15389
+ return new Bs(r.container, r.i18n, r.geneticMemory, () => {
15334
15390
  r.geneticMemoryOverlay.hide(), r.showStartMenu();
15335
15391
  });
15336
15392
  }
15337
- function Fs(r) {
15338
- return new Ns({
15393
+ function Ks(r) {
15394
+ return new Os({
15339
15395
  parent: r.container,
15340
15396
  i18n: r.i18n,
15341
15397
  onRetry: (e) => {
@@ -15346,8 +15402,8 @@ function Fs(r) {
15346
15402
  }
15347
15403
  });
15348
15404
  }
15349
- function Gs(r) {
15350
- return new Os({
15405
+ function Fs(r) {
15406
+ return new Ds({
15351
15407
  parent: r.container,
15352
15408
  i18n: r.i18n,
15353
15409
  onClose: () => {
@@ -15355,23 +15411,23 @@ function Gs(r) {
15355
15411
  }
15356
15412
  });
15357
15413
  }
15358
- function Vs(r, e) {
15414
+ function Gs(r, e) {
15359
15415
  ({
15360
- "completed:achievement": () => Ws(r, e.id),
15361
- "completed:challenge": () => qs(r, e.id),
15362
- "challenge-failed:challenge": () => $s(r, e.id),
15416
+ "completed:achievement": () => Vs(r, e.id),
15417
+ "completed:challenge": () => Ws(r, e.id),
15418
+ "challenge-failed:challenge": () => qs(r, e.id),
15363
15419
  "claimed:mission": () => r.refreshGeneratedMission(!0)
15364
15420
  })[`${e.type}:${e.kind}`]?.();
15365
15421
  }
15366
- function Ws(r, e) {
15422
+ function Vs(r, e) {
15367
15423
  const t = r.objectives.getSnapshot("achievement", e);
15368
15424
  r.objectiveToast.show(t.titleKey, t.descriptionKey);
15369
15425
  }
15370
- function qs(r, e) {
15426
+ function Ws(r, e) {
15371
15427
  const t = r.objectives.getSnapshot("challenge", e);
15372
15428
  r.challengeRunId = null, r.isRunning = !1, r.isPaused = !0, r.inputManager.forceRelease(), r.tutorialOverlay.hide(), r.clearTransientRunEntities(), r.challengeCompletionCinematic.show(t.titleKey, t.descriptionKey);
15373
15429
  }
15374
- function $s(r, e) {
15430
+ function qs(r, e) {
15375
15431
  const t = r.objectives.getSnapshot("challenge", e);
15376
15432
  if (r.isDeathSequenceActive) {
15377
15433
  r.pendingChallengeFailureId = e;
@@ -15379,20 +15435,20 @@ function $s(r, e) {
15379
15435
  }
15380
15436
  r.challengeResultOverlay.showFailed(e, t.titleKey);
15381
15437
  }
15382
- function Ys(r, e) {
15383
- Zs(r), Js(r, e), Xs(r), Qs(r), el(r), tl(r), rl(r), Us(r), ks(r), al(r), Wa(r), il(r), $a(r);
15438
+ function $s(r, e) {
15439
+ Ys(r), Zs(r, e), Js(r), Xs(r), Qs(r), el(r), tl(r), Hs(r), ks(r), rl(r), Wa(r), al(r), $a(r);
15384
15440
  }
15385
- function Zs(r) {
15441
+ function Ys(r) {
15386
15442
  const e = Ti();
15387
- r.configManager = new N(), r.content = be, r.corePreview = new Je(0, 0, r.configManager.getConfig().core), r.powerUpRegistry = new ai(r.configManager, Ii), r.geneticMemory = new W(Ri, new T(e)), r.coreRoster = new Zi(Di, r.geneticMemory, e), r.codex = new oo(po, e), r.missionGenerator = new vo(r.codex), r.bossCodex = new F(fo, e), r.objectives = new jo(Bo, e, (t) => r.applyObjectiveReward(t)), r.areaDirector = new Ho(be), r.bossEncounter = new Ko(ht());
15443
+ r.configManager = new N(), r.content = Se, r.corePreview = new Je(0, 0, r.configManager.getConfig().core), r.powerUpRegistry = new ai(r.configManager, Ii), r.geneticMemory = new W(Ri, new T(e)), r.coreRoster = new Zi(Di, r.geneticMemory, e), r.codex = new oo(po, e), r.missionGenerator = new vo(r.codex), r.bossCodex = new F(fo, e), r.objectives = new jo(Bo, e, (t) => r.applyObjectiveReward(t)), r.areaDirector = new Ho(Se), r.bossEncounter = new Ko(ht());
15388
15444
  }
15389
- function Js(r, e) {
15445
+ function Zs(r, e) {
15390
15446
  r.container = e.root, r.container.classList.add("axon-game-root"), r.i18n = new Ya(e.language), r.themeManager = new pr(e.theme, r.container), r.platform = e.platform || new Za(), r.canvas = document.createElement("canvas"), r.canvas.className = "axon-canvas", r.container.appendChild(r.canvas), r.resizeCanvas(), window.addEventListener("resize", () => r.resizeCanvas());
15391
15447
  }
15392
- function Xs(r) {
15448
+ function Js(r) {
15393
15449
  r.eventBus = new At(), r.entityFactory = new ti(r.content), r.core = new Je(r.canvas.width / 2, r.canvas.height / 2, r.configManager.getConfig().core), r.inputManager = new Mt(r.canvas, r.configManager.getConfig()), r.physicsEngine = new ir(r.eventBus, r.i18n, r.entityFactory, r.configManager), r.waveDirector = new dr(r.entityFactory, new ur(r.content, r.geneticMemory), new ri(500)), r.waveDirector.setArea(r.areaDirector.getArea()), r.renderer = new ga(r.canvas, r.themeManager, r.configManager), r.juice = new ya();
15394
15450
  }
15395
- function Qs(r) {
15451
+ function Xs(r) {
15396
15452
  r.settingsModal = new Ia({
15397
15453
  parent: r.container,
15398
15454
  i18n: r.i18n,
@@ -15409,17 +15465,17 @@ function Qs(r) {
15409
15465
  }
15410
15466
  });
15411
15467
  }
15412
- function el(r) {
15468
+ function Qs(r) {
15413
15469
  r.coreInteraction = new It(r.inputManager, r.core), r.interactiveTutorial = new wa(r.entityFactory, new Ie(), null, at()), r.tutorialOverlay = new ka(r.container, r.i18n, r.interactiveTutorial), r.hud = new Pa(r.container, () => {
15414
15470
  r.isPaused = !0, r.settingsModal.show();
15415
15471
  }), r.hud.show();
15416
15472
  }
15417
- function tl(r) {
15473
+ function el(r) {
15418
15474
  r.progressBar = new Ma((e) => {
15419
15475
  r.waveDirector.wave = e, r.triggerLevelUp(e);
15420
15476
  }), r.performanceAudit = new Da(r.container, r.debugPerformanceEnabled, r.i18n);
15421
15477
  }
15422
- function rl(r) {
15478
+ function tl(r) {
15423
15479
  r.coreRosterOverlay = new Fa({
15424
15480
  parent: r.container,
15425
15481
  i18n: r.i18n,
@@ -15440,7 +15496,7 @@ function rl(r) {
15440
15496
  environment: Re
15441
15497
  });
15442
15498
  }
15443
- function al(r) {
15499
+ function rl(r) {
15444
15500
  r.challengesOverlay = new je({
15445
15501
  parent: r.container,
15446
15502
  i18n: r.i18n,
@@ -15466,7 +15522,7 @@ function al(r) {
15466
15522
  getSelectedCoreId: () => r.coreRoster.getSelectedCoreId()
15467
15523
  });
15468
15524
  }
15469
- function il(r) {
15525
+ function al(r) {
15470
15526
  r.unsubscribeCodex = r.codex.subscribe((e) => {
15471
15527
  r.refreshGeneratedMission(), r.startMenu.renderContent(), e.length > 0 && r.codexToast.show();
15472
15528
  }), r.unsubscribeBossCodex = r.bossCodex.subscribe(() => {
@@ -15474,14 +15530,35 @@ function il(r) {
15474
15530
  }), r.unsubscribeCoreRoster = r.coreRoster.subscribe(() => {
15475
15531
  r.syncSelectedCorePreview(), r.startMenu.renderContent();
15476
15532
  }), r.unsubscribeObjectives = r.objectives.subscribe((e) => {
15477
- ol(r), Vs(r, e);
15533
+ il(r), Gs(r, e);
15478
15534
  });
15479
15535
  }
15480
- function ol(r) {
15536
+ function il(r) {
15481
15537
  r.startMenu.renderContent(), r.missionsDrawer.render(), r.challengesOverlay.renderContent(), r.achievementsOverlay.renderContent();
15482
15538
  }
15483
15539
  const $e = 0.25, Q = 1.8;
15484
- class nl {
15540
+ function ol() {
15541
+ if (typeof window > "u" || !sl(window.location.hostname)) return null;
15542
+ const r = new URLSearchParams(window.location.search);
15543
+ return nl(r.get("debugChallengeEnd") ?? r.get("debugChallenge"));
15544
+ }
15545
+ function nl(r) {
15546
+ return r === "complete" || r === "completed" || r === "win" ? "complete" : r === "lost" || r === "failed" || r === "fail" ? "lost" : null;
15547
+ }
15548
+ function sl(r) {
15549
+ return r === "localhost" || r === "127.0.0.1";
15550
+ }
15551
+ function ll(r) {
15552
+ const e = r.debugChallengeResult, t = r.challengeRunId;
15553
+ if (!(!e || !t)) {
15554
+ if (e === "complete") {
15555
+ r.objectives.debugComplete("challenge", t);
15556
+ return;
15557
+ }
15558
+ r.isRunning = !1, r.isPaused = !0, r.inputManager.forceRelease(), r.tutorialOverlay.hide(), r.objectives.cancelActiveChallenge(), r.challengeRunId = null, r.clearTransientRunEntities();
15559
+ }
15560
+ }
15561
+ class cl {
15485
15562
  container;
15486
15563
  canvas;
15487
15564
  i18n;
@@ -15554,6 +15631,7 @@ class nl {
15554
15631
  debugPerformanceEnabled = typeof window < "u" && new URLSearchParams(window.location.search).has("debug");
15555
15632
  debugBossEnabled = typeof window < "u" && (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") && new URLSearchParams(window.location.search).has("debugBoss");
15556
15633
  debugAchievementEnabled = typeof window < "u" && (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") && new URLSearchParams(window.location.search).has("debugAchievement");
15634
+ debugChallengeResult = ol();
15557
15635
  rerollsRemaining = 1;
15558
15636
  score = { value: 0 };
15559
15637
  combo = { value: 0 };
@@ -15623,25 +15701,25 @@ class nl {
15623
15701
  clearTransientRunEntities() {
15624
15702
  }
15625
15703
  constructor(e) {
15626
- Ys(this, e);
15704
+ $s(this, e);
15627
15705
  }
15628
15706
  }
15629
- function sl(r, e) {
15707
+ function dl(r, e) {
15630
15708
  r.i18n.setLanguage(e), r.onLanguageChanged(e);
15631
15709
  }
15632
- function ll(r, e) {
15710
+ function ul(r, e) {
15633
15711
  r.themeManager.setTheme(e);
15634
15712
  }
15635
- function cl(r) {
15713
+ function hl(r) {
15636
15714
  return r.i18n.getLanguage();
15637
15715
  }
15638
- function dl(r) {
15716
+ function pl(r) {
15639
15717
  return r.themeManager.getTheme();
15640
15718
  }
15641
- function ul(r, e) {
15719
+ function ml(r, e) {
15642
15720
  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(), r.challengeResultOverlay.updateLanguage(), r.challengeCompletionCinematic.updateLanguage();
15643
15721
  }
15644
- function hl(r) {
15722
+ function gl(r) {
15645
15723
  r.ambientEnemies = [];
15646
15724
  for (let e = 0; e < 16; e++) {
15647
15725
  const t = r.content.enemies.values().filter((l) => l.ambientSpawn && (!l.requiredUnlockId || r.geneticMemory.isUnlocked(l.requiredUnlockId))).map((l) => l.id);
@@ -15656,15 +15734,15 @@ function hl(r) {
15656
15734
  r.ambientEnemies.push(s);
15657
15735
  }
15658
15736
  }
15659
- function pl(r) {
15737
+ function yl(r) {
15660
15738
  const e = r.coreRoster.getSelectedCore();
15661
15739
  r.core.setMechanic(e.mechanic), r.core.setSkinId(r.coreRoster.getSelectedSkinId(e.id)), r.core.setElevationVisualLevel(r.coreRoster.getSelectedElevationVisualLevel(e.id)), r.coreInteraction.setMechanic(e.mechanic);
15662
15740
  }
15663
- function ml(r) {
15741
+ function El(r) {
15664
15742
  const e = r.container.clientWidth || window.innerWidth, t = r.container.clientHeight || window.innerHeight, a = 1100, i = 750, o = e / Math.max(1, t);
15665
15743
  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 });
15666
15744
  }
15667
- class gl {
15745
+ class vl {
15668
15746
  origin;
15669
15747
  position;
15670
15748
  previousPosition;
@@ -15699,7 +15777,7 @@ class gl {
15699
15777
  return this.origin;
15700
15778
  }
15701
15779
  }
15702
- const yl = {
15780
+ const fl = {
15703
15781
  "toxic-radius": (r) => {
15704
15782
  const e = r.getConfig().toxicPool;
15705
15783
  r.updateConfig({
@@ -15733,11 +15811,11 @@ const yl = {
15733
15811
  r.addCoreRing(1);
15734
15812
  }
15735
15813
  };
15736
- function El(r, e) {
15814
+ function xl(r, e) {
15737
15815
  for (const t of r.getActivePassiveEffectIds())
15738
- yl[t](e);
15816
+ fl[t](e);
15739
15817
  }
15740
- const vl = {
15818
+ const Sl = {
15741
15819
  "core-life-ring": (r) => r.addCoreRing(1),
15742
15820
  "core-protection": (r, e) => {
15743
15821
  const t = e.effectValue ?? 120, a = r.getConfig().core;
@@ -15778,21 +15856,21 @@ const vl = {
15778
15856
  "core-skin": () => {
15779
15857
  }
15780
15858
  };
15781
- function fl(r, e) {
15859
+ function bl(r, e) {
15782
15860
  for (const t of r.getActiveWisdomEffects())
15783
- t.effectId && vl[t.effectId](e, t);
15861
+ t.effectId && Sl[t.effectId](e, t);
15784
15862
  }
15785
- function xl(r) {
15786
- bl(r), Sl(r);
15787
- const e = Cl(r);
15788
- wl(r, e);
15863
+ function Cl(r) {
15864
+ Al(r), Il(r);
15865
+ const e = Rl(r);
15866
+ Ml(r, e);
15789
15867
  }
15790
- function bl(r) {
15868
+ function Al(r) {
15791
15869
  r.eventBus.on("onCoreDamaged", () => {
15792
15870
  r.settingsModal.isHapticsEnabled() && r.platform.haptics.notification("error");
15793
15871
  });
15794
15872
  }
15795
- function Sl(r) {
15873
+ function Il(r) {
15796
15874
  r.eventBus.on("onGameOver", () => {
15797
15875
  if (!r.isDeathSequenceActive) {
15798
15876
  if (r.isChallengeRun()) {
@@ -15806,27 +15884,27 @@ function Sl(r) {
15806
15884
  function Ye(r) {
15807
15885
  r.isRunning = !1, r.isPaused = !1, r.isDeathSequenceActive = !0, r.deathSequenceElapsed = 0;
15808
15886
  }
15809
- function Cl(r) {
15887
+ function Rl(r) {
15810
15888
  return {
15811
- pointerDown: (e = !1) => Al(r, e),
15812
- pointerUp: () => Tl(r)
15889
+ pointerDown: (e = !1) => Tl(r, e),
15890
+ pointerUp: () => Pl(r)
15813
15891
  };
15814
15892
  }
15815
- function Al(r, e) {
15893
+ function Tl(r, e) {
15816
15894
  if (!r.isRunning || r.isPaused || r.isLevelUpActive) return;
15817
15895
  const t = r.coreInteraction.pointerDown(r.enemies, e);
15818
- Il(r, t), Rl(r, t, e), t && r.settingsModal.isHapticsEnabled() && r.platform.haptics.impact("light");
15896
+ wl(r, t), kl(r, t, e), t && r.settingsModal.isHapticsEnabled() && r.platform.haptics.impact("light");
15819
15897
  }
15820
- function Il(r, e) {
15898
+ function wl(r, e) {
15821
15899
  !e?.enemy || e.mechanic !== "launcher" && e.mechanic !== "smasher" || (r.codex.recordControlled(e.enemy.type), r.coreRoster.recordSkillEvent("controlled"), r.objectives.record({
15822
15900
  type: "enemy-controlled",
15823
15901
  enemyId: e.enemy.type,
15824
15902
  coreId: r.coreRoster.getSelectedCoreId()
15825
15903
  }));
15826
15904
  }
15827
- function Rl(r, e, t) {
15905
+ function kl(r, e, t) {
15828
15906
  e?.mechanic !== "repellent" || !e.waveOrigin || r.repelProjectiles.push(
15829
- new gl({
15907
+ new vl({
15830
15908
  origin: r.core.position,
15831
15909
  target: e.waveOrigin,
15832
15910
  color: r.core.getColorHex(),
@@ -15836,12 +15914,12 @@ function Rl(r, e, t) {
15836
15914
  })
15837
15915
  );
15838
15916
  }
15839
- function Tl(r) {
15917
+ function Pl(r) {
15840
15918
  if (!r.isRunning || r.isPaused || r.isLevelUpActive) return;
15841
15919
  const e = r.coreInteraction.getMechanic(), t = r.coreInteraction.pointerUp();
15842
15920
  e === "smasher" && t && (r.pendingSmasherRelease = t), t && r.settingsModal.isHapticsEnabled() && r.platform.haptics.impact("medium");
15843
15921
  }
15844
- function wl(r, e) {
15922
+ function Ml(r, e) {
15845
15923
  r.canvas.addEventListener("mousedown", (t) => {
15846
15924
  t.button === 0 && e.pointerDown(!1);
15847
15925
  }), r.canvas.addEventListener("mouseup", (t) => {
@@ -15850,40 +15928,40 @@ function wl(r, e) {
15850
15928
  passive: !0
15851
15929
  }), r.canvas.addEventListener("touchend", e.pointerUp, { passive: !0 }), r.canvas.addEventListener("touchcancel", e.pointerUp, { passive: !0 });
15852
15930
  }
15853
- function kl(r) {
15931
+ function Dl(r) {
15854
15932
  r.missionsDrawer.setAvailable(!1), r.configManager.resetToDefault();
15855
15933
  const e = r.coreRoster.getSelectedCore(), t = r.challengeRunId ? r.objectives.getActiveChallenge() : void 0;
15856
- Pl(r, e, t), Dl(r, e.id, t);
15934
+ Ol(r, e, t), Ll(r, e.id, t);
15857
15935
  }
15858
- function Pl(r, e, t) {
15859
- r.core.setMechanic(e.mechanic), r.core.setSkinId(r.coreRoster.getSelectedSkinId(e.id)), r.core.setElevationVisualLevel(r.coreRoster.getSelectedElevationVisualLevel(e.id)), r.coreInteraction.setMechanic(e.mechanic), El(r.geneticMemory, r.configManager), r.coreRoster.startRun(), fl(r.coreRoster, r.configManager), r.core.setConfig(r.configManager.getConfig().core), r.objectives.record({ type: "run-started", coreId: e.id }), r.score.value = 0, r.combo.value = 0, r.pendingChallengeFailureId = null, 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), Ml(r, t);
15936
+ function Ol(r, e, t) {
15937
+ r.core.setMechanic(e.mechanic), r.core.setSkinId(r.coreRoster.getSelectedSkinId(e.id)), r.core.setElevationVisualLevel(r.coreRoster.getSelectedElevationVisualLevel(e.id)), r.coreInteraction.setMechanic(e.mechanic), xl(r.geneticMemory, r.configManager), r.coreRoster.startRun(), bl(r.coreRoster, r.configManager), r.core.setConfig(r.configManager.getConfig().core), r.objectives.record({ type: "run-started", coreId: e.id }), r.score.value = 0, r.combo.value = 0, r.pendingChallengeFailureId = null, 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), Nl(r, t);
15860
15938
  }
15861
- function Ml(r, e) {
15939
+ function Nl(r, e) {
15862
15940
  r.core.reset(r.canvas.width / 2, r.canvas.height / 2), r.areaDirector.reset(e?.preset?.areaId ?? "area-caldo"), r.areaDirector.setBossesDisabled(e?.preset?.disableBosses === !0), 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;
15863
15941
  }
15864
- function Dl(r, e, t) {
15865
- const a = t?.preset?.tutorialId, i = Ol(r, e, a, !!t);
15866
- r.interactiveTutorial.setDefinition(i), Nl(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());
15942
+ function Ll(r, e, t) {
15943
+ const a = t?.preset?.tutorialId, i = _l(r, e, a, !!t);
15944
+ r.interactiveTutorial.setDefinition(i), jl(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());
15867
15945
  }
15868
- function Ol(r, e, t, a) {
15946
+ function _l(r, e, t, a) {
15869
15947
  return a ? t ? r.content.getTutorial(t) ?? null : null : r.content.getTutorialForCore(e) ?? null;
15870
15948
  }
15871
- function Nl(r, e) {
15949
+ function jl(r, e) {
15872
15950
  return !r.interactiveTutorial.hasDefinition() || r.debugBossEnabled ? !1 : e || r.interactiveTutorial.isTutorialEnabled();
15873
15951
  }
15874
- function Ll(r) {
15952
+ function Bl(r) {
15875
15953
  r.clearTransientRunEntities(), r.juice.reset();
15876
15954
  }
15877
- function _l(r, e) {
15955
+ function Hl(r, e) {
15878
15956
  for (let t = r.repelProjectiles.length - 1; t >= 0; t--) {
15879
15957
  const a = r.repelProjectiles[t];
15880
- (!a || jl(r, a, e, t)) && r.repelProjectiles.splice(t, 1);
15958
+ (!a || Ul(r, a, e, t)) && r.repelProjectiles.splice(t, 1);
15881
15959
  }
15882
15960
  }
15883
- function jl(r, e, t, a) {
15884
- 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() ? Bl(r) : Hl(r, e, a)), !0);
15961
+ function Ul(r, e, t, a) {
15962
+ 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() ? zl(r) : Kl(r, e, a)), !0);
15885
15963
  }
15886
- function Bl(r) {
15964
+ function zl(r) {
15887
15965
  Xe.damageCore({
15888
15966
  core: r.core,
15889
15967
  enemies: r.enemies,
@@ -15900,7 +15978,7 @@ function Bl(r) {
15900
15978
  allowProtection: !1
15901
15979
  });
15902
15980
  }
15903
- function Hl(r, e, t) {
15981
+ function Kl(r, e, t) {
15904
15982
  const a = r.coreInteraction.resolveRepelWave(r.enemies, e.target, e.isTouch);
15905
15983
  for (const i of a)
15906
15984
  r.codex.recordControlled(i.type), r.objectives.record({
@@ -15920,12 +15998,12 @@ function Hl(r, e, t) {
15920
15998
  isSpectral: e.isSpectral
15921
15999
  });
15922
16000
  }
15923
- function Ul(r, e) {
16001
+ function Fl(r, e) {
15924
16002
  const t = e.position.x - e.previousPosition.x, a = e.position.y - e.previousPosition.y, i = t * t + a * a;
15925
16003
  if (i <= 1e-4) return !1;
15926
16004
  const o = Math.atan2(-a, -t);
15927
16005
  return r.enemies.some(
15928
- (n) => zl({
16006
+ (n) => Gl({
15929
16007
  enemy: n,
15930
16008
  projectile: e,
15931
16009
  movementX: t,
@@ -15935,16 +16013,16 @@ function Ul(r, e) {
15935
16013
  })
15936
16014
  );
15937
16015
  }
15938
- function zl(r) {
16016
+ function Gl(r) {
15939
16017
  const { enemy: e, projectile: t, movementX: a, movementY: i, segmentLengthSquared: o, approachAngle: n } = r;
15940
16018
  if (!e.active || e.isDying || e.isGrabbed || e.isThrown || !e.isFrontCoverageHit(n)) return !1;
15941
16019
  const s = e.position.x - t.previousPosition.x, l = e.position.y - t.previousPosition.y, c = Math.max(0, Math.min(1, (s * a + l * i) / o)), d = t.previousPosition.x + a * c, u = t.previousPosition.y + i * c, h = e.position.x - d, m = e.position.y - u, g = e.getFrontCoverageRadius() + t.radius;
15942
16020
  return h * h + m * m <= g * g;
15943
16021
  }
15944
- function Kl(r) {
16022
+ function Vl(r) {
15945
16023
  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();
15946
16024
  }
15947
- function Fl(r, e) {
16025
+ function Wl(r, e) {
15948
16026
  if (r.deathSequenceElapsed = Math.min(ye, r.deathSequenceElapsed + e), r.juice.update(e, r.floatingTexts, r.particles), !(r.deathSequenceElapsed < ye)) {
15949
16027
  if (r.isDeathSequenceActive = !1, r.clearTransientRunState(), r.initAmbientArena(), r.pendingChallengeFailureId) {
15950
16028
  const t = r.pendingChallengeFailureId;
@@ -15960,27 +16038,27 @@ function Fl(r, e) {
15960
16038
  r.showStartMenu();
15961
16039
  }
15962
16040
  }
15963
- function Gl(r, e) {
15964
- if (r.performanceAudit.beginFrame(), Vl(r), $l(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), Yl(r, e), Zl(r, e)) || (r.areaIntroElapsed = Math.min(Q, r.areaIntroElapsed + Math.max(0, e)), Xl(r, e))) return;
15965
- Ql(r, e), ec(r, e);
15966
- const t = ic(r, e);
15967
- nc(r, e), r.spawnExperienceDrops(), r.isLevelUpActive || (r.updateExperienceOrbs(e), r.updateEcosomaOrbs(e)), r.progressBar.update(e), r.hud.update(r.combo.value, ql(r)), r.juice.update(e, r.floatingTexts, r.particles), r.enemies = r.enemies.filter((a) => a.active), G(r, r.enemies.length, t);
16041
+ function ql(r, e) {
16042
+ if (r.performanceAudit.beginFrame(), $l(r), Jl(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), Xl(r, e), Ql(r, e)) || (r.areaIntroElapsed = Math.min(Q, r.areaIntroElapsed + Math.max(0, e)), tc(r, e))) return;
16043
+ rc(r, e), ac(r, e);
16044
+ const t = sc(r, e);
16045
+ cc(r, e), r.spawnExperienceDrops(), r.isLevelUpActive || (r.updateExperienceOrbs(e), r.updateEcosomaOrbs(e)), r.progressBar.update(e), r.hud.update(r.combo.value, Zl(r)), r.juice.update(e, r.floatingTexts, r.particles), r.enemies = r.enemies.filter((a) => a.active), G(r, r.enemies.length, t);
15968
16046
  }
15969
- function Vl(r) {
15970
- const e = r.isPaused ? "PAUSED" : Wl(r);
16047
+ function $l(r) {
16048
+ const e = r.isPaused ? "PAUSED" : Yl(r);
15971
16049
  r.performanceAudit.setState(e), r.performanceAudit.setEcosomaDropChance(r.getEcosomaDropPolicy().getChance(r.progressBar.getLevel()));
15972
16050
  }
15973
- function Wl(r) {
16051
+ function Yl(r) {
15974
16052
  return r.isRunning ? "GAME" : "MENU";
15975
16053
  }
15976
- function ql(r) {
16054
+ function Zl(r) {
15977
16055
  const e = r.objectives.getActiveChallenge();
15978
16056
  return !e || e.condition.event !== "enemy-defeated" ? null : e.condition.target - e.progress;
15979
16057
  }
15980
- function $l(r, e) {
16058
+ function Jl(r, e) {
15981
16059
  return r.areaDirector.getPhase() !== "boss" || !r.bossEncounter.isIntroPaused() ? !1 : (r.bossEncounter.update(e, r.core.position), G(r, 0), !0);
15982
16060
  }
15983
- function Yl(r, e) {
16061
+ function Xl(r, e) {
15984
16062
  r.isRunning && !r.isPaused && r.updateRepelProjectiles(e);
15985
16063
  }
15986
16064
  function G(r, e, t = 0) {
@@ -15993,22 +16071,22 @@ function G(r, e, t = 0) {
15993
16071
  floatingTexts: r.floatingTexts.length
15994
16072
  });
15995
16073
  }
15996
- function Zl(r, e) {
16074
+ function Ql(r, e) {
15997
16075
  if (r.isDeathSequenceActive)
15998
16076
  return r.updateDeathSequence(e), G(r, 0), !0;
15999
16077
  if (r.isRunning && !r.isPaused) return !1;
16000
16078
  for (const t of r.ambientEnemies)
16001
- t.update(e), Jl(r, t);
16079
+ t.update(e), ec(r, t);
16002
16080
  return r.recordEnemyObservations(r.ambientEnemies), G(r, r.ambientEnemies.length), !0;
16003
16081
  }
16004
- function Jl(r, e) {
16082
+ function ec(r, e) {
16005
16083
  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);
16006
16084
  }
16007
- function Xl(r, e) {
16085
+ function tc(r, e) {
16008
16086
  const t = r.areaDirector.getPhase();
16009
16087
  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), G(r, 0), !0);
16010
16088
  }
16011
- function Ql(r, e) {
16089
+ function rc(r, e) {
16012
16090
  const t = r.areaDirector.getPhase();
16013
16091
  if (r.interactiveTutorial.isActive) {
16014
16092
  r.interactiveTutorial.update({
@@ -16029,20 +16107,20 @@ function Ql(r, e) {
16029
16107
  const a = r.waveDirector.update({ dt: e, activeEnemies: r.enemies, width: r.canvas.width, height: r.canvas.height, corePos: r.core.position });
16030
16108
  a && (r.enemies.push(a), r.recordEnemyObservation(a)), r.recordEnemyObservations(r.enemies);
16031
16109
  }
16032
- function ec(r, e) {
16110
+ function ac(r, e) {
16033
16111
  if (!r.isLevelUpActive) return;
16034
16112
  r.inputManager.tryGrabOrb(r.orbitingOrbs);
16035
16113
  const t = r.inputManager.grabbedOrb;
16036
- !r.inputManager.isPointerDown && t && (t.isGrabbed = !1, r.inputManager.grabbedOrb = null), tc(r);
16114
+ !r.inputManager.isPointerDown && t && (t.isGrabbed = !1, r.inputManager.grabbedOrb = null), ic(r);
16037
16115
  for (const a of r.orbitingOrbs)
16038
- 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 ? rc(r, a) : a.update(e, r.core.position);
16116
+ 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 ? oc(r, a) : a.update(e, r.core.position);
16039
16117
  }
16040
- function tc(r) {
16118
+ function ic(r) {
16041
16119
  if (!r.inputManager.isPointerDown || r.inputManager.grabbedOrb || r.rerollsRemaining <= 0) return;
16042
16120
  const e = r.canvas.width / 2, t = r.canvas.height / 2 + 300;
16043
16121
  Math.hypot(r.inputManager.pointerPosition.x - e, r.inputManager.pointerPosition.y - t) <= 80 && (r.triggerReroll(), r.inputManager.consumePointerDown());
16044
16122
  }
16045
- function rc(r, e) {
16123
+ function oc(r, e) {
16046
16124
  e.position = { ...r.inputManager.pointerPosition };
16047
16125
  const t = r.core.position.x - e.position.x, a = r.core.position.y - e.position.y;
16048
16126
  if (!(Math.hypot(t, a) > r.core.radius + e.radius)) {
@@ -16057,11 +16135,11 @@ function rc(r, e) {
16057
16135
  maxLifetime: 1.6,
16058
16136
  size: 26
16059
16137
  });
16060
- for (let i = 0; i < 45; i++) r.particles.push(ac(r, e.definition.color));
16138
+ for (let i = 0; i < 45; i++) r.particles.push(nc(r, e.definition.color));
16061
16139
  r.inputManager.forceRelease(), r.orbitingOrbs = [], r.presentNextLevelUp();
16062
16140
  }
16063
16141
  }
16064
- function ac(r, e) {
16142
+ function nc(r, e) {
16065
16143
  const t = Math.random() * Math.PI * 2, a = 200 + Math.random() * 400;
16066
16144
  return {
16067
16145
  id: Math.random().toString(),
@@ -16074,7 +16152,7 @@ function ac(r, e) {
16074
16152
  maxLifetime: 0.7
16075
16153
  };
16076
16154
  }
16077
- function ic(r, e) {
16155
+ function sc(r, e) {
16078
16156
  if (r.isLevelUpActive) return 0;
16079
16157
  const t = r.debugPerformanceEnabled ? performance.now() : 0;
16080
16158
  return r.physicsEngine.update({
@@ -16096,13 +16174,13 @@ function ic(r, e) {
16096
16174
  smasherRelease: r.pendingSmasherRelease,
16097
16175
  onSmasherArmBreak: () => r.inputManager.forceRelease(),
16098
16176
  preserveSmasherCapturedEnemy: r.objectives.getActiveChallenge()?.preset?.preserveSmasherCapturedEnemy === !0,
16099
- onChallengeFailure: () => oc(r)
16177
+ onChallengeFailure: () => lc(r)
16100
16178
  }), r.pendingSmasherRelease = null, r.debugPerformanceEnabled ? performance.now() - t : 0;
16101
16179
  }
16102
- function oc(r) {
16180
+ function lc(r) {
16103
16181
  r.isChallengeRun() && (r.isRunning = !1, r.isPaused = !1, r.isDeathSequenceActive = !0, r.deathSequenceElapsed = 0, r.inputManager.forceRelease(), r.tutorialOverlay.hide(), r.objectives.cancelActiveChallenge(), r.challengeRunId = null);
16104
16182
  }
16105
- function nc(r, e) {
16183
+ function cc(r, e) {
16106
16184
  if (r.areaDirector.getPhase() !== "boss") return;
16107
16185
  const t = r.bossEncounter.update(e, r.core.position);
16108
16186
  if (t) {
@@ -16111,7 +16189,7 @@ function nc(r, e) {
16111
16189
  }
16112
16190
  r.updateBossMinionReentryPaths(), r.updateBossExposureBurst(e), r.processSmasherBossImpact(), r.processBossImpacts(), r.finishBossIfDefeated();
16113
16191
  }
16114
- function sc(r) {
16192
+ function dc(r) {
16115
16193
  r.coreRoster.recordSkillEvent("kill"), r.combo.value >= 2 && r.coreRoster.recordSkillEvent("combo", r.combo.value), r.combo.value >= 2 && r.objectives.record({
16116
16194
  type: "combo",
16117
16195
  amount: r.combo.value,
@@ -16128,7 +16206,7 @@ function sc(r) {
16128
16206
  size: 22
16129
16207
  }));
16130
16208
  }
16131
- function lc(r) {
16209
+ function uc(r) {
16132
16210
  if (r.bossEncounter.getPhase() !== "inactive") return;
16133
16211
  const e = r.areaDirector.getArea().bossId;
16134
16212
  if (!e) return;
@@ -16144,20 +16222,20 @@ function lc(r) {
16144
16222
  targetCandidates: r.waveDirector.getBossTentacleTargets()
16145
16223
  }), r.bossCodex.recordEncounter(t.id), r.bossCodex.recordPhase(t.id, 1), r.juice.triggerFlash(0.85), r.juice.triggerScreenShake({ x: 0, y: 1 }, 26);
16146
16224
  }
16147
- function cc(r) {
16225
+ function hc(r) {
16148
16226
  r.enemies = [], r.pools = [], r.vortices = [], r.shockwaves = [], r.experienceOrbs = [], r.inputManager.forceRelease();
16149
16227
  }
16150
- function dc(r) {
16228
+ function pc(r) {
16151
16229
  if (r.bossEncounter.getPhase() === "inactive") return;
16152
16230
  let e = !1;
16153
16231
  for (const t of r.enemies) {
16154
- if (!uc(t)) continue;
16232
+ if (!mc(t)) continue;
16155
16233
  const a = r.bossEncounter.hit(t.position, t.type, r.core.position);
16156
16234
  a !== "none" && (vt(r, t.position, t.color, a), t.isThrown = !1, t.triggerDissolveDeath(!1), a === "tentacle-broken" && r.bossEncounter.getPhase() === "exposed" && (e = !0));
16157
16235
  }
16158
16236
  e && r.releaseBossExposureBurst();
16159
16237
  }
16160
- function uc(r) {
16238
+ function mc(r) {
16161
16239
  return r.active && r.isThrown && !r.isDying;
16162
16240
  }
16163
16241
  function vt(r, e, t, a) {
@@ -16176,17 +16254,17 @@ function vt(r, e, t, a) {
16176
16254
  }
16177
16255
  a === "boss-damaged" && r.juice.triggerScreenShake({ x: 0, y: 1 }, 12), a === "defeated" && r.juice.triggerFlash(1);
16178
16256
  }
16179
- function hc(r) {
16180
- if (!pc(r)) return;
16257
+ function gc(r) {
16258
+ if (!yc(r)) return;
16181
16259
  const e = r.inputManager.grabbedEnemy;
16182
16260
  if (!e || !e.active || e.isDying) return;
16183
16261
  const t = r.bossEncounter.hit(e.position, e.type, r.core.position);
16184
- t !== "none" && (r.smasherBossImpactCooldown = 0.28, vt(r, e.position, e.color, t), mc(r, e, t), gc(r, e, t));
16262
+ t !== "none" && (r.smasherBossImpactCooldown = 0.28, vt(r, e.position, e.color, t), Ec(r, e, t), vc(r, e, t));
16185
16263
  }
16186
- function pc(r) {
16264
+ function yc(r) {
16187
16265
  return r.coreInteraction.getMechanic() === "smasher" && r.smasherBossImpactCooldown <= 0;
16188
16266
  }
16189
- function mc(r, e, t) {
16267
+ function Ec(r, e, t) {
16190
16268
  r.juice.triggerHitstop(0.08), r.juice.triggerFlash(t === "area-impact" ? 0.25 : 0.5), r.juice.triggerScreenShake(
16191
16269
  {
16192
16270
  x: e.position.x - r.core.position.x,
@@ -16195,7 +16273,7 @@ function mc(r, e, t) {
16195
16273
  t === "area-impact" ? 8 : 14
16196
16274
  );
16197
16275
  }
16198
- function gc(r, e, t) {
16276
+ function vc(r, e, t) {
16199
16277
  if (t === "tentacle-broken" && r.bossEncounter.getPhase() === "exposed" && r.releaseBossExposureBurst(), !r.core.consumeSmasherImpact()) return;
16200
16278
  r.core.startSmasherRetraction(e.position, e.color);
16201
16279
  const a = r.inputManager.releaseGrabbedEnemy();
@@ -16246,7 +16324,7 @@ class ft {
16246
16324
  }, !0;
16247
16325
  }
16248
16326
  }
16249
- class yc {
16327
+ class fc {
16250
16328
  id;
16251
16329
  radius = 17;
16252
16330
  interactionRadius = 132;
@@ -16282,10 +16360,10 @@ class yc {
16282
16360
  }
16283
16361
  }
16284
16362
  }
16285
- function Ec(r, e) {
16363
+ function xc(r, e) {
16286
16364
  return e === "area-impact" ? 290 : e === "defeated" ? 360 : 210;
16287
16365
  }
16288
- function vc(r) {
16366
+ function Sc(r) {
16289
16367
  r.bossExposureBurstRemaining = 26, r.bossExposureBurstAccumulator = 0.22, r.bossExposureBurstSide = 1;
16290
16368
  const e = r.bossEncounter.getBossPosition(r.core.position);
16291
16369
  r.shockwaves.push({
@@ -16299,7 +16377,7 @@ function vc(r) {
16299
16377
  maxLifetime: 1.2
16300
16378
  }), r.juice.triggerFlash(0.75), r.juice.triggerScreenShake({ x: 0, y: 1 }, 42);
16301
16379
  }
16302
- function fc(r, e) {
16380
+ function bc(r, e) {
16303
16381
  if (r.bossEncounter.getPhase() !== "exposed") {
16304
16382
  r.resetBossExposureBurst();
16305
16383
  return;
@@ -16315,30 +16393,30 @@ function fc(r, e) {
16315
16393
  i && (r.enemies.push(i), r.recordEnemyObservation(i)), r.bossExposureBurstRemaining -= 1;
16316
16394
  }
16317
16395
  }
16318
- function xc(r) {
16396
+ function Cc(r) {
16319
16397
  for (const e of r.enemies)
16320
- bc(r, e) && Ac(r, e);
16398
+ Ac(r, e) && Tc(r, e);
16321
16399
  }
16322
- function bc(r, e) {
16323
- return Sc(e) && Cc(r, e);
16400
+ function Ac(r, e) {
16401
+ return Ic(e) && Rc(r, e);
16324
16402
  }
16325
- function Sc(r) {
16403
+ function Ic(r) {
16326
16404
  return r.active && r.bossLaunchPhase === "outbound" && !r.isGrabbed && !r.isThrown && !r.wasManipulated;
16327
16405
  }
16328
- function Cc(r, e) {
16406
+ function Rc(r, e) {
16329
16407
  return e.position.x < -90 || e.position.x > r.canvas.width + 90 || e.position.y < -90 || e.position.y > r.canvas.height + 90;
16330
16408
  }
16331
- function Ac(r, e) {
16409
+ function Tc(r, e) {
16332
16410
  const t = {
16333
16411
  x: r.core.position.x + (Math.random() - 0.5) * 140,
16334
16412
  y: r.core.position.y + (Math.random() - 0.5) * 140
16335
16413
  }, a = Math.atan2(t.y - e.position.y, t.x - e.position.x), i = Math.max(260, e.maxSpeed * 1.8);
16336
16414
  e.bossLaunchPhase = "reentry", e.velocity = { x: Math.cos(a) * i, y: Math.sin(a) * i }, e.launchDelay = 0.05;
16337
16415
  }
16338
- function Ic(r) {
16416
+ function wc(r) {
16339
16417
  r.bossExposureBurstRemaining = 0, r.bossExposureBurstAccumulator = 0, r.bossExposureBurstSide = 1;
16340
16418
  }
16341
- function Rc(r) {
16419
+ function kc(r) {
16342
16420
  if (r.bossEncounter.getPhase() !== "defeated") return;
16343
16421
  const e = r.areaDirector.getArea().bossId;
16344
16422
  if (!e) return;
@@ -16349,9 +16427,9 @@ function Rc(r) {
16349
16427
  coreId: r.coreRoster.getSelectedCoreId()
16350
16428
  }), r.areaDirector.beginReward(), r.bossCodex.recordVictory(e);
16351
16429
  const a = r.getBossRewardPosition();
16352
- r.bossCatalyst = new yc(a), Tc(r, a, t.ecosomaDropMin, t.ecosomaDropMax), wc(r);
16430
+ r.bossCatalyst = new fc(a), Pc(r, a, t.ecosomaDropMin, t.ecosomaDropMax), Mc(r);
16353
16431
  }
16354
- function Tc(r, e, t, a) {
16432
+ function Pc(r, e, t, a) {
16355
16433
  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));
16356
16434
  for (let s = 0; s < n; s++) {
16357
16435
  const l = s * Math.PI * 2 / n, c = 24 + Math.random() * 28;
@@ -16363,30 +16441,30 @@ function Tc(r, e, t, a) {
16363
16441
  );
16364
16442
  }
16365
16443
  }
16366
- function wc(r) {
16444
+ function Mc(r) {
16367
16445
  r.enemies = [], r.pools = [], r.vortices = [], r.shockwaves = [], r.repelProjectiles = [], r.bossEncounter.reset(), r.resetBossExposureBurst(), r.juice.triggerFlash(1);
16368
16446
  }
16369
- function kc(r) {
16447
+ function Dc(r) {
16370
16448
  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;
16371
16449
  return {
16372
16450
  x: Math.max(s, Math.min(r.canvas.width - s, r.core.position.x + t * n)),
16373
16451
  y: Math.max(s, Math.min(r.canvas.height - s, r.core.position.y + a * n))
16374
16452
  };
16375
16453
  }
16376
- function Pc(r, e) {
16454
+ function Oc(r, e) {
16377
16455
  if (r.bossCatalyst?.active && (r.tryCollectCatalyst(), r.bossCatalyst.update(e, r.core.position, r.core.getHitboxRadius()), !r.bossCatalyst.active && r.bossCatalyst.absorbedByCore)) {
16378
16456
  const t = r.areaDirector.getArea().bossId;
16379
16457
  t && r.bossCodex.recordDropCollected(t), r.areaDirector.beginTransition(), r.areaTransitionElapsed = 0, r.juice.triggerFlash(0.75);
16380
16458
  }
16381
16459
  r.updateEcosomaOrbs(e), r.juice.update(e, r.floatingTexts, r.particles);
16382
16460
  }
16383
- function Mc(r) {
16461
+ function Nc(r) {
16384
16462
  const e = r.bossCatalyst;
16385
16463
  if (!e || !e.active || e.isAbsorbing) return;
16386
16464
  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);
16387
16465
  (a <= r.core.getHitboxRadius() + t.corePickupRadius || i <= Math.max(t.psionicRadius + t.pickupRadius + e.radius, e.interactionRadius)) && e.beginAbsorption();
16388
16466
  }
16389
- function Dc(r, e) {
16467
+ function Lc(r, e) {
16390
16468
  if (r.areaTransitionElapsed = Math.min(r.areaTransitionDuration, r.areaTransitionElapsed + Math.max(0, e)), r.updateEcosomaOrbs(e), !(r.areaTransitionElapsed < r.areaTransitionDuration) && r.areaDirector.completeTransition()) {
16391
16469
  const t = r.areaDirector.getArea();
16392
16470
  r.coreRoster.setRunArea(t.areaNumber ?? 1, t.experienceMultiplier), r.coreRoster.recordSkillEvent("area"), r.objectives.record({
@@ -16396,15 +16474,15 @@ function Dc(r, e) {
16396
16474
  }), r.waveDirector.setArea(t), r.areaIntroElapsed = 0, r.bossEncounter.reset(), r.bossCatalyst = null, r.clearArenaForBoss(), r.juice.triggerFlash(0.65);
16397
16475
  }
16398
16476
  }
16399
- const Oc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, xt = (r, e) => {
16477
+ const _c = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, xt = (r, e) => {
16400
16478
  const t = /* @__PURE__ */ new Map();
16401
16479
  for (const a of r) {
16402
16480
  if (!a.active || a.isAbsorbing || a.isMerging) continue;
16403
- const i = Oc(a.position.x, a.position.y, e), o = t.get(i);
16481
+ const i = _c(a.position.x, a.position.y, e), o = t.get(i);
16404
16482
  o ? o.push(a) : t.set(i, [a]);
16405
16483
  }
16406
16484
  return t;
16407
- }, ee = (r) => !r.active || r.isAbsorbing || r.isMerging, Nc = (r, e) => {
16485
+ }, ee = (r) => !r.active || r.isAbsorbing || r.isMerging, jc = (r, e) => {
16408
16486
  if (r.length < 2 || e <= 0) return;
16409
16487
  const t = xt(r, e);
16410
16488
  for (const a of r) {
@@ -16413,18 +16491,18 @@ const Oc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, xt = (r, e)
16413
16491
  for (let n = -1; n <= 1; n++)
16414
16492
  for (let s = -1; s <= 1; s++) {
16415
16493
  const l = t.get(`${i + n}:${o + s}`);
16416
- l && Lc(a, l, e);
16494
+ l && Bc(a, l, e);
16417
16495
  }
16418
16496
  }
16419
- }, Lc = (r, e, t) => {
16497
+ }, Bc = (r, e, t) => {
16420
16498
  for (const a of e) {
16421
16499
  if (a === r || ee(a)) continue;
16422
16500
  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()));
16423
16501
  i <= t + o && r.mergeWith(a);
16424
16502
  }
16425
- }, _c = (r, e, t) => {
16503
+ }, Hc = (r, e, t) => {
16426
16504
  const a = e.magneticAttractionDistance;
16427
- if (!jc(r, e)) return;
16505
+ if (!Uc(r, e)) return;
16428
16506
  const i = xt(r, a);
16429
16507
  for (const o of r) {
16430
16508
  if (ee(o)) continue;
@@ -16432,7 +16510,7 @@ const Oc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, xt = (r, e)
16432
16510
  for (let l = -1; l <= 1; l++)
16433
16511
  for (let c = -1; c <= 1; c++) {
16434
16512
  const d = i.get(`${n + l}:${s + c}`);
16435
- d && Bc({
16513
+ d && zc({
16436
16514
  orb: o,
16437
16515
  bucket: d,
16438
16516
  distanceLimit: a,
@@ -16441,7 +16519,7 @@ const Oc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, xt = (r, e)
16441
16519
  });
16442
16520
  }
16443
16521
  }
16444
- }, jc = (r, e) => r.length >= 2 && e.magneticAttractionDistance > 0 && e.magneticAttractionStrength > 0, Bc = (r) => {
16522
+ }, Uc = (r, e) => r.length >= 2 && e.magneticAttractionDistance > 0 && e.magneticAttractionStrength > 0, zc = (r) => {
16445
16523
  const { orb: e, bucket: t, distanceLimit: a, strength: i, dt: o } = r;
16446
16524
  for (const n of t) {
16447
16525
  if (n === e || ee(n) || n.id <= e.id) continue;
@@ -16450,12 +16528,12 @@ const Oc = (r, e, t) => `${Math.floor(r / t)}:${Math.floor(e / t)}`, xt = (r, e)
16450
16528
  const d = i * (1 - c / a) ** 2 * o, u = s / c, h = l / c;
16451
16529
  e.velocity.x += u * d, e.velocity.y += h * d, n.velocity.x -= u * d, n.velocity.y -= h * d;
16452
16530
  }
16453
- }, Hc = (r, e) => {
16531
+ }, Kc = (r, e) => {
16454
16532
  const t = Math.log2(r), a = Math.min(e.maxRadius, e.baseRadius + t * e.radiusGrowthPerLevel);
16455
16533
  let i = p.experience;
16456
16534
  return r >= e.blueThreshold && (i = p.experienceBlue), r >= e.yellowThreshold && (i = p.experienceYellow), r >= e.redThreshold && (i = p.experienceRed), { radius: a, color: i };
16457
16535
  };
16458
- class Uc {
16536
+ class Fc {
16459
16537
  constructor(e) {
16460
16538
  this.config = e;
16461
16539
  }
@@ -16486,7 +16564,7 @@ class Uc {
16486
16564
  return e.velocity = { x: o / s * l, y: n / s * l }, !1;
16487
16565
  }
16488
16566
  }
16489
- const zc = {
16567
+ const Gc = {
16490
16568
  mergeDistance: 34,
16491
16569
  magneticAttractionDistance: 190,
16492
16570
  magneticAttractionStrength: 900,
@@ -16498,7 +16576,7 @@ const zc = {
16498
16576
  yellowThreshold: 32,
16499
16577
  redThreshold: 256
16500
16578
  };
16501
- class Se {
16579
+ class be {
16502
16580
  id;
16503
16581
  position;
16504
16582
  velocity;
@@ -16513,8 +16591,8 @@ class Se {
16513
16591
  absorbedByCore = !1;
16514
16592
  config;
16515
16593
  lifecycle;
16516
- constructor(e, t = 1, a = zc) {
16517
- this.id = `xp_${Date.now()}_${Math.random()}`, this.position = { ...e }, this.value = Math.max(1, t), this.config = a, this.lifecycle = new Uc(a), this.radius = a.baseRadius, this.color = p.experience, this.updateAppearance();
16594
+ constructor(e, t = 1, a = Gc) {
16595
+ this.id = `xp_${Date.now()}_${Math.random()}`, this.position = { ...e }, this.value = Math.max(1, t), this.config = a, this.lifecycle = new Fc(a), this.radius = a.baseRadius, this.color = p.experience, this.updateAppearance();
16518
16596
  const i = Math.random() * Math.PI * 2, o = 25 + Math.random() * 45;
16519
16597
  this.velocity = {
16520
16598
  x: Math.cos(i) * o,
@@ -16522,10 +16600,10 @@ class Se {
16522
16600
  };
16523
16601
  }
16524
16602
  static mergeNearby(e, t) {
16525
- Nc(e, t);
16603
+ jc(e, t);
16526
16604
  }
16527
16605
  static attractNearby(e, t, a) {
16528
- _c(e, t, a);
16606
+ Hc(e, t, a);
16529
16607
  }
16530
16608
  beginAbsorption() {
16531
16609
  this.active && (this.isAbsorbing = !0);
@@ -16558,7 +16636,7 @@ class Se {
16558
16636
  }
16559
16637
  }
16560
16638
  updateAppearance() {
16561
- const e = Hc(this.value, this.config);
16639
+ const e = Kc(this.value, this.config);
16562
16640
  this.radius = e.radius, this.color = e.color;
16563
16641
  }
16564
16642
  getBaseRadius() {
@@ -16568,7 +16646,7 @@ class Se {
16568
16646
  this.lifecycle.beginMerge(this, e);
16569
16647
  }
16570
16648
  }
16571
- class bt {
16649
+ class St {
16572
16650
  id;
16573
16651
  definition;
16574
16652
  position = { x: 0, y: 0 };
@@ -16585,22 +16663,22 @@ class bt {
16585
16663
  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);
16586
16664
  }
16587
16665
  }
16588
- function Kc(r, e) {
16666
+ function Vc(r, e) {
16589
16667
  r.objectives.record({
16590
16668
  type: "level-reached",
16591
16669
  amount: e,
16592
16670
  coreId: r.coreRoster.getSelectedCoreId()
16593
16671
  }), r.pendingLevelUps.push(e), r.isLevelUpActive || r.presentNextLevelUp();
16594
16672
  }
16595
- function Fc(r) {
16673
+ function Wc(r) {
16596
16674
  const e = r.pendingLevelUps.shift();
16597
16675
  if (e === void 0) {
16598
16676
  r.isLevelUpActive = !1;
16599
16677
  return;
16600
16678
  }
16601
- r.isLevelUpActive = !0, r.inputManager.forceRelease(), r.juice.triggerFlash(0.3), r.juice.triggerScreenShake({ x: 0, y: 1 }, 8), Gc(r, e), r.orbitingOrbs = Vc(r), r.rerollsRemaining = r.isChallengeRun() ? 0 : r.getRerollLimit();
16679
+ r.isLevelUpActive = !0, r.inputManager.forceRelease(), r.juice.triggerFlash(0.3), r.juice.triggerScreenShake({ x: 0, y: 1 }, 8), qc(r, e), r.orbitingOrbs = $c(r), r.rerollsRemaining = r.isChallengeRun() ? 0 : r.getRerollLimit();
16602
16680
  }
16603
- function Gc(r, e) {
16681
+ function qc(r, e) {
16604
16682
  r.floatingTexts.push({
16605
16683
  id: Math.random().toString(),
16606
16684
  text: r.i18n.translate("levelUpChoose", { level: e }),
@@ -16626,26 +16704,26 @@ function Gc(r, e) {
16626
16704
  });
16627
16705
  }
16628
16706
  }
16629
- function Vc(r) {
16707
+ function $c(r) {
16630
16708
  const e = r.powerUpRegistry.getRandomOptions(3, r.geneticMemory, r.waveDirector.getAvailableEnemyIds(), r.coreRoster.getSelectedCoreId());
16631
- return e.map((t, a) => new bt("orb_" + Date.now() + "_" + a, t, a * Math.PI * 2 / e.length));
16709
+ return e.map((t, a) => new St("orb_" + Date.now() + "_" + a, t, a * Math.PI * 2 / e.length));
16632
16710
  }
16633
- function Wc(r) {
16711
+ function Yc(r) {
16634
16712
  for (const e of r.enemies)
16635
16713
  e.experienceDropPending && (e.experienceDropPending = !1, r.codex.recordKill(e.type, e.codexDeathSourceType), r.objectives.record({
16636
16714
  type: "enemy-defeated",
16637
16715
  enemyId: e.type,
16638
16716
  ...e.variantId ? { variantId: e.variantId } : {},
16639
16717
  coreId: r.coreRoster.getSelectedCoreId()
16640
- }), r.experienceOrbs.push(new Se(e.position, 1, r.configManager.getConfig().experience)), r.getEcosomaDropPolicy().shouldDrop(r.progressBar.getLevel()) && r.ecosomaOrbs.push(new ft(e.position)));
16718
+ }), r.experienceOrbs.push(new be(e.position, 1, r.configManager.getConfig().experience)), r.getEcosomaDropPolicy().shouldDrop(r.progressBar.getLevel()) && r.ecosomaOrbs.push(new ft(e.position)));
16641
16719
  }
16642
- function qc(r, e) {
16720
+ function Zc(r, e) {
16643
16721
  r.codex.recordSeen(e.type), e.variantId && r.isEnemyVisible(e) && r.codex.recordVariant(e.type, e.variantId);
16644
16722
  }
16645
- function $c(r, e) {
16723
+ function Jc(r, e) {
16646
16724
  for (const t of e) t.active && !t.isDying && r.recordEnemyObservation(t);
16647
16725
  }
16648
- function Yc(r, e) {
16726
+ function Xc(r, e) {
16649
16727
  const t = e.getHitRadius();
16650
16728
  return e.position.x >= -t && e.position.x <= r.canvas.width + t && e.position.y >= -t && e.position.y <= r.canvas.height + t;
16651
16729
  }
@@ -16661,26 +16739,26 @@ class Ze {
16661
16739
  return t >= 0 && t < this.getChance(e);
16662
16740
  }
16663
16741
  }
16664
- function Zc(r, e) {
16742
+ function Qc(r, e) {
16665
16743
  const t = r.configManager.getConfig();
16666
- Se.attractNearby(r.experienceOrbs, t.experience, e), Se.mergeNearby(r.experienceOrbs, t.experience.mergeDistance);
16667
- for (const a of r.experienceOrbs) Jc(r, a, e, t.magnet);
16744
+ be.attractNearby(r.experienceOrbs, t.experience, e), be.mergeNearby(r.experienceOrbs, t.experience.mergeDistance);
16745
+ for (const a of r.experienceOrbs) ed(r, a, e, t.magnet);
16668
16746
  r.experienceOrbs = r.experienceOrbs.filter((a) => a.active);
16669
16747
  }
16670
- function Jc(r, e, t, a) {
16748
+ function ed(r, e, t, a) {
16671
16749
  if (e.active) {
16672
16750
  if (e.isMerging) {
16673
16751
  e.update(t, r.core.position, r.core.getHitboxRadius(), a.absorptionSpeed);
16674
16752
  return;
16675
16753
  }
16676
- Xc(r, e, a) && e.beginAbsorption(), e.update(t, r.core.position, r.core.getHitboxRadius(), a.absorptionSpeed), !e.active && e.absorbedByCore && Qc(r, e);
16754
+ td(r, e, a) && e.beginAbsorption(), e.update(t, r.core.position, r.core.getHitboxRadius(), a.absorptionSpeed), !e.active && e.absorbedByCore && rd(r, e);
16677
16755
  }
16678
16756
  }
16679
- function Xc(r, e, t) {
16757
+ function td(r, e, t) {
16680
16758
  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);
16681
16759
  return a <= r.core.getHitboxRadius() + t.corePickupRadius || i <= t.psionicRadius + t.pickupRadius + e.radius;
16682
16760
  }
16683
- function Qc(r, e) {
16761
+ function rd(r, e) {
16684
16762
  r.progressBar.addExperience(e.value), r.juice.triggerFlash(0.12), r.floatingTexts.push({
16685
16763
  id: Math.random().toString(),
16686
16764
  text: r.i18n.translate("experienceCollected", { amount: e.value }),
@@ -16693,14 +16771,14 @@ function Qc(r, e) {
16693
16771
  size: 18
16694
16772
  });
16695
16773
  }
16696
- function ed(r, e) {
16774
+ function ad(r, e) {
16697
16775
  const { magnet: t, ecosoma: a } = r.configManager.getConfig();
16698
- for (const i of r.ecosomaOrbs) td({ engine: r, orb: i, dt: e, magnet: t, ecosoma: a });
16776
+ for (const i of r.ecosomaOrbs) id({ engine: r, orb: i, dt: e, magnet: t, ecosoma: a });
16699
16777
  r.ecosomaOrbs = r.ecosomaOrbs.filter((i) => i.active);
16700
16778
  }
16701
- function td(r) {
16779
+ function id(r) {
16702
16780
  const { engine: e, orb: t, dt: a, magnet: i, ecosoma: o } = r;
16703
- t.active && (rd(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({
16781
+ t.active && (od(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({
16704
16782
  id: Math.random().toString(),
16705
16783
  text: e.i18n.translate("ecosomaCollected", { amount: t.value }),
16706
16784
  position: { ...e.core.position },
@@ -16712,11 +16790,11 @@ function td(r) {
16712
16790
  size: 17
16713
16791
  })));
16714
16792
  }
16715
- function rd(r, e, t) {
16793
+ function od(r, e, t) {
16716
16794
  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);
16717
16795
  return a <= r.core.getHitboxRadius() + t.corePickupRadius || i <= t.psionicRadius + t.pickupRadius + e.radius;
16718
16796
  }
16719
- function ad(r) {
16797
+ function nd(r) {
16720
16798
  const e = r.configManager.getConfig().ecosoma;
16721
16799
  return r.debugPerformanceEnabled ? new Ze({
16722
16800
  ...e,
@@ -16725,20 +16803,20 @@ function ad(r) {
16725
16803
  maxDropChance: $e
16726
16804
  }) : new Ze(e);
16727
16805
  }
16728
- function id(r) {
16806
+ function sd(r) {
16729
16807
  if (r.rerollsRemaining <= 0) return;
16730
16808
  r.rerollsRemaining -= 1, r.juice.triggerFlash(0.4);
16731
16809
  const e = r.powerUpRegistry.getRandomOptions(3, r.geneticMemory, r.waveDirector.getAvailableEnemyIds(), r.coreRoster.getSelectedCoreId());
16732
16810
  r.orbitingOrbs = e.map((t, a) => {
16733
16811
  const i = a * Math.PI * 2 / e.length;
16734
- return new bt(`orb_${Date.now()}_${a}`, t, i);
16812
+ return new St(`orb_${Date.now()}_${a}`, t, i);
16735
16813
  });
16736
16814
  }
16737
- function od(r) {
16815
+ function ld(r) {
16738
16816
  const e = r.debugPerformanceEnabled ? performance.now() : 0;
16739
- r.renderer.render(nd(r)), ld(r), r.performanceAudit.finishRender(e);
16817
+ r.renderer.render(cd(r)), ud(r), r.performanceAudit.finishRender(e);
16740
16818
  }
16741
- function nd(r) {
16819
+ function cd(r) {
16742
16820
  const e = {
16743
16821
  core: r.core,
16744
16822
  enemies: r.getRenderList(),
@@ -16757,13 +16835,13 @@ function nd(r) {
16757
16835
  experienceProgress: r.progressBar.getProgress(),
16758
16836
  levelUpPulse: r.progressBar.getLevelUpPulse(),
16759
16837
  levelUpActive: r.isLevelUpActive,
16760
- areaVisual: sd(r),
16838
+ areaVisual: dd(r),
16761
16839
  boss: r.bossEncounter.getSnapshot(r.core.position),
16762
16840
  bossCatalyst: r.bossCatalyst
16763
16841
  };
16764
16842
  return r.isRunning && r.interactiveTutorial.isActive && (e.tutorial = r.interactiveTutorial), r.isDeathSequenceActive && (e.deathSequenceProgress = r.deathSequenceElapsed / ye), e;
16765
16843
  }
16766
- function sd(r) {
16844
+ function dd(r) {
16767
16845
  const e = r.areaDirector.getPhase();
16768
16846
  return {
16769
16847
  areaId: r.areaDirector.getAreaId(),
@@ -16775,7 +16853,7 @@ function sd(r) {
16775
16853
  entryProgress: r.isRunning && e === "area" ? Math.min(1, r.areaIntroElapsed / Q) : 1
16776
16854
  };
16777
16855
  }
16778
- function ld(r) {
16856
+ function ud(r) {
16779
16857
  r.isLevelUpActive && r.orbitingOrbs.length > 0 && r.renderer.drawings.drawOrbitingModifierOrbs({
16780
16858
  orbs: r.orbitingOrbs,
16781
16859
  time: r.core.pulsePhase,
@@ -16784,207 +16862,207 @@ function ld(r) {
16784
16862
  rerollsRemaining: r.rerollsRemaining
16785
16863
  });
16786
16864
  }
16787
- function cd(r) {
16865
+ function hd(r) {
16788
16866
  return r.isRunning ? r.enemies : r.isDeathSequenceActive ? [] : r.ambientEnemies;
16789
16867
  }
16790
- function dd(r) {
16868
+ function pd(r) {
16791
16869
  return r.debugRerollsEnabled ? 99 : 1;
16792
16870
  }
16793
- function ud(r, e = !1) {
16871
+ function md(r, e = !1) {
16794
16872
  if (!e && r.objectives.getSnapshots("mission").length > 0) return;
16795
16873
  const t = r.missionGenerator.generate();
16796
16874
  t && r.objectives.installMission(t);
16797
16875
  }
16798
- function hd(r) {
16876
+ function gd(r) {
16799
16877
  if (!r.objectives.canRerollMission()) return;
16800
16878
  const e = r.missionGenerator.generate();
16801
16879
  e && r.objectives.rerollMission(e);
16802
16880
  }
16803
- function pd(r) {
16881
+ function yd(r) {
16804
16882
  r.missionsDrawer.setAvailable(!0), r.startMenu.show();
16805
16883
  }
16806
- function md(r, e) {
16807
- r.objectives.startChallenge(e, r.coreRoster.getSelectedCoreId()) && (r.challengeRunId = e, r.challengesOverlay.hide(), r.startGame());
16884
+ function Ed(r, e) {
16885
+ r.objectives.startChallenge(e, r.coreRoster.getSelectedCoreId()) && (r.challengeRunId = e, r.challengesOverlay.hide(), r.startGame(), ll(r));
16808
16886
  }
16809
- function gd(r) {
16887
+ function vd(r) {
16810
16888
  return r.challengeRunId !== null;
16811
16889
  }
16812
- function yd(r, e) {
16890
+ function fd(r, e) {
16813
16891
  if (e.type === "ecosoma") {
16814
16892
  r.geneticMemory.collectEcosoma(e.amount);
16815
16893
  return;
16816
16894
  }
16817
16895
  e.type === "powerup" && r.geneticMemory.grantUnlock(e.unlockId);
16818
16896
  }
16819
- function Ed(r) {
16897
+ function xd(r) {
16820
16898
  r.gameLoop.stop(), r.performanceAudit.destroy(), r.coreRosterOverlay.destroy(), r.geneticMemoryOverlay.destroy(), r.coreRunSummaryOverlay.destroy(), r.challengeResultOverlay.destroy(), r.challengeCompletionCinematic.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();
16821
16899
  }
16822
- class vd extends nl {
16900
+ class Sd extends cl {
16823
16901
  constructor(e) {
16824
16902
  super(e);
16825
16903
  }
16826
16904
  setLanguage(e) {
16827
- sl(this, e);
16905
+ dl(this, e);
16828
16906
  }
16829
16907
  setTheme(e) {
16830
- ll(this, e);
16908
+ ul(this, e);
16831
16909
  }
16832
16910
  getLanguage() {
16833
- return cl(this);
16911
+ return hl(this);
16834
16912
  }
16835
16913
  getTheme() {
16836
- return dl(this);
16914
+ return pl(this);
16837
16915
  }
16838
16916
  onLanguageChanged(e) {
16839
- ul(this);
16917
+ ml(this);
16840
16918
  }
16841
16919
  initAmbientArena() {
16842
- hl(this);
16920
+ gl(this);
16843
16921
  }
16844
16922
  syncSelectedCorePreview() {
16845
- pl(this);
16923
+ yl(this);
16846
16924
  }
16847
16925
  resizeCanvas() {
16848
- ml(this);
16926
+ El(this);
16849
16927
  }
16850
16928
  setupEvents() {
16851
- xl(this);
16929
+ Cl(this);
16852
16930
  }
16853
16931
  startGame() {
16854
- kl(this);
16932
+ Dl(this);
16855
16933
  }
16856
16934
  clearTransientRunState() {
16857
- Ll(this);
16935
+ Bl(this);
16858
16936
  }
16859
16937
  updateRepelProjectiles(e) {
16860
- _l(this, e);
16938
+ Hl(this, e);
16861
16939
  }
16862
16940
  isRepelProjectileBlocked(e) {
16863
- return Ul(this, e);
16941
+ return Fl(this, e);
16864
16942
  }
16865
16943
  clearTransientRunEntities() {
16866
- Kl(this);
16944
+ Vl(this);
16867
16945
  }
16868
16946
  updateDeathSequence(e) {
16869
- Fl(this, e);
16947
+ Wl(this, e);
16870
16948
  }
16871
16949
  update(e) {
16872
- Gl(this, e);
16950
+ ql(this, e);
16873
16951
  }
16874
16952
  handleEnemyKill() {
16875
- sc(this);
16953
+ dc(this);
16876
16954
  }
16877
16955
  startBossIfReady() {
16878
- lc(this);
16956
+ uc(this);
16879
16957
  }
16880
16958
  clearArenaForBoss() {
16881
- cc(this);
16959
+ hc(this);
16882
16960
  }
16883
16961
  processBossImpacts() {
16884
- dc(this);
16962
+ pc(this);
16885
16963
  }
16886
16964
  processSmasherBossImpact() {
16887
- hc(this);
16965
+ gc(this);
16888
16966
  }
16889
16967
  getBossImpactRadius(e) {
16890
- return Ec(this, e);
16968
+ return xc(this, e);
16891
16969
  }
16892
16970
  releaseBossExposureBurst() {
16893
- vc(this);
16971
+ Sc(this);
16894
16972
  }
16895
16973
  updateBossExposureBurst(e) {
16896
- fc(this, e);
16974
+ bc(this, e);
16897
16975
  }
16898
16976
  updateBossMinionReentryPaths() {
16899
- xc(this);
16977
+ Cc(this);
16900
16978
  }
16901
16979
  resetBossExposureBurst() {
16902
- Ic(this);
16980
+ wc(this);
16903
16981
  }
16904
16982
  finishBossIfDefeated() {
16905
- Rc(this);
16983
+ kc(this);
16906
16984
  }
16907
16985
  getBossRewardPosition() {
16908
- return kc(this);
16986
+ return Dc(this);
16909
16987
  }
16910
16988
  updateBossReward(e) {
16911
- Pc(this, e);
16989
+ Oc(this, e);
16912
16990
  }
16913
16991
  tryCollectCatalyst() {
16914
- Mc(this);
16992
+ Nc(this);
16915
16993
  }
16916
16994
  updateAreaTransition(e) {
16917
- Dc(this, e);
16995
+ Lc(this, e);
16918
16996
  }
16919
16997
  triggerLevelUp(e) {
16920
- Kc(this, e);
16998
+ Vc(this, e);
16921
16999
  }
16922
17000
  presentNextLevelUp() {
16923
- Fc(this);
17001
+ Wc(this);
16924
17002
  }
16925
17003
  spawnExperienceDrops() {
16926
- Wc(this);
17004
+ Yc(this);
16927
17005
  }
16928
17006
  recordEnemyObservation(e) {
16929
- qc(this, e);
17007
+ Zc(this, e);
16930
17008
  }
16931
17009
  recordEnemyObservations(e) {
16932
- $c(this, e);
17010
+ Jc(this, e);
16933
17011
  }
16934
17012
  isEnemyVisible(e) {
16935
- return Yc(this, e);
17013
+ return Xc(this, e);
16936
17014
  }
16937
17015
  updateExperienceOrbs(e) {
16938
- Zc(this, e);
17016
+ Qc(this, e);
16939
17017
  }
16940
17018
  updateEcosomaOrbs(e) {
16941
- ed(this, e);
17019
+ ad(this, e);
16942
17020
  }
16943
17021
  getEcosomaDropPolicy() {
16944
- return ad(this);
17022
+ return nd(this);
16945
17023
  }
16946
17024
  triggerReroll() {
16947
- id(this);
17025
+ sd(this);
16948
17026
  }
16949
17027
  render() {
16950
- od(this);
17028
+ ld(this);
16951
17029
  }
16952
17030
  getRenderList() {
16953
- return cd(this);
17031
+ return hd(this);
16954
17032
  }
16955
17033
  getRerollLimit() {
16956
- return dd(this);
17034
+ return pd(this);
16957
17035
  }
16958
17036
  refreshGeneratedMission(e = !1) {
16959
- ud(this, e);
17037
+ md(this, e);
16960
17038
  }
16961
17039
  rerollMission() {
16962
- hd(this);
17040
+ gd(this);
16963
17041
  }
16964
17042
  showStartMenu() {
16965
- pd(this);
17043
+ yd(this);
16966
17044
  }
16967
17045
  startChallenge(e) {
16968
- md(this, e);
17046
+ Ed(this, e);
16969
17047
  }
16970
17048
  isChallengeRun() {
16971
- return gd(this);
17049
+ return vd(this);
16972
17050
  }
16973
17051
  applyObjectiveReward(e) {
16974
- yd(this, e);
17052
+ fd(this, e);
16975
17053
  }
16976
17054
  destroy() {
16977
- Ed(this);
17055
+ xd(this);
16978
17056
  }
16979
17057
  }
16980
- function fd(r) {
16981
- return new vd(r);
17058
+ function bd(r) {
17059
+ return new Sd(r);
16982
17060
  }
16983
17061
  export {
16984
17062
  Za as BrowserPlatform,
16985
- vd as GameEngine,
17063
+ Sd as GameEngine,
16986
17064
  Ca as LANGUAGES,
16987
17065
  pr as ThemeManager,
16988
- fd as createAxonSurge,
17066
+ bd as createAxonSurge,
16989
17067
  re as isLanguage
16990
17068
  };