返回提交历史
Modified
src/controllers/api/endlessXpController.ts
+510
-41
Modified
src/models/inventoryModels/inventoryModel.ts
+42
-5
Modified
src/services/importService.ts
+0
-3
Modified
src/services/missionInventoryUpdateService.ts
+38
-2
Modified
src/types/inventoryTypes/inventoryTypes.ts
+20
-2
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
代码差异
5 个文件
+610
-53
@@ -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,
@@ -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
}
@@ -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) {
@@ -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 {