XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

XFEstudio/SpaceNinjaServer

feat: daily synthesis (#1014)

Closes #386 Closes #533 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1014 Co-authored-by: Sainan <sainan@calamity.inc> Co-committed-by: Sainan <sainan@calamity.inc>

28a36052
Sainan <sainan@calamity.inc>
提交于

代码差异

11 个文件 +259 -16
Added src/controllers/api/abandonLibraryDailyTaskController.ts +11 -0
@@ -0,0 +1,11 @@
1 import { getInventory } from "@/src/services/inventoryService";
2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 import { RequestHandler } from "express";
4
5 export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {
6 const accountId = await getAccountIdForRequest(req);
7 const inventory = await getInventory(accountId);
8 inventory.LibraryActiveDailyTaskInfo = undefined;
9 await inventory.save();
10 res.status(200).end();
11 };
Added src/controllers/api/claimLibraryDailyTaskRewardController.ts +31 -0
@@ -0,0 +1,31 @@
1 import { getInventory } from "@/src/services/inventoryService";
2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 import { RequestHandler } from "express";
4
5 export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {
6 const accountId = await getAccountIdForRequest(req);
7 const inventory = await getInventory(accountId);
8
9 const rewardQuantity = inventory.LibraryActiveDailyTaskInfo!.RewardQuantity;
10 const rewardStanding = inventory.LibraryActiveDailyTaskInfo!.RewardStanding;
11 inventory.LibraryActiveDailyTaskInfo = undefined;
12 inventory.LibraryAvailableDailyTaskInfo = undefined;
13
14 let syndicate = inventory.Affiliations.find(x => x.Tag == "LibrarySyndicate");
15 if (!syndicate) {
16 syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: "LibrarySyndicate", Standing: 0 }) - 1];
17 }
18 syndicate.Standing += rewardStanding;
19
20 inventory.FusionPoints += 80 * rewardQuantity;
21 await inventory.save();
22
23 res.json({
24 RewardItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle",
25 RewardQuantity: rewardQuantity,
26 StandingAwarded: rewardStanding,
27 InventoryChanges: {
28 FusionPoints: 80 * rewardQuantity
29 }
30 });
31 };
Modified src/controllers/api/inventoryController.ts +4 -1
@@ -14,7 +14,7 @@ import {
14 14 ExportVirtuals
15 15 } from "warframe-public-export-plus";
16 16 import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "./infestedFoundryController";
17 import { allDailyAffiliationKeys } from "@/src/services/inventoryService";
17 import { allDailyAffiliationKeys, createLibraryDailyTask } from "@/src/services/inventoryService";
18 18
19 19 export const inventoryController: RequestHandler = async (request, response) => {
20 20 const account = await getAccountForRequest(request);
@@ -36,6 +36,9 @@ export const inventoryController: RequestHandler = async (request, response) =>
36 36 inventory[key] = 16000 + inventory.PlayerLevel * 500;
37 37 }
38 38 inventory.DailyFocus = 250000 + inventory.PlayerLevel * 5000;
39
40 inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
41
39 42 await inventory.save();
40 43 }
41 44
Added src/controllers/api/startLibraryDailyTaskController.ts +11 -0
@@ -0,0 +1,11 @@
1 import { getInventory } from "@/src/services/inventoryService";
2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 import { RequestHandler } from "express";
4
5 export const startLibraryDailyTaskController: RequestHandler = async (req, res) => {
6 const accountId = await getAccountIdForRequest(req);
7 const inventory = await getInventory(accountId);
8 inventory.LibraryActiveDailyTaskInfo = inventory.LibraryAvailableDailyTaskInfo;
9 await inventory.save();
10 res.json(inventory.LibraryAvailableDailyTaskInfo);
11 };
Modified src/models/inventoryModels/inventoryModel.ts +5 -3
@@ -68,7 +68,7 @@ import {
68 68 ICalendarProgress,
69 69 IPendingCouponDatabase,
70 70 IPendingCouponClient,
71 ILibraryAvailableDailyTaskInfo,
71 ILibraryDailyTaskInfo,
72 72 IDroneDatabase,
73 73 IDroneClient
74 74 } from "../../types/inventoryTypes/inventoryTypes";
@@ -950,11 +950,12 @@ pendingCouponSchema.set("toJSON", {
950 950 }
951 951 });
952 952
953 const libraryAvailableDailyTaskInfoSchema = new Schema<ILibraryAvailableDailyTaskInfo>(
953 const libraryDailyTaskInfoSchema = new Schema<ILibraryDailyTaskInfo>(
954 954 {
955 955 EnemyTypes: [String],
956 956 EnemyLocTag: String,
957 957 EnemyIcon: String,
958 Scans: Number,
958 959 ScansRequired: Number,
959 960 RewardStoreItem: String,
960 961 RewardQuantity: Number,
@@ -1209,7 +1210,8 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
1209 1210 //Cephalon Simaris Entries Example:"TargetType"+"Scans"(1-10)+"Completed": true|false
1210 1211 LibraryPersonalProgress: [Schema.Types.Mixed],
1211 1212 //Cephalon Simaris Daily Task
1212 LibraryAvailableDailyTaskInfo: libraryAvailableDailyTaskInfoSchema,
1213 LibraryAvailableDailyTaskInfo: libraryDailyTaskInfoSchema,
1214 LibraryActiveDailyTaskInfo: libraryDailyTaskInfoSchema,
1213 1215
1214 1216 //https://warframe.fandom.com/wiki/Invasion
1215 1217 InvasionChainProgress: [Schema.Types.Mixed],
Modified src/routes/api.ts +6 -0
@@ -1,4 +1,5 @@
1 1 import express from "express";
2 import { abandonLibraryDailyTaskController } from "@/src/controllers/api/abandonLibraryDailyTaskController";
2 3 import { activateRandomModController } from "@/src/controllers/api/activateRandomModController";
3 4 import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
4 5 import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController";
@@ -7,6 +8,7 @@ import { artifactsController } from "@/src/controllers/api/artifactsController";
7 8 import { changeDojoRootController } from "@/src/controllers/api/changeDojoRootController";
8 9 import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController";
9 10 import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController";
11 import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/claimLibraryDailyTaskRewardController";
10 12 import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController";
11 13 import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController";
12 14 import { createGuildController } from "@/src/controllers/api/createGuildController";
@@ -75,6 +77,7 @@ import { setSupportedSyndicateController } from "@/src/controllers/api/setSuppor
75 77 import { setWeaponSkillTreeController } from "@/src/controllers/api/setWeaponSkillTreeController";
76 78 import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController";
77 79 import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController";
80 import { startLibraryDailyTaskController } from "@/src/controllers/api/startLibraryDailyTaskController";
78 81 import { startLibraryPersonalTargetController } from "@/src/controllers/api/startLibraryPersonalTargetController";
79 82 import { startRecipeController } from "@/src/controllers/api/startRecipeController";
80 83 import { stepSequencersController } from "@/src/controllers/api/stepSequencersController";
@@ -93,7 +96,9 @@ import { upgradesController } from "@/src/controllers/api/upgradesController";
93 96 const apiRouter = express.Router();
94 97
95 98 // get
99 apiRouter.get("/abandonLibraryDailyTask.php", abandonLibraryDailyTaskController);
96 100 apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController);
101 apiRouter.get("/claimLibraryDailyTaskReward.php", claimLibraryDailyTaskRewardController);
97 102 apiRouter.get("/credits.php", creditsController);
98 103 apiRouter.get("/deleteSession.php", deleteSessionController);
99 104 apiRouter.get("/dojo", dojoController);
@@ -121,6 +126,7 @@ apiRouter.get("/setActiveQuest.php", setActiveQuestController);
121 126 apiRouter.get("/setActiveShip.php", setActiveShipController);
122 127 apiRouter.get("/setBootLocation.php", setBootLocationController);
123 128 apiRouter.get("/setSupportedSyndicate.php", setSupportedSyndicateController);
129 apiRouter.get("/startLibraryDailyTask.php", startLibraryDailyTaskController);
124 130 apiRouter.get("/startLibraryPersonalTarget.php", startLibraryPersonalTargetController);
125 131 apiRouter.get("/surveys.php", surveysController);
126 132 apiRouter.get("/updateSession.php", updateSessionGetController);
Modified src/services/inventoryService.ts +17 -10
@@ -23,7 +23,7 @@ import {
23 23 IInventoryDatabase,
24 24 IKubrowPetEggDatabase,
25 25 IKubrowPetEggClient,
26 ILibraryAvailableDailyTaskInfo,
26 ILibraryDailyTaskInfo,
27 27 ICalendarProgress,
28 28 IDroneClient,
29 29 IUpgradeClient
@@ -42,6 +42,7 @@ import {
42 42 ExportBundles,
43 43 ExportCustoms,
44 44 ExportDrones,
45 ExportEnemies,
45 46 ExportFlavour,
46 47 ExportFusionBundles,
47 48 ExportGear,
@@ -63,6 +64,8 @@ import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedContro
63 64 import { addStartingGear } from "@/src/controllers/api/giveStartingGearController";
64 65 import { addQuestKey, completeQuest } from "@/src/services/questService";
65 66 import { handleBundleAcqusition } from "./purchaseService";
67 import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
68 import { getRandomElement, getRandomInt } from "./rngService";
66 69
67 70 export const createInventory = async (
68 71 accountOwnerId: Types.ObjectId,
@@ -77,7 +80,7 @@ export const createInventory = async (
77 80 ReceivedStartingGear: config.skipTutorial
78 81 });
79 82
80 inventory.LibraryAvailableDailyTaskInfo = createLibraryAvailableDailyTaskInfo();
83 inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
81 84 inventory.CalendarProgress = createCalendar();
82 85 inventory.RewardSeed = generateRewardSeed();
83 86 inventory.DuviriInfo = {
@@ -1193,15 +1196,19 @@ export const addKeyChainItems = async (
1193 1196
1194 1197 return inventoryChanges;
1195 1198 };
1196 const createLibraryAvailableDailyTaskInfo = (): ILibraryAvailableDailyTaskInfo => {
1199
1200 export const createLibraryDailyTask = (): ILibraryDailyTaskInfo => {
1201 const enemyTypes = getRandomElement(libraryDailyTasks);
1202 const enemyAvatar = ExportEnemies.avatars[enemyTypes[0]];
1203 const scansRequired = getRandomInt(2, 4);
1197 1204 return {
1198 EnemyTypes: ["/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"],
1199 EnemyLocTag: "/Lotus/Language/Game/CorruptedLancer",
1200 EnemyIcon: "/Lotus/Interface/Icons/Npcs/OrokinRifleLancerAvatar.png",
1201 ScansRequired: 3,
1202 RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/UncommonFusionBundle",
1203 RewardQuantity: 7,
1204 RewardStanding: 7500
1205 EnemyTypes: enemyTypes,
1206 EnemyLocTag: enemyAvatar.name,
1207 EnemyIcon: enemyAvatar.icon!,
1208 ScansRequired: scansRequired,
1209 RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle",
1210 RewardQuantity: Math.trunc(scansRequired * 2.5),
1211 RewardStanding: 2500 * scansRequired
1205 1212 };
1206 1213 };
1207 1214
Modified src/services/missionInventoryUpdateService.ts +16 -0
@@ -185,6 +185,22 @@ export const addMissionInventoryUpdates = (
185 185 }
186 186 });
187 187 break;
188 case "LibraryScans":
189 value.forEach(scan => {
190 if (inventory.LibraryActiveDailyTaskInfo) {
191 if (inventory.LibraryActiveDailyTaskInfo.EnemyTypes.find(x => x == scan.EnemyType)) {
192 inventory.LibraryActiveDailyTaskInfo.Scans ??= 0;
193 inventory.LibraryActiveDailyTaskInfo.Scans += scan.Count;
194 } else {
195 logger.warn(
196 `ignoring synthesis of ${scan.EnemyType} as it's not part of the active daily task`
197 );
198 }
199 } else {
200 logger.warn(`no library daily task active, ignoring synthesis of ${scan.EnemyType}`);
201 }
202 });
203 break;
188 204 case "SyndicateId": {
189 205 inventory.CompletedSyndicates.push(value);
190 206 break;
Modified src/types/inventoryTypes/inventoryTypes.ts +4 -2
@@ -320,7 +320,8 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
320 320 LibraryPersonalTarget: string;
321 321 LibraryPersonalProgress: ILibraryPersonalProgress[];
322 322 CollectibleSeries: ICollectibleSery[];
323 LibraryAvailableDailyTaskInfo: ILibraryAvailableDailyTaskInfo;
323 LibraryAvailableDailyTaskInfo?: ILibraryDailyTaskInfo;
324 LibraryActiveDailyTaskInfo?: ILibraryDailyTaskInfo;
324 325 HasResetAccount: boolean;
325 326 PendingCoupon?: IPendingCouponClient;
326 327 Harvestable: boolean;
@@ -658,10 +659,11 @@ export interface ILastSortieReward {
658 659 Manifest: string;
659 660 }
660 661
661 export interface ILibraryAvailableDailyTaskInfo {
662 export interface ILibraryDailyTaskInfo {
662 663 EnemyTypes: string[];
663 664 EnemyLocTag: string;
664 665 EnemyIcon: string;
666 Scans?: number;
665 667 ScansRequired: number;
666 668 RewardStoreItem: string;
667 669 RewardQuantity: number;
Modified src/types/requestTypes.ts +6 -0
@@ -92,6 +92,12 @@ export type IMissionInventoryUpdateRequest = {
92 92 IsFinalWave: boolean;
93 93 Participants: IVoidTearParticipantInfo[];
94 94 };
95 LibraryScans?: {
96 EnemyType: string;
97 Count: number;
98 CodexScanCount: number;
99 Standing: number;
100 }[];
95 101 } & {
96 102 [K in TEquipmentKey]?: IEquipmentClient[];
97 103 };
Added static/fixed_responses/libraryDailyTasks.json +148 -0
@@ -0,0 +1,148 @@
1 [
2 [
3 "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/LaserCannonBipedAvatar",
4 "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/RailgunBipedAvatar",
5 "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/ShockwaveBipedAvatar"
6 ],
7 [
8 "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/LaserDiscBipedAvatar"
9 ],
10 [
11 "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/SuperMoaBipedAvatar"
12 ],
13 [
14 "/Lotus/Types/Enemies/Corpus/Spaceman/EliteSpacemanAvatar",
15 "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/RifleSpacemanAvatar",
16 "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/DeployableSpacemanAvatar",
17 "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/MeleeSpacemanAvatar",
18 "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/ShotgunSpacemanAvatar",
19 "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/SniperSpacemanAvatar"
20 ],
21 [
22 "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/NullifySpacemanAvatar"
23 ],
24 [
25 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BeastMasterAvatar"
26 ],
27 [
28 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BladeSawmanAvatar",
29 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BlowtorchSawmanAvatar",
30 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/PistonSawmanAvatar",
31 "/Lotus/Types/Enemies/Grineer/Desert/Avatars/BladeSawmanAvatar",
32 "/Lotus/Types/Enemies/Grineer/Forest/Avatars/BladeSawmanAvatar",
33 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/BladeSawmanAvatar"
34 ],
35 [
36 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/RifleLancerAvatar",
37 "/Lotus/Types/Enemies/Grineer/Desert/Avatars/EliteRifleLancerAvatar",
38 "/Lotus/Types/Enemies/Grineer/Desert/Avatars/RifleLancerAvatar",
39 "/Lotus/Types/Enemies/Grineer/Forest/Avatars/EliteRifleLancerAvatar",
40 "/Lotus/Types/Enemies/Grineer/Forest/Avatars/RifleLancerAvatar",
41 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/EliteRifleLancerAvatar",
42 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/RifleLancerAvatar",
43 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/EliteRifleLancerAvatar"
44 ],
45 [
46 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/EviseratorLancerAvatar",
47 "/Lotus/Types/Enemies/Grineer/Forest/Avatars/EvisceratorLancerAvatar",
48 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/EvisceratorLancerAvatar",
49 "/Lotus/Types/Enemies/Grineer/Desert/Avatars/EvisceratorLancerAvatar"
50 ],
51 [
52 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/FemaleGrineerAvatar",
53 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerSniperAvatar"
54 ],
55 [
56 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/FlameLancerAvatar"
57 ],
58 [
59 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/GrineerMeleeStaffAvatar"
60 ],
61 [
62 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/HeavyFemaleGrineerAvatar",
63 "/Lotus/Types/Enemies/Grineer/Desert/HeavyFemaleGrineerAvatarDesert",
64 "/Lotus/Types/Enemies/Grineer/Forest/HeavyFemaleGrineerAvatarDesert",
65 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerHeavyAvatar"
66 ],
67 [
68 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/IncendiaryBombardAvatar"
69 ],
70 [
71 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/JetpackMarineAvatar",
72 "/Lotus/Types/Enemies/Grineer/Desert/Avatars/JetpackMarineAvatar",
73 "/Lotus/Types/Enemies/Grineer/Forest/Avatars/JetpackMarineAvatar",
74 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/JetpackMarineAvatar"
75 ],
76 [
77 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/MacheteWomanAvatar",
78 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerMacheteAvatar"
79 ],
80 [
81 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/ShieldLancerAvatar"
82 ],
83 [
84 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/ShotgunLancerAvatar",
85 "/Lotus/Types/Enemies/Grineer/Desert/Avatars/ShotgunLancerAvatar",
86 "/Lotus/Types/Enemies/Grineer/Forest/Avatars/ShotgunLancerAvatar",
87 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/ShotgunLancerAvatar"
88 ],
89 [
90 "/Lotus/Types/Enemies/Grineer/GrineerAvatars/GrineerMarinePistolAvatar",
91 "/Lotus/Types/Enemies/Grineer/Desert/Avatars/GrineerMarinePistolAvatar",
92 "/Lotus/Types/Enemies/Grineer/Forest/Avatars/GrineerMarinePistolAvatar",
93 "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/GrineerMarinePistolAvatar"
94 ],
95 [
96 "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/AncientAvatar",
97 "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/HealingAncientAvatar",
98 "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/ToxicAncientAvatar"
99 ],
100 [
101 "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/DiseasedAncientAvatar"
102 ],
103 [
104 "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/SpawningAncientAvatar"
105 ],
106 [
107 "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/CrawlerAvatar",
108 "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/NoxiousCrawlerAvatar",
109 "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/GraspingCrawlerAvatar",
110 "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/GrenadeAvatar",
111 "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/LightningAvatar"
112 ],
113 [
114 "/Lotus/Types/Enemies/Infested/AiWeek/InfestedMoas/NaniteCloudBipedAvatar",
115 "/Lotus/Types/Enemies/Infested/AiWeek/InfestedMoas/SlowBombBipedAvatar"
116 ],
117 [
118 "/Lotus/Types/Enemies/Infested/AiWeek/Quadrupeds/QuadrupedAvatar"
119 ],
120 [
121 "/Lotus/Types/Enemies/Infested/AiWeek/Runners/LeapingRunnerAvatar",
122 "/Lotus/Types/Enemies/Infested/AiWeek/Runners/RunnerAvatar"
123 ],
124 [
125 "/Lotus/Types/Enemies/Orokin/OrokinBladeSawmanAvatar"
126 ],
127 [
128 "/Lotus/Types/Enemies/Orokin/OrokinHealingAncientAvatar"
129 ],
130 [
131 "/Lotus/Types/Enemies/Orokin/OrokinHeavyFemaleAvatar"
132 ],
133 [
134 "/Lotus/Types/Enemies/Orokin/OrokinNullifySpacemanAvatar"
135 ],
136 [
137 "/Lotus/Types/Enemies/Orokin/OrokinRocketBombardAvatar"
138 ],
139 [
140 "/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"
141 ],
142 [
143 "/Lotus/Types/Enemies/Orokin/RifleSpacemanAvatar"
144 ],
145 [
146 "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/RocketBombardAvatar"
147 ]
148 ]