accurate first inventory

This commit is contained in:
Ordis 2025-02-20 19:15:57 +01:00
parent 78548a2ebe
commit c00f5a764e
6 changed files with 109 additions and 20 deletions

View File

@ -1,13 +1,11 @@
import { RequestHandler } from "express"; import { RequestHandler } from "express";
const getNewRewardSeedController: RequestHandler = (_req, res) => { export const getNewRewardSeedController: RequestHandler = (_req, res) => {
res.json({ rewardSeed: generateRewardSeed() }); res.json({ rewardSeed: generateRewardSeed() });
}; };
function generateRewardSeed(): number { export function generateRewardSeed(): number {
const min = -Number.MAX_SAFE_INTEGER; const min = -Number.MAX_SAFE_INTEGER;
const max = Number.MAX_SAFE_INTEGER; const max = Number.MAX_SAFE_INTEGER;
return Math.floor(Math.random() * (max - min + 1)) + min; return Math.floor(Math.random() * (max - min + 1)) + min;
} }
export { getNewRewardSeedController };

View File

@ -0,0 +1 @@
export const giveStartingGearController = async () => {};

View File

@ -64,7 +64,11 @@ import {
IKubrowPetEggClient, IKubrowPetEggClient,
ICustomMarkers, ICustomMarkers,
IMarkerInfo, IMarkerInfo,
IMarker IMarker,
ICalendarProgress,
IPendingCouponDatabase,
IPendingCouponClient,
ILibraryAvailableDailyTaskInfo
} from "../../types/inventoryTypes/inventoryTypes"; } from "../../types/inventoryTypes/inventoryTypes";
import { IOid } from "../../types/commonTypes"; import { IOid } from "../../types/commonTypes";
import { import {
@ -323,7 +327,7 @@ MailboxSchema.set("toJSON", {
const DuviriInfoSchema = new Schema<IDuviriInfo>( const DuviriInfoSchema = new Schema<IDuviriInfo>(
{ {
Seed: Number, Seed: Number,
NumCompletions: Number NumCompletions: { type: Number, default: 0 }
}, },
{ {
_id: false, _id: false,
@ -435,6 +439,7 @@ const seasonChallengeHistorySchema = new Schema<ISeasonChallenge>(
//TODO: check whether this is complete //TODO: check whether this is complete
const playerSkillsSchema = new Schema<IPlayerSkills>( const playerSkillsSchema = new Schema<IPlayerSkills>(
{ {
LPP_NONE: { type: Number, default: 0 },
LPP_SPACE: { type: Number, default: 0 }, LPP_SPACE: { type: Number, default: 0 },
LPS_PILOTING: { type: Number, default: 0 }, LPS_PILOTING: { type: Number, default: 0 },
LPS_GUNNERY: { type: Number, default: 0 }, LPS_GUNNERY: { type: Number, default: 0 },
@ -891,19 +896,63 @@ const CustomMarkersSchema = new Schema<ICustomMarkers>(
{ _id: false } { _id: false }
); );
const calenderProgressSchema = new Schema<ICalendarProgress>(
{
Version: { type: Number, default: 19 },
Iteration: { type: Number, default: 2 },
YearProgress: {
Upgrades: { type: [] }
},
SeasonProgress: {
SeasonType: String,
LastCompletedDayIdx: { type: Number, default: -1 },
LastCompletedChallengeDayIdx: { type: Number, default: -1 },
ActivatedChallenges: []
}
},
{ _id: false }
);
const pendingCouponSchema = new Schema<IPendingCouponDatabase>(
{
Expiry: { type: Date, default: new Date(0) },
Discount: { type: Number, default: 0 }
},
{ _id: false }
);
pendingCouponSchema.set("toJSON", {
transform(_doc, ret, _options) {
(ret as IPendingCouponClient).Expiry = toMongoDate((ret as IPendingCouponDatabase).Expiry);
}
});
const libraryAvailableDailyTaskInfoSchema = new Schema<ILibraryAvailableDailyTaskInfo>(
{
EnemyTypes: [String],
EnemyLocTag: String,
EnemyIcon: String,
ScansRequired: Number,
RewardStoreItem: String,
RewardQuantity: Number,
RewardStanding: Number
},
{ _id: false }
);
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>( const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
{ {
accountOwnerId: Schema.Types.ObjectId, accountOwnerId: Schema.Types.ObjectId,
SubscribedToEmails: Number, SubscribedToEmails: { type: Number, default: 0 },
Created: Date, SubscribedToEmailsPersonalized: { type: Number, default: 0 },
RewardSeed: Number, RewardSeed: Number,
//Credit //Credit
RegularCredits: { type: Number, default: 0 }, RegularCredits: { type: Number, default: 0 },
//Platinum //Platinum
PremiumCredits: { type: Number, default: 50 }, PremiumCredits: { type: Number, default: 0 },
//Gift Platinum(Non trade) //Gift Platinum(Non trade)
PremiumCreditsFree: { type: Number, default: 50 }, PremiumCreditsFree: { type: Number, default: 0 },
//Endo //Endo
FusionPoints: { type: Number, default: 0 }, FusionPoints: { type: Number, default: 0 },
//Regal Aya //Regal Aya
@ -911,7 +960,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
//Slots //Slots
SuitBin: { type: slotsBinSchema, default: { Slots: 3 } }, SuitBin: { type: slotsBinSchema, default: { Slots: 3 } },
WeaponBin: { type: slotsBinSchema, default: { Slots: 10 } }, WeaponBin: { type: slotsBinSchema, default: { Slots: 11 } },
SentinelBin: { type: slotsBinSchema, default: { Slots: 10 } }, SentinelBin: { type: slotsBinSchema, default: { Slots: 10 } },
SpaceSuitBin: { type: slotsBinSchema, default: { Slots: 4 } }, SpaceSuitBin: { type: slotsBinSchema, default: { Slots: 4 } },
SpaceWeaponBin: { type: slotsBinSchema, default: { Slots: 4 } }, SpaceWeaponBin: { type: slotsBinSchema, default: { Slots: 4 } },
@ -1022,7 +1071,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
//Complete Mission\Quests //Complete Mission\Quests
Missions: [missionSchema], Missions: [missionSchema],
QuestKeys: [questKeysSchema], QuestKeys: [questKeysSchema],
ActiveQuest: { type: String, default: "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain" }, //TODO: check after mission starting gear ActiveQuest: { type: String, default: "" },
//item like DojoKey or Boss missions key //item like DojoKey or Boss missions key
LevelKeys: [Schema.Types.Mixed], LevelKeys: [Schema.Types.Mixed],
//Active quests //Active quests
@ -1137,7 +1186,7 @@ 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: Schema.Types.Mixed, LibraryAvailableDailyTaskInfo: libraryAvailableDailyTaskInfoSchema,
//https://warframe.fandom.com/wiki/Invasion //https://warframe.fandom.com/wiki/Invasion
InvasionChainProgress: [Schema.Types.Mixed], InvasionChainProgress: [Schema.Types.Mixed],
@ -1184,7 +1233,6 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
HandlerPoints: Number, HandlerPoints: Number,
ChallengesFixVersion: Number, ChallengesFixVersion: Number,
PlayedParkourTutorial: Boolean, PlayedParkourTutorial: Boolean,
SubscribedToEmailsPersonalized: Number,
ActiveLandscapeTraps: [Schema.Types.Mixed], ActiveLandscapeTraps: [Schema.Types.Mixed],
RepVotes: [Schema.Types.Mixed], RepVotes: [Schema.Types.Mixed],
LeagueTickets: [Schema.Types.Mixed], LeagueTickets: [Schema.Types.Mixed],
@ -1202,7 +1250,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
HasResetAccount: { type: Boolean, default: false }, HasResetAccount: { type: Boolean, default: false },
//Discount Coupon //Discount Coupon
PendingCoupon: Schema.Types.Mixed, PendingCoupon: pendingCouponSchema,
//Like BossAladV,BossCaptainVor come for you on missions % chance //Like BossAladV,BossCaptainVor come for you on missions % chance
DeathMarks: [String], DeathMarks: [String],
//Zanuka //Zanuka
@ -1212,7 +1260,8 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
EndlessXP: { type: [endlessXpProgressSchema], default: undefined }, EndlessXP: { type: [endlessXpProgressSchema], default: undefined },
DialogueHistory: dialogueHistorySchema DialogueHistory: dialogueHistorySchema,
CalendarProgress: calenderProgressSchema
}, },
{ timestamps: { createdAt: "Created", updatedAt: false } } { timestamps: { createdAt: "Created", updatedAt: false } }
); );

View File

@ -87,6 +87,7 @@ import { updateSessionGetController, updateSessionPostController } from "@/src/c
import { updateThemeController } from "../controllers/api/updateThemeController"; import { updateThemeController } from "../controllers/api/updateThemeController";
import { upgradesController } from "@/src/controllers/api/upgradesController"; import { upgradesController } from "@/src/controllers/api/upgradesController";
import { saveSettingsController } from "../controllers/api/saveSettingsController"; import { saveSettingsController } from "../controllers/api/saveSettingsController";
import { giveStartingGearController } from "@/src/controllers/api/giveStartingGearController";
const apiRouter = express.Router(); const apiRouter = express.Router();
@ -146,6 +147,7 @@ apiRouter.post("/gildWeapon.php", gildWeaponController);
apiRouter.post("/giveKeyChainTriggeredItems.php", giveKeyChainTriggeredItemsController); apiRouter.post("/giveKeyChainTriggeredItems.php", giveKeyChainTriggeredItemsController);
apiRouter.post("/giveKeyChainTriggeredMessage.php", giveKeyChainTriggeredMessageController); apiRouter.post("/giveKeyChainTriggeredMessage.php", giveKeyChainTriggeredMessageController);
apiRouter.post("/giveQuestKeyReward.php", giveQuestKeyRewardController); apiRouter.post("/giveQuestKeyReward.php", giveQuestKeyRewardController);
apiRouter.post("/giveStartingGear.php", giveStartingGearController);
apiRouter.post("/guildTech.php", guildTechController); apiRouter.post("/guildTech.php", guildTechController);
apiRouter.post("/hostSession.php", hostSessionController); apiRouter.post("/hostSession.php", hostSessionController);
apiRouter.post("/infestedFoundry.php", infestedFoundryController); apiRouter.post("/infestedFoundry.php", infestedFoundryController);

View File

@ -22,7 +22,8 @@ import {
IDailyAffiliations, IDailyAffiliations,
IInventoryDatabase, IInventoryDatabase,
IKubrowPetEggDatabase, IKubrowPetEggDatabase,
IKubrowPetEggClient IKubrowPetEggClient,
ILibraryAvailableDailyTaskInfo
} from "@/src/types/inventoryTypes/inventoryTypes"; } from "@/src/types/inventoryTypes/inventoryTypes";
import { IGenericUpdate } from "../types/genericUpdate"; import { IGenericUpdate } from "../types/genericUpdate";
import { import {
@ -51,6 +52,7 @@ import { createShip } from "./shipService";
import { creditBundles, fusionBundles } from "@/src/services/missionInventoryUpdateService"; import { creditBundles, fusionBundles } from "@/src/services/missionInventoryUpdateService";
import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController"; import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
import { toOid } from "../helpers/inventoryHelpers"; import { toOid } from "../helpers/inventoryHelpers";
import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedController";
export const createInventory = async ( export const createInventory = async (
accountOwnerId: Types.ObjectId, accountOwnerId: Types.ObjectId,
@ -65,6 +67,10 @@ export const createInventory = async (
ReceivedStartingGear: config.skipTutorial ReceivedStartingGear: config.skipTutorial
}); });
inventory.LibraryAvailableDailyTaskInfo = createLibraryAvailableDailyTaskInfo();
inventory.RewardSeed = generateRewardSeed();
//await addItem(inventory, "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords"); TODO: can enable this once driter melees have been added to export
if (config.skipTutorial) { if (config.skipTutorial) {
const defaultEquipment = [ const defaultEquipment = [
// Awakening rewards // Awakening rewards
@ -140,7 +146,7 @@ export const createInventory = async (
await inventory.save(); await inventory.save();
} catch (error) { } catch (error) {
throw new Error(`Error creating inventory: ${error instanceof Error ? error.message : "Unknown error"}`); throw new Error(`Error creating inventory: ${error instanceof Error ? error.message : "Unknown error type"}`);
} }
}; };
@ -1173,3 +1179,14 @@ export const addKeyChainItems = async (
return inventoryChanges; return inventoryChanges;
}; };
const createLibraryAvailableDailyTaskInfo = (): ILibraryAvailableDailyTaskInfo => {
return {
EnemyTypes: ["/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"],
EnemyLocTag: "/Lotus/Language/Game/CorruptedLancer",
EnemyIcon: "/Lotus/Interface/Icons/Npcs/OrokinRifleLancerAvatar.png",
ScansRequired: 3,
RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/UncommonFusionBundle",
RewardQuantity: 7,
RewardStanding: 7500
};
};

View File

@ -38,6 +38,7 @@ export interface IInventoryDatabase
| "InfestedFoundry" | "InfestedFoundry"
| "DialogueHistory" | "DialogueHistory"
| "KubrowPetEggs" | "KubrowPetEggs"
| "PendingCoupon"
| TEquipmentKey | TEquipmentKey
>, >,
InventoryDatabaseEquipment { InventoryDatabaseEquipment {
@ -61,6 +62,7 @@ export interface IInventoryDatabase
InfestedFoundry?: IInfestedFoundryDatabase; InfestedFoundry?: IInfestedFoundryDatabase;
DialogueHistory?: IDialogueHistoryDatabase; DialogueHistory?: IDialogueHistoryDatabase;
KubrowPetEggs?: IKubrowPetEggDatabase[]; KubrowPetEggs?: IKubrowPetEggDatabase[];
PendingCoupon: IPendingCouponDatabase;
} }
export interface IQuestKeyDatabase { export interface IQuestKeyDatabase {
@ -318,11 +320,12 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
CollectibleSeries: ICollectibleSery[]; CollectibleSeries: ICollectibleSery[];
LibraryAvailableDailyTaskInfo: ILibraryAvailableDailyTaskInfo; LibraryAvailableDailyTaskInfo: ILibraryAvailableDailyTaskInfo;
HasResetAccount: boolean; HasResetAccount: boolean;
PendingCoupon: IPendingCoupon; PendingCoupon: IPendingCouponClient;
Harvestable: boolean; Harvestable: boolean;
DeathSquadable: boolean; DeathSquadable: boolean;
EndlessXP?: IEndlessXpProgress[]; EndlessXP?: IEndlessXpProgress[];
DialogueHistory?: IDialogueHistoryClient; DialogueHistory?: IDialogueHistoryClient;
CalendarProgress: ICalendarProgress;
} }
export interface IAffiliation { export interface IAffiliation {
@ -759,7 +762,12 @@ export enum Manifest {
LotusTypesGameNemesisKuvaLichKuvaLichManifestVersionTwo = "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionTwo" LotusTypesGameNemesisKuvaLichKuvaLichManifestVersionTwo = "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionTwo"
} }
export interface IPendingCoupon { export interface IPendingCouponDatabase {
Expiry: Date;
Discount: number;
}
export interface IPendingCouponClient {
Expiry: IMongoDate; Expiry: IMongoDate;
Discount: number; Discount: number;
} }
@ -858,6 +866,7 @@ export interface IPersonalTechProject {
} }
export interface IPlayerSkills { export interface IPlayerSkills {
LPP_NONE: number;
LPP_SPACE: number; LPP_SPACE: number;
LPS_PILOTING: number; LPS_PILOTING: number;
LPS_GUNNERY: number; LPS_GUNNERY: number;
@ -1042,3 +1051,16 @@ export interface IMarker {
z: number; z: number;
showInHud: boolean; showInHud: boolean;
} }
export interface ISeasonProgress {
SeasonType: "CST_UNDEFINED" | "CST_WINTER" | "CST_SPRING" | "CST_SUMMER" | "CST_FALL";
LastCompletedDayIdx: number;
LastCompletedChallengeDayIdx: number;
ActivatedChallenges: unknown[];
}
export interface ICalendarProgress {
Version: number;
Iteration: number;
YearProgress: { Upgrades: unknown[] };
SeasonProgress: ISeasonProgress;
}