feat: daily synthesis (#1014)
All checks were successful
Build / build (20) (push) Successful in 36s
Build / build (18) (push) Successful in 1m4s
Build / build (22) (push) Successful in 58s
Build Docker image / docker (push) Successful in 36s

Closes #386
Closes #533

Reviewed-on: #1014
Co-authored-by: Sainan <sainan@calamity.inc>
Co-committed-by: Sainan <sainan@calamity.inc>
This commit is contained in:
Sainan 2025-02-25 17:31:52 -08:00 committed by OrdisPrime
parent d7628d46e9
commit 28a36052d9
11 changed files with 259 additions and 16 deletions

View File

@ -0,0 +1,11 @@
import { getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { RequestHandler } from "express";
export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const inventory = await getInventory(accountId);
inventory.LibraryActiveDailyTaskInfo = undefined;
await inventory.save();
res.status(200).end();
};

View File

@ -0,0 +1,31 @@
import { getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { RequestHandler } from "express";
export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const inventory = await getInventory(accountId);
const rewardQuantity = inventory.LibraryActiveDailyTaskInfo!.RewardQuantity;
const rewardStanding = inventory.LibraryActiveDailyTaskInfo!.RewardStanding;
inventory.LibraryActiveDailyTaskInfo = undefined;
inventory.LibraryAvailableDailyTaskInfo = undefined;
let syndicate = inventory.Affiliations.find(x => x.Tag == "LibrarySyndicate");
if (!syndicate) {
syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: "LibrarySyndicate", Standing: 0 }) - 1];
}
syndicate.Standing += rewardStanding;
inventory.FusionPoints += 80 * rewardQuantity;
await inventory.save();
res.json({
RewardItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle",
RewardQuantity: rewardQuantity,
StandingAwarded: rewardStanding,
InventoryChanges: {
FusionPoints: 80 * rewardQuantity
}
});
};

View File

@ -14,7 +14,7 @@ import {
ExportVirtuals ExportVirtuals
} from "warframe-public-export-plus"; } from "warframe-public-export-plus";
import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "./infestedFoundryController"; import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "./infestedFoundryController";
import { allDailyAffiliationKeys } from "@/src/services/inventoryService"; import { allDailyAffiliationKeys, createLibraryDailyTask } from "@/src/services/inventoryService";
export const inventoryController: RequestHandler = async (request, response) => { export const inventoryController: RequestHandler = async (request, response) => {
const account = await getAccountForRequest(request); const account = await getAccountForRequest(request);
@ -36,6 +36,9 @@ export const inventoryController: RequestHandler = async (request, response) =>
inventory[key] = 16000 + inventory.PlayerLevel * 500; inventory[key] = 16000 + inventory.PlayerLevel * 500;
} }
inventory.DailyFocus = 250000 + inventory.PlayerLevel * 5000; inventory.DailyFocus = 250000 + inventory.PlayerLevel * 5000;
inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
await inventory.save(); await inventory.save();
} }

View File

@ -0,0 +1,11 @@
import { getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { RequestHandler } from "express";
export const startLibraryDailyTaskController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
const inventory = await getInventory(accountId);
inventory.LibraryActiveDailyTaskInfo = inventory.LibraryAvailableDailyTaskInfo;
await inventory.save();
res.json(inventory.LibraryAvailableDailyTaskInfo);
};

View File

@ -68,7 +68,7 @@ import {
ICalendarProgress, ICalendarProgress,
IPendingCouponDatabase, IPendingCouponDatabase,
IPendingCouponClient, IPendingCouponClient,
ILibraryAvailableDailyTaskInfo, ILibraryDailyTaskInfo,
IDroneDatabase, IDroneDatabase,
IDroneClient IDroneClient
} from "../../types/inventoryTypes/inventoryTypes"; } from "../../types/inventoryTypes/inventoryTypes";
@ -950,11 +950,12 @@ pendingCouponSchema.set("toJSON", {
} }
}); });
const libraryAvailableDailyTaskInfoSchema = new Schema<ILibraryAvailableDailyTaskInfo>( const libraryDailyTaskInfoSchema = new Schema<ILibraryDailyTaskInfo>(
{ {
EnemyTypes: [String], EnemyTypes: [String],
EnemyLocTag: String, EnemyLocTag: String,
EnemyIcon: String, EnemyIcon: String,
Scans: Number,
ScansRequired: Number, ScansRequired: Number,
RewardStoreItem: String, RewardStoreItem: String,
RewardQuantity: Number, RewardQuantity: Number,
@ -1209,7 +1210,8 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
//Cephalon Simaris Entries Example:"TargetType"+"Scans"(1-10)+"Completed": true|false //Cephalon Simaris Entries Example:"TargetType"+"Scans"(1-10)+"Completed": true|false
LibraryPersonalProgress: [Schema.Types.Mixed], LibraryPersonalProgress: [Schema.Types.Mixed],
//Cephalon Simaris Daily Task //Cephalon Simaris Daily Task
LibraryAvailableDailyTaskInfo: libraryAvailableDailyTaskInfoSchema, LibraryAvailableDailyTaskInfo: libraryDailyTaskInfoSchema,
LibraryActiveDailyTaskInfo: libraryDailyTaskInfoSchema,
//https://warframe.fandom.com/wiki/Invasion //https://warframe.fandom.com/wiki/Invasion
InvasionChainProgress: [Schema.Types.Mixed], InvasionChainProgress: [Schema.Types.Mixed],

View File

@ -1,4 +1,5 @@
import express from "express"; import express from "express";
import { abandonLibraryDailyTaskController } from "@/src/controllers/api/abandonLibraryDailyTaskController";
import { activateRandomModController } from "@/src/controllers/api/activateRandomModController"; import { activateRandomModController } from "@/src/controllers/api/activateRandomModController";
import { addFriendImageController } from "@/src/controllers/api/addFriendImageController"; import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController"; import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController";
@ -7,6 +8,7 @@ import { artifactsController } from "@/src/controllers/api/artifactsController";
import { changeDojoRootController } from "@/src/controllers/api/changeDojoRootController"; import { changeDojoRootController } from "@/src/controllers/api/changeDojoRootController";
import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController"; import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController";
import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController"; import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController";
import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/claimLibraryDailyTaskRewardController";
import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController"; import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController";
import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController"; import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController";
import { createGuildController } from "@/src/controllers/api/createGuildController"; import { createGuildController } from "@/src/controllers/api/createGuildController";
@ -75,6 +77,7 @@ import { setSupportedSyndicateController } from "@/src/controllers/api/setSuppor
import { setWeaponSkillTreeController } from "@/src/controllers/api/setWeaponSkillTreeController"; import { setWeaponSkillTreeController } from "@/src/controllers/api/setWeaponSkillTreeController";
import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController"; import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController";
import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController"; import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController";
import { startLibraryDailyTaskController } from "@/src/controllers/api/startLibraryDailyTaskController";
import { startLibraryPersonalTargetController } from "@/src/controllers/api/startLibraryPersonalTargetController"; import { startLibraryPersonalTargetController } from "@/src/controllers/api/startLibraryPersonalTargetController";
import { startRecipeController } from "@/src/controllers/api/startRecipeController"; import { startRecipeController } from "@/src/controllers/api/startRecipeController";
import { stepSequencersController } from "@/src/controllers/api/stepSequencersController"; import { stepSequencersController } from "@/src/controllers/api/stepSequencersController";
@ -93,7 +96,9 @@ import { upgradesController } from "@/src/controllers/api/upgradesController";
const apiRouter = express.Router(); const apiRouter = express.Router();
// get // get
apiRouter.get("/abandonLibraryDailyTask.php", abandonLibraryDailyTaskController);
apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController); apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController);
apiRouter.get("/claimLibraryDailyTaskReward.php", claimLibraryDailyTaskRewardController);
apiRouter.get("/credits.php", creditsController); apiRouter.get("/credits.php", creditsController);
apiRouter.get("/deleteSession.php", deleteSessionController); apiRouter.get("/deleteSession.php", deleteSessionController);
apiRouter.get("/dojo", dojoController); apiRouter.get("/dojo", dojoController);
@ -121,6 +126,7 @@ apiRouter.get("/setActiveQuest.php", setActiveQuestController);
apiRouter.get("/setActiveShip.php", setActiveShipController); apiRouter.get("/setActiveShip.php", setActiveShipController);
apiRouter.get("/setBootLocation.php", setBootLocationController); apiRouter.get("/setBootLocation.php", setBootLocationController);
apiRouter.get("/setSupportedSyndicate.php", setSupportedSyndicateController); apiRouter.get("/setSupportedSyndicate.php", setSupportedSyndicateController);
apiRouter.get("/startLibraryDailyTask.php", startLibraryDailyTaskController);
apiRouter.get("/startLibraryPersonalTarget.php", startLibraryPersonalTargetController); apiRouter.get("/startLibraryPersonalTarget.php", startLibraryPersonalTargetController);
apiRouter.get("/surveys.php", surveysController); apiRouter.get("/surveys.php", surveysController);
apiRouter.get("/updateSession.php", updateSessionGetController); apiRouter.get("/updateSession.php", updateSessionGetController);

View File

@ -23,7 +23,7 @@ import {
IInventoryDatabase, IInventoryDatabase,
IKubrowPetEggDatabase, IKubrowPetEggDatabase,
IKubrowPetEggClient, IKubrowPetEggClient,
ILibraryAvailableDailyTaskInfo, ILibraryDailyTaskInfo,
ICalendarProgress, ICalendarProgress,
IDroneClient, IDroneClient,
IUpgradeClient IUpgradeClient
@ -42,6 +42,7 @@ import {
ExportBundles, ExportBundles,
ExportCustoms, ExportCustoms,
ExportDrones, ExportDrones,
ExportEnemies,
ExportFlavour, ExportFlavour,
ExportFusionBundles, ExportFusionBundles,
ExportGear, ExportGear,
@ -63,6 +64,8 @@ import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedContro
import { addStartingGear } from "@/src/controllers/api/giveStartingGearController"; import { addStartingGear } from "@/src/controllers/api/giveStartingGearController";
import { addQuestKey, completeQuest } from "@/src/services/questService"; import { addQuestKey, completeQuest } from "@/src/services/questService";
import { handleBundleAcqusition } from "./purchaseService"; import { handleBundleAcqusition } from "./purchaseService";
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
import { getRandomElement, getRandomInt } from "./rngService";
export const createInventory = async ( export const createInventory = async (
accountOwnerId: Types.ObjectId, accountOwnerId: Types.ObjectId,
@ -77,7 +80,7 @@ export const createInventory = async (
ReceivedStartingGear: config.skipTutorial ReceivedStartingGear: config.skipTutorial
}); });
inventory.LibraryAvailableDailyTaskInfo = createLibraryAvailableDailyTaskInfo(); inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
inventory.CalendarProgress = createCalendar(); inventory.CalendarProgress = createCalendar();
inventory.RewardSeed = generateRewardSeed(); inventory.RewardSeed = generateRewardSeed();
inventory.DuviriInfo = { inventory.DuviriInfo = {
@ -1193,15 +1196,19 @@ export const addKeyChainItems = async (
return inventoryChanges; return inventoryChanges;
}; };
const createLibraryAvailableDailyTaskInfo = (): ILibraryAvailableDailyTaskInfo => {
export const createLibraryDailyTask = (): ILibraryDailyTaskInfo => {
const enemyTypes = getRandomElement(libraryDailyTasks);
const enemyAvatar = ExportEnemies.avatars[enemyTypes[0]];
const scansRequired = getRandomInt(2, 4);
return { return {
EnemyTypes: ["/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"], EnemyTypes: enemyTypes,
EnemyLocTag: "/Lotus/Language/Game/CorruptedLancer", EnemyLocTag: enemyAvatar.name,
EnemyIcon: "/Lotus/Interface/Icons/Npcs/OrokinRifleLancerAvatar.png", EnemyIcon: enemyAvatar.icon!,
ScansRequired: 3, ScansRequired: scansRequired,
RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/UncommonFusionBundle", RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle",
RewardQuantity: 7, RewardQuantity: Math.trunc(scansRequired * 2.5),
RewardStanding: 7500 RewardStanding: 2500 * scansRequired
}; };
}; };

View File

@ -185,6 +185,22 @@ export const addMissionInventoryUpdates = (
} }
}); });
break; break;
case "LibraryScans":
value.forEach(scan => {
if (inventory.LibraryActiveDailyTaskInfo) {
if (inventory.LibraryActiveDailyTaskInfo.EnemyTypes.find(x => x == scan.EnemyType)) {
inventory.LibraryActiveDailyTaskInfo.Scans ??= 0;
inventory.LibraryActiveDailyTaskInfo.Scans += scan.Count;
} else {
logger.warn(
`ignoring synthesis of ${scan.EnemyType} as it's not part of the active daily task`
);
}
} else {
logger.warn(`no library daily task active, ignoring synthesis of ${scan.EnemyType}`);
}
});
break;
case "SyndicateId": { case "SyndicateId": {
inventory.CompletedSyndicates.push(value); inventory.CompletedSyndicates.push(value);
break; break;

View File

@ -320,7 +320,8 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
LibraryPersonalTarget: string; LibraryPersonalTarget: string;
LibraryPersonalProgress: ILibraryPersonalProgress[]; LibraryPersonalProgress: ILibraryPersonalProgress[];
CollectibleSeries: ICollectibleSery[]; CollectibleSeries: ICollectibleSery[];
LibraryAvailableDailyTaskInfo: ILibraryAvailableDailyTaskInfo; LibraryAvailableDailyTaskInfo?: ILibraryDailyTaskInfo;
LibraryActiveDailyTaskInfo?: ILibraryDailyTaskInfo;
HasResetAccount: boolean; HasResetAccount: boolean;
PendingCoupon?: IPendingCouponClient; PendingCoupon?: IPendingCouponClient;
Harvestable: boolean; Harvestable: boolean;
@ -658,10 +659,11 @@ export interface ILastSortieReward {
Manifest: string; Manifest: string;
} }
export interface ILibraryAvailableDailyTaskInfo { export interface ILibraryDailyTaskInfo {
EnemyTypes: string[]; EnemyTypes: string[];
EnemyLocTag: string; EnemyLocTag: string;
EnemyIcon: string; EnemyIcon: string;
Scans?: number;
ScansRequired: number; ScansRequired: number;
RewardStoreItem: string; RewardStoreItem: string;
RewardQuantity: number; RewardQuantity: number;

View File

@ -92,6 +92,12 @@ export type IMissionInventoryUpdateRequest = {
IsFinalWave: boolean; IsFinalWave: boolean;
Participants: IVoidTearParticipantInfo[]; Participants: IVoidTearParticipantInfo[];
}; };
LibraryScans?: {
EnemyType: string;
Count: number;
CodexScanCount: number;
Standing: number;
}[];
} & { } & {
[K in TEquipmentKey]?: IEquipmentClient[]; [K in TEquipmentKey]?: IEquipmentClient[];
}; };

View File

@ -0,0 +1,148 @@
[
[
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/LaserCannonBipedAvatar",
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/RailgunBipedAvatar",
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/ShockwaveBipedAvatar"
],
[
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/LaserDiscBipedAvatar"
],
[
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/SuperMoaBipedAvatar"
],
[
"/Lotus/Types/Enemies/Corpus/Spaceman/EliteSpacemanAvatar",
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/RifleSpacemanAvatar",
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/DeployableSpacemanAvatar",
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/MeleeSpacemanAvatar",
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/ShotgunSpacemanAvatar",
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/SniperSpacemanAvatar"
],
[
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/NullifySpacemanAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BeastMasterAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BladeSawmanAvatar",
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BlowtorchSawmanAvatar",
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/PistonSawmanAvatar",
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/BladeSawmanAvatar",
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/BladeSawmanAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/BladeSawmanAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/RifleLancerAvatar",
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/EliteRifleLancerAvatar",
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/RifleLancerAvatar",
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/EliteRifleLancerAvatar",
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/RifleLancerAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/EliteRifleLancerAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/RifleLancerAvatar",
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/EliteRifleLancerAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/EviseratorLancerAvatar",
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/EvisceratorLancerAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/EvisceratorLancerAvatar",
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/EvisceratorLancerAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/FemaleGrineerAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerSniperAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/FlameLancerAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/GrineerMeleeStaffAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/HeavyFemaleGrineerAvatar",
"/Lotus/Types/Enemies/Grineer/Desert/HeavyFemaleGrineerAvatarDesert",
"/Lotus/Types/Enemies/Grineer/Forest/HeavyFemaleGrineerAvatarDesert",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerHeavyAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/IncendiaryBombardAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/JetpackMarineAvatar",
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/JetpackMarineAvatar",
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/JetpackMarineAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/JetpackMarineAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/MacheteWomanAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerMacheteAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/ShieldLancerAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/ShotgunLancerAvatar",
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/ShotgunLancerAvatar",
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/ShotgunLancerAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/ShotgunLancerAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/GrineerAvatars/GrineerMarinePistolAvatar",
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/GrineerMarinePistolAvatar",
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/GrineerMarinePistolAvatar",
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/GrineerMarinePistolAvatar"
],
[
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/AncientAvatar",
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/HealingAncientAvatar",
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/ToxicAncientAvatar"
],
[
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/DiseasedAncientAvatar"
],
[
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/SpawningAncientAvatar"
],
[
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/CrawlerAvatar",
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/NoxiousCrawlerAvatar",
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/GraspingCrawlerAvatar",
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/GrenadeAvatar",
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/LightningAvatar"
],
[
"/Lotus/Types/Enemies/Infested/AiWeek/InfestedMoas/NaniteCloudBipedAvatar",
"/Lotus/Types/Enemies/Infested/AiWeek/InfestedMoas/SlowBombBipedAvatar"
],
[
"/Lotus/Types/Enemies/Infested/AiWeek/Quadrupeds/QuadrupedAvatar"
],
[
"/Lotus/Types/Enemies/Infested/AiWeek/Runners/LeapingRunnerAvatar",
"/Lotus/Types/Enemies/Infested/AiWeek/Runners/RunnerAvatar"
],
[
"/Lotus/Types/Enemies/Orokin/OrokinBladeSawmanAvatar"
],
[
"/Lotus/Types/Enemies/Orokin/OrokinHealingAncientAvatar"
],
[
"/Lotus/Types/Enemies/Orokin/OrokinHeavyFemaleAvatar"
],
[
"/Lotus/Types/Enemies/Orokin/OrokinNullifySpacemanAvatar"
],
[
"/Lotus/Types/Enemies/Orokin/OrokinRocketBombardAvatar"
],
[
"/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"
],
[
"/Lotus/Types/Enemies/Orokin/RifleSpacemanAvatar"
],
[
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/RocketBombardAvatar"
]
]