返回提交历史
Modified
src/services/worldStateService.ts
+89
-53
XFEstudio/SpaceNinjaServer
fix: some problems with 1999 calendar rotation (#1829)
- First day was incorrect for summer & autumn - Only 1 reward was shown, now is a choice of 2 - Only 1 upgrade was shown, now is a choice of 3 - First 2 challenges in the season are now guaranteed to be "easy" Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1829 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
fa6fac49
代码差异
1 个文件
+89
-53
@@ -7,6 +7,7 @@ import { CRng } from "@/src/services/rngService";
7
7
import { eMissionType, ExportNightwave, ExportRegions, IRegion } from "warframe-public-export-plus";
8
8
import {
9
9
ICalendarDay,
10
ICalendarEvent,
10
11
ICalendarSeason,
11
12
ILiteSortie,
12
13
ISeasonChallenge,
@@ -466,8 +467,8 @@ const birthdays: number[] = [
466
467
467
468
const getCalendarSeason = (week: number): ICalendarSeason => {
468
469
const seasonIndex = week % 4;
469
const seasonDay1 = seasonIndex * 90 + 1;
470
const seasonDay91 = seasonIndex * 90 + 91;
470
const seasonDay1 = [1, 91, 182, 274][seasonIndex];
471
const seasonDay91 = seasonDay1 + 90;
471
472
const eventDays: ICalendarDay[] = [];
472
473
for (const day of birthdays) {
473
474
if (day < seasonDay1) {
@@ -526,8 +527,12 @@ const getCalendarSeason = (week: number): ICalendarSeason => {
526
527
challengeDay = rng.randomInt(chunkDay1, chunkDay13);
527
528
} while (birthdays.indexOf(challengeDay) != -1);
528
529
529
const challengeIndex = rng.randomInt(0, challenges.length - 1);
530
const challenge = challenges[challengeIndex];
530
let challengeIndex;
531
let challenge;
532
do {
533
challengeIndex = rng.randomInt(0, challenges.length - 1);
534
challenge = challenges[challengeIndex];
535
} while (i < 2 && !challenge.endsWith("Easy")); // First 2 challenges should be easy
531
536
challenges.splice(challengeIndex, 1);
532
537
533
538
//logger.debug(`challenge on day ${challengeDay}`);
@@ -574,69 +579,100 @@ const getCalendarSeason = (week: number): ICalendarSeason => {
574
579
"/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalViolet"
575
580
];
576
581
for (let i = 0; i != rewardRanges.length - 1; ++i) {
577
const rewardIndex = rng.randomInt(0, rewards.length - 1);
578
const reward = rewards[rewardIndex];
579
rewards.splice(rewardIndex, 1);
582
const events: ICalendarEvent[] = [];
583
for (let j = 0; j != 2; ++j) {
584
const rewardIndex = rng.randomInt(0, rewards.length - 1);
585
events.push({ type: "CET_REWARD", reward: rewards[rewardIndex] });
586
rewards.splice(rewardIndex, 1);
587
}
580
588
581
//logger.debug(`trying to fit a reward between day ${rewardRanges[i]} and ${rewardRanges[i + 1]}`);
589
//logger.debug(`trying to fit rewards between day ${rewardRanges[i]} and ${rewardRanges[i + 1]}`);
582
590
let day: number;
583
591
do {
584
592
day = rng.randomInt(rewardRanges[i] + 1, rewardRanges[i + 1] - 1);
585
593
} while (eventDays.find(x => x.day == day));
586
eventDays.push({ day, events: [{ type: "CET_REWARD", reward }] });
594
eventDays.push({ day, events });
587
595
}
588
596
589
const upgrades = [
590
"/Lotus/Upgrades/Calendar/MeleeCritChance",
591
"/Lotus/Upgrades/Calendar/MeleeAttackSpeed",
592
"/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange",
593
"/Lotus/Upgrades/Calendar/AbilityStrength",
594
"/Lotus/Upgrades/Calendar/Armor",
595
"/Lotus/Upgrades/Calendar/RadiationProcOnTakeDamage",
596
"/Lotus/Upgrades/Calendar/CompanionDamage",
597
"/Lotus/Upgrades/Calendar/GasChanceToPrimaryAndSecondary",
598
"/Lotus/Upgrades/Calendar/MagazineCapacity",
599
"/Lotus/Upgrades/Calendar/PunchToPrimary",
600
"/Lotus/Upgrades/Calendar/HealingEffects",
601
"/Lotus/Upgrades/Calendar/EnergyRestoration",
602
"/Lotus/Upgrades/Calendar/OvershieldCap",
603
"/Lotus/Upgrades/Calendar/ElectricStatusDamageAndChance",
604
"/Lotus/Upgrades/Calendar/FinisherChancePerComboMultiplier",
605
"/Lotus/Upgrades/Calendar/MagnetStatusPull",
606
"/Lotus/Upgrades/Calendar/CompanionsBuffNearbyPlayer",
607
"/Lotus/Upgrades/Calendar/StatusChancePerAmmoSpent",
608
"/Lotus/Upgrades/Calendar/OrbsDuplicateOnPickup",
609
"/Lotus/Upgrades/Calendar/AttackAndMovementSpeedOnCritMelee",
610
"/Lotus/Upgrades/Calendar/RadialJavelinOnHeavy",
611
"/Lotus/Upgrades/Calendar/MagnitizeWithinRangeEveryXCasts",
612
"/Lotus/Upgrades/Calendar/CompanionsRadiationChance",
613
"/Lotus/Upgrades/Calendar/BlastEveryXShots",
614
"/Lotus/Upgrades/Calendar/GenerateOmniOrbsOnWeakKill",
615
"/Lotus/Upgrades/Calendar/ElectricDamagePerDistance",
616
"/Lotus/Upgrades/Calendar/MeleeSlideFowardMomentumOnEnemyHit",
617
"/Lotus/Upgrades/Calendar/SharedFreeAbilityEveryXCasts",
618
"/Lotus/Upgrades/Calendar/ReviveEnemyAsSpectreOnKill",
619
"/Lotus/Upgrades/Calendar/RefundBulletOnStatusProc",
620
"/Lotus/Upgrades/Calendar/ExplodingHealthOrbs",
621
"/Lotus/Upgrades/Calendar/SpeedBuffsWhenAirborne",
622
"/Lotus/Upgrades/Calendar/EnergyWavesOnCombo",
623
"/Lotus/Upgrades/Calendar/PowerStrengthAndEfficiencyPerEnergySpent",
624
"/Lotus/Upgrades/Calendar/CloneActiveCompanionForEnergySpent",
625
"/Lotus/Upgrades/Calendar/GuidingMissilesChance",
626
"/Lotus/Upgrades/Calendar/EnergyOrbsGrantShield",
627
"/Lotus/Upgrades/Calendar/ElectricalDamageOnBulletJump"
597
const upgradesByHexMember = [
598
[
599
"/Lotus/Upgrades/Calendar/AttackAndMovementSpeedOnCritMelee",
600
"/Lotus/Upgrades/Calendar/ElectricalDamageOnBulletJump",
601
"/Lotus/Upgrades/Calendar/ElectricDamagePerDistance",
602
"/Lotus/Upgrades/Calendar/ElectricStatusDamageAndChance",
603
"/Lotus/Upgrades/Calendar/OvershieldCap",
604
"/Lotus/Upgrades/Calendar/SpeedBuffsWhenAirborne"
605
],
606
[
607
"/Lotus/Upgrades/Calendar/AbilityStrength",
608
"/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange",
609
"/Lotus/Upgrades/Calendar/MagnetStatusPull",
610
"/Lotus/Upgrades/Calendar/MagnitizeWithinRangeEveryXCasts",
611
"/Lotus/Upgrades/Calendar/PowerStrengthAndEfficiencyPerEnergySpent",
612
"/Lotus/Upgrades/Calendar/SharedFreeAbilityEveryXCasts"
613
],
614
[
615
"/Lotus/Upgrades/Calendar/EnergyWavesOnCombo",
616
"/Lotus/Upgrades/Calendar/FinisherChancePerComboMultiplier",
617
"/Lotus/Upgrades/Calendar/MeleeAttackSpeed",
618
"/Lotus/Upgrades/Calendar/MeleeCritChance",
619
"/Lotus/Upgrades/Calendar/MeleeSlideFowardMomentumOnEnemyHit",
620
"/Lotus/Upgrades/Calendar/RadialJavelinOnHeavy"
621
],
622
[
623
"/Lotus/Upgrades/Calendar/Armor",
624
"/Lotus/Upgrades/Calendar/CloneActiveCompanionForEnergySpent",
625
"/Lotus/Upgrades/Calendar/CompanionDamage",
626
"/Lotus/Upgrades/Calendar/CompanionsBuffNearbyPlayer",
627
"/Lotus/Upgrades/Calendar/CompanionsRadiationChance",
628
"/Lotus/Upgrades/Calendar/RadiationProcOnTakeDamage",
629
"/Lotus/Upgrades/Calendar/ReviveEnemyAsSpectreOnKill"
630
],
631
[
632
"/Lotus/Upgrades/Calendar/EnergyOrbsGrantShield",
633
"/Lotus/Upgrades/Calendar/EnergyRestoration",
634
"/Lotus/Upgrades/Calendar/ExplodingHealthOrbs",
635
"/Lotus/Upgrades/Calendar/GenerateOmniOrbsOnWeakKill",
636
"/Lotus/Upgrades/Calendar/HealingEffects",
637
"/Lotus/Upgrades/Calendar/OrbsDuplicateOnPickup"
638
],
639
[
640
"/Lotus/Upgrades/Calendar/BlastEveryXShots",
641
"/Lotus/Upgrades/Calendar/GasChanceToPrimaryAndSecondary",
642
"/Lotus/Upgrades/Calendar/GuidingMissilesChance",
643
"/Lotus/Upgrades/Calendar/MagazineCapacity",
644
"/Lotus/Upgrades/Calendar/PunchToPrimary",
645
"/Lotus/Upgrades/Calendar/RefundBulletOnStatusProc",
646
"/Lotus/Upgrades/Calendar/StatusChancePerAmmoSpent"
647
]
628
648
];
629
649
for (let i = 0; i != upgradeRanges.length - 1; ++i) {
630
const upgradeIndex = rng.randomInt(0, upgrades.length - 1);
631
const upgrade = upgrades[upgradeIndex];
632
upgrades.splice(upgradeIndex, 1);
650
// Pick 3 unique hex members
651
const hexMembersPickedForThisDay: number[] = [];
652
for (let j = 0; j != 3; ++j) {
653
let hexMemberIndex: number;
654
do {
655
hexMemberIndex = rng.randomInt(0, upgradesByHexMember.length - 1);
656
} while (hexMembersPickedForThisDay.indexOf(hexMemberIndex) != -1);
657
hexMembersPickedForThisDay.push(hexMemberIndex);
658
}
659
hexMembersPickedForThisDay.sort(); // Always present them in the same order
660
661
// For each hex member, pick an upgrade that was not yet picked this season.
662
const events: ICalendarEvent[] = [];
663
for (const hexMemberIndex of hexMembersPickedForThisDay) {
664
const upgrades = upgradesByHexMember[hexMemberIndex];
665
const upgradeIndex = rng.randomInt(0, upgrades.length - 1);
666
events.push({ type: "CET_UPGRADE", upgrade: upgrades[upgradeIndex] });
667
upgrades.splice(upgradeIndex, 1);
668
}
633
669
634
//logger.debug(`trying to fit an upgrade between day ${upgradeRanges[i]} and ${upgradeRanges[i + 1]}`);
670
//logger.debug(`trying to fit upgrades between day ${upgradeRanges[i]} and ${upgradeRanges[i + 1]}`);
635
671
let day: number;
636
672
do {
637
673
day = rng.randomInt(upgradeRanges[i] + 1, upgradeRanges[i + 1] - 1);
638
674
} while (eventDays.find(x => x.day == day));
639
eventDays.push({ day, events: [{ type: "CET_UPGRADE", upgrade }] });
675
eventDays.push({ day, events });
640
676
}
641
677
642
678
eventDays.sort((a, b) => a.day - b.day);