From 97064826b22d2ef4c123eff71cf1dcfba59d5db9 Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Fri, 20 Jun 2025 04:41:13 -0700
Subject: [PATCH] feat: unlockAllProfitTakerStages cheat (#2215)
Closes #2081
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2215
Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com>
Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
---
 config.json.example                        |  1 +
 src/controllers/api/inventoryController.ts | 20 ++++++++++++++++++++
 src/services/configService.ts              |  1 +
 static/webui/index.html                    |  4 ++++
 static/webui/translations/de.js            |  1 +
 static/webui/translations/en.js            |  1 +
 static/webui/translations/es.js            |  1 +
 static/webui/translations/fr.js            |  1 +
 static/webui/translations/ru.js            |  1 +
 static/webui/translations/zh.js            |  1 +
 10 files changed, 32 insertions(+)
diff --git a/config.json.example b/config.json.example
index 8dfdfd31..e35b62df 100644
--- a/config.json.example
+++ b/config.json.example
@@ -43,6 +43,7 @@
   "noDeathMarks": false,
   "noKimCooldowns": false,
   "syndicateMissionsRepeatable": false,
+  "unlockAllProfitTakerStages": false,
   "instantFinishRivenChallenge": false,
   "instantResourceExtractorDrones": false,
   "noResourceExtractorDronesDamage": false,
diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts
index df04e9d4..cdaf8d4d 100644
--- a/src/controllers/api/inventoryController.ts
+++ b/src/controllers/api/inventoryController.ts
@@ -339,9 +339,29 @@ export const getInventoryResponse = async (
         }
     }
 
+    if (config.unlockAllProfitTakerStages) {
+        inventoryResponse.CompletedJobChains ??= [];
+        const EudicoHeists = inventoryResponse.CompletedJobChains.find(x => x.LocationTag == "EudicoHeists");
+        if (EudicoHeists) {
+            EudicoHeists.Jobs = allEudicoHeistJobs;
+        } else {
+            inventoryResponse.CompletedJobChains.push({
+                LocationTag: "EudicoHeists",
+                Jobs: allEudicoHeistJobs
+            });
+        }
+    }
+
     return inventoryResponse;
 };
 
+const allEudicoHeistJobs = [
+    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyOne",
+    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyTwo",
+    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyThree",
+    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyFour"
+];
+
 const addString = (arr: string[], str: string): void => {
     if (arr.indexOf(str) == -1) {
         arr.push(str);
diff --git a/src/services/configService.ts b/src/services/configService.ts
index b14ffb67..20515ee2 100644
--- a/src/services/configService.ts
+++ b/src/services/configService.ts
@@ -49,6 +49,7 @@ export interface IConfig {
     noDeathMarks?: boolean;
     noKimCooldowns?: boolean;
     syndicateMissionsRepeatable?: boolean;
+    unlockAllProfitTakerStages?: boolean;
     instantFinishRivenChallenge?: boolean;
     instantResourceExtractorDrones?: boolean;
     noResourceExtractorDronesDamage?: boolean;
diff --git a/static/webui/index.html b/static/webui/index.html
index b6d87db4..3e0856bf 100644
--- a/static/webui/index.html
+++ b/static/webui/index.html
@@ -708,6 +708,10 @@
                                         
                                         
                                     
+                                    
+                                        
+                                        
+                                    
                                     
                                         
                                         
diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js
index 6672d726..bb7ec5dc 100644
--- a/static/webui/translations/de.js
+++ b/static/webui/translations/de.js
@@ -159,6 +159,7 @@ dict = {
     cheats_noDeathMarks: `Keine Todesmarkierungen`,
     cheats_noKimCooldowns: `Keine Wartezeit bei KIM`,
     cheats_syndicateMissionsRepeatable: `Syndikat-Missionen wiederholbar`,
+    cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
     cheats_instantFinishRivenChallenge: `Riven-Mod Herausforderung sofort abschließen`,
     cheats_instantResourceExtractorDrones: `Sofortige Ressourcen-Extraktor-Drohnen`,
     cheats_noResourceExtractorDronesDamage: `Kein Schaden für Ressourcen-Extraktor-Drohnen`,
diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js
index f7869ac2..7a227acb 100644
--- a/static/webui/translations/en.js
+++ b/static/webui/translations/en.js
@@ -158,6 +158,7 @@ dict = {
     cheats_noDeathMarks: `No Death Marks`,
     cheats_noKimCooldowns: `No KIM Cooldowns`,
     cheats_syndicateMissionsRepeatable: `Syndicate Missions Repeatable`,
+    cheats_unlockAllProfitTakerStages: `Unlock All Profit Taker Stages`,
     cheats_instantFinishRivenChallenge: `Instant Finish Riven Challenge`,
     cheats_instantResourceExtractorDrones: `Instant Resource Extractor Drones`,
     cheats_noResourceExtractorDronesDamage: `No Resource Extractor Drones Damage`,
diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js
index 79aedacd..5ee94df3 100644
--- a/static/webui/translations/es.js
+++ b/static/webui/translations/es.js
@@ -159,6 +159,7 @@ dict = {
     cheats_noDeathMarks: `Sin marcas de muerte`,
     cheats_noKimCooldowns: `Sin tiempo de espera para conversaciones KIM`,
     cheats_syndicateMissionsRepeatable: `Misiones de sindicato rejugables`,
+    cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
     cheats_instantFinishRivenChallenge: `Terminar desafío de agrietado inmediatamente`,
     cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
     cheats_noResourceExtractorDronesDamage: `Sin daño a los drones extractores de recursos`,
diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js
index c605fce8..a4814e2f 100644
--- a/static/webui/translations/fr.js
+++ b/static/webui/translations/fr.js
@@ -159,6 +159,7 @@ dict = {
     cheats_noDeathMarks: `Aucune marque d'assassin`,
     cheats_noKimCooldowns: `Aucun cooldown sur le KIM`,
     cheats_syndicateMissionsRepeatable: `Mission syndicat répétables`,
+    cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
     cheats_instantFinishRivenChallenge: `Débloquer le challenge Riven instantanément`,
     cheats_instantResourceExtractorDrones: `Ressources de drones d'extraction instantannées`,
     cheats_noResourceExtractorDronesDamage: `Aucun dégâts aux drones d'extraction de resources`,
diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js
index cb89fa7d..22277b35 100644
--- a/static/webui/translations/ru.js
+++ b/static/webui/translations/ru.js
@@ -159,6 +159,7 @@ dict = {
     cheats_noDeathMarks: `Без меток сметри`,
     cheats_noKimCooldowns: `Чаты KIM без кулдауна`,
     cheats_syndicateMissionsRepeatable: `[UNTRANSLATED] Syndicate Missions Repeatable`,
+    cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
     cheats_instantFinishRivenChallenge: `[UNTRANSLATED] Instant Finish Riven Challenge`,
     cheats_instantResourceExtractorDrones: `Мгновенные Экстракторы Ресурсов`,
     cheats_noResourceExtractorDronesDamage: `Без урона по дронам-сборщикам`,
diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js
index 06b2ece9..44917ae8 100644
--- a/static/webui/translations/zh.js
+++ b/static/webui/translations/zh.js
@@ -159,6 +159,7 @@ dict = {
     cheats_noDeathMarks: `无死亡标记(不会被 Stalker/Grustrag 三霸/Zanuka 猎人等标记)`,
     cheats_noKimCooldowns: `无 KIM 冷却时间`,
     cheats_syndicateMissionsRepeatable: `集团任务可重复`,
+    cheats_unlockAllProfitTakerStages: `[UNTRANSLATED] Unlock All Profit Taker Stages`,
     cheats_instantFinishRivenChallenge: `立即完成裂罅挑战`,
     cheats_instantResourceExtractorDrones: `即时资源采集无人机`,
     cheats_noResourceExtractorDronesDamage: `资源提取器不会损毁`,