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: the circuit (#2039)

Closes #1965 Closes #2041 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2039 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

9d4bce85
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

5 个文件 +610 -53
Modified src/models/inventoryModels/inventoryModel.ts +42 -5
@@ -38,7 +38,8 @@ import {
38 38 IPeriodicMissionCompletionResponse,
39 39 ILoreFragmentScan,
40 40 IEvolutionProgress,
41 IEndlessXpProgress,
41 IEndlessXpProgressDatabase,
42 IEndlessXpProgressClient,
42 43 ICrewShipCustomization,
43 44 ICrewShipWeapon,
44 45 ICrewShipWeaponEmplacements,
@@ -97,7 +98,8 @@ import {
97 98 IInvasionProgressClient,
98 99 IAccolades,
99 100 IHubNpcCustomization,
100 ILotusCustomization
101 ILotusCustomization,
102 IEndlessXpReward
101 103 } from "../../types/inventoryTypes/inventoryTypes";
102 104 import { IOid } from "../../types/commonTypes";
103 105 import {
@@ -112,6 +114,7 @@ import {
112 114 } from "@/src/types/inventoryTypes/commonInventoryTypes";
113 115 import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
114 116 import { EquipmentSelectionSchema, oidSchema } from "./loadoutModel";
117 import { ICountedStoreItem } from "warframe-public-export-plus";
115 118
116 119 export const typeCountSchema = new Schema<ITypeCount>({ ItemType: String, ItemCount: Number }, { _id: false });
117 120
@@ -810,14 +813,48 @@ const evolutionProgressSchema = new Schema<IEvolutionProgress>(
810 813 { _id: false }
811 814 );
812 815
813 const endlessXpProgressSchema = new Schema<IEndlessXpProgress>(
816 const countedStoreItemSchema = new Schema<ICountedStoreItem>(
814 817 {
815 Category: String,
816 Choices: [String]
818 StoreItem: String,
819 ItemCount: Number
820 },
821 { _id: false }
822 );
823
824 const endlessXpRewardSchema = new Schema<IEndlessXpReward>(
825 {
826 RequiredTotalXp: Number,
827 Rewards: [countedStoreItemSchema]
817 828 },
818 829 { _id: false }
819 830 );
820 831
832 const endlessXpProgressSchema = new Schema<IEndlessXpProgressDatabase>(
833 {
834 Category: { type: String, required: true },
835 Earn: { type: Number, default: 0 },
836 Claim: { type: Number, default: 0 },
837 BonusAvailable: Date,
838 Expiry: Date,
839 Choices: { type: [String], required: true },
840 PendingRewards: { type: [endlessXpRewardSchema], default: [] }
841 },
842 { _id: false }
843 );
844
845 endlessXpProgressSchema.set("toJSON", {
846 transform(_doc, ret) {
847 const db = ret as IEndlessXpProgressDatabase;
848 const client = ret as IEndlessXpProgressClient;
849
850 if (db.BonusAvailable) {
851 client.BonusAvailable = toMongoDate(db.BonusAvailable);
852 }
853 if (db.Expiry) {
854 client.Expiry = toMongoDate(db.Expiry);
855 }
856 }
857 });
821 858 const crewShipWeaponEmplacementsSchema = new Schema<ICrewShipWeaponEmplacements>(
822 859 {
823 860 PRIMARY_A: EquipmentSelectionSchema,
Modified src/services/importService.ts +0 -3
@@ -377,9 +377,6 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial<
377 377 db[key] = client[key];
378 378 }
379 379 }
380 if (client.EndlessXP !== undefined) {
381 db.EndlessXP = client.EndlessXP;
382 }
383 380 if (client.SongChallenges !== undefined) {
384 381 db.SongChallenges = client.SongChallenges;
385 382 }
Modified src/services/missionInventoryUpdateService.ts +38 -2
@@ -10,7 +10,7 @@ import {
10 10 import { IMissionInventoryUpdateRequest, IRewardInfo } from "../types/requestTypes";
11 11 import { logger } from "@/src/utils/logger";
12 12 import { IRngResult, SRng, getRandomElement, getRandomReward } from "@/src/services/rngService";
13 import { equipmentKeys, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
13 import { equipmentKeys, IMission, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
14 14 import {
15 15 addBooster,
16 16 addChallenges,
@@ -841,7 +841,13 @@ export const addMissionRewards = async (
841 841 }
842 842
843 843 //TODO: check double reward merging
844 const MissionRewards: IMissionReward[] = getRandomMissionDrops(inventory, rewardInfo, wagerTier, firstCompletion);
844 const MissionRewards: IMissionReward[] = getRandomMissionDrops(
845 inventory,
846 rewardInfo,
847 missions,
848 wagerTier,
849 firstCompletion
850 );
845 851 logger.debug("random mission drops:", MissionRewards);
846 852 const inventoryChanges: IInventoryChanges = {};
847 853 const AffiliationMods: IAffiliationMods[] = [];
@@ -1290,6 +1296,7 @@ function getLevelCreditRewards(node: IRegion): number {
1290 1296 function getRandomMissionDrops(
1291 1297 inventory: TInventoryDatabaseDocument,
1292 1298 RewardInfo: IRewardInfo,
1299 mission: IMission | undefined,
1293 1300 tierOverride: number | undefined,
1294 1301 firstCompletion: boolean
1295 1302 ): IMissionReward[] {
@@ -1531,6 +1538,35 @@ function getRandomMissionDrops(
1531 1538 logger.error(`Unknown syndicate or tier: ${RewardInfo.challengeMissionId}`);
1532 1539 }
1533 1540 } else {
1541 if (RewardInfo.node == "SolNode238") {
1542 // The Circuit
1543 const category = mission?.Tier == 1 ? "EXC_HARD" : "EXC_NORMAL";
1544 const progress = inventory.EndlessXP?.find(x => x.Category == category);
1545 if (progress) {
1546 // https://wiki.warframe.com/w/The%20Circuit#Tiers_and_Weekly_Rewards
1547 const roundsCompleted = RewardInfo.rewardQualifications?.length || 0;
1548 if (roundsCompleted >= 1) {
1549 progress.Earn += 100;
1550 }
1551 if (roundsCompleted >= 2) {
1552 progress.Earn += 110;
1553 }
1554 if (roundsCompleted >= 3) {
1555 progress.Earn += 125;
1556 }
1557 if (roundsCompleted >= 4) {
1558 progress.Earn += 145;
1559 if (progress.BonusAvailable && progress.BonusAvailable.getTime() <= Date.now()) {
1560 progress.Earn += 50;
1561 progress.BonusAvailable = new Date(Date.now() + 24 * 3600_000); // TOVERIFY
1562 }
1563 }
1564 if (roundsCompleted >= 5) {
1565 progress.Earn += (roundsCompleted - 4) * 170;
1566 }
1567 }
1568 tierOverride = 0;
1569 }
1534 1570 rotations = getRotations(RewardInfo, tierOverride);
1535 1571 }
1536 1572 if (rewardManifests.length != 0) {
Modified src/types/inventoryTypes/inventoryTypes.ts +20 -2
@@ -12,6 +12,7 @@ import {
12 12 } from "@/src/types/inventoryTypes/commonInventoryTypes";
13 13 import { IFingerprintStat, RivenFingerprint } from "@/src/helpers/rivenHelper";
14 14 import { IOrbiter } from "../personalRoomsTypes";
15 import { ICountedStoreItem } from "warframe-public-export-plus";
15 16
16 17 export type InventoryDatabaseEquipment = {
17 18 [_ in TEquipmentKey]: IEquipmentDatabase[];
@@ -54,6 +55,7 @@ export interface IInventoryDatabase
54 55 | "CrewMembers"
55 56 | "QualifyingInvasions"
56 57 | "LastInventorySync"
58 | "EndlessXP"
57 59 | TEquipmentKey
58 60 >,
59 61 InventoryDatabaseEquipment {
@@ -92,6 +94,7 @@ export interface IInventoryDatabase
92 94 CrewMembers: ICrewMemberDatabase[];
93 95 QualifyingInvasions: IInvasionProgressDatabase[];
94 96 LastInventorySync?: Types.ObjectId;
97 EndlessXP?: IEndlessXpProgressDatabase[];
95 98 }
96 99
97 100 export interface IQuestKeyDatabase {
@@ -356,7 +359,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
356 359 PendingCoupon?: IPendingCouponClient;
357 360 Harvestable: boolean;
358 361 DeathSquadable: boolean;
359 EndlessXP?: IEndlessXpProgress[];
362 EndlessXP?: IEndlessXpProgressClient[];
360 363 DialogueHistory?: IDialogueHistoryClient;
361 364 CalendarProgress?: ICalendarProgress;
362 365 SongChallenges?: ISongChallenge[];
@@ -1143,9 +1146,24 @@ export interface IEvolutionProgress {
1143 1146
1144 1147 export type TEndlessXpCategory = "EXC_NORMAL" | "EXC_HARD";
1145 1148
1146 export interface IEndlessXpProgress {
1149 export interface IEndlessXpProgressDatabase {
1147 1150 Category: TEndlessXpCategory;
1151 Earn: number;
1152 Claim: number;
1153 BonusAvailable?: Date;
1154 Expiry?: Date;
1148 1155 Choices: string[];
1156 PendingRewards: IEndlessXpReward[];
1157 }
1158
1159 export interface IEndlessXpProgressClient extends Omit<IEndlessXpProgressDatabase, "BonusAvailable" | "Expiry"> {
1160 BonusAvailable?: IMongoDate;
1161 Expiry?: IMongoDate;
1162 }
1163
1164 export interface IEndlessXpReward {
1165 RequiredTotalXp: number;
1166 Rewards: ICountedStoreItem[];
1149 1167 }
1150 1168
1151 1169 export interface IDialogueHistoryClient {