forked from OpenWF/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: OpenWF/SpaceNinjaServer#1829 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									6b3f524574
								
							
						
					
					
						commit
						fa6fac494b
					
				@ -7,6 +7,7 @@ import { CRng } from "@/src/services/rngService";
 | 
				
			|||||||
import { eMissionType, ExportNightwave, ExportRegions, IRegion } from "warframe-public-export-plus";
 | 
					import { eMissionType, ExportNightwave, ExportRegions, IRegion } from "warframe-public-export-plus";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    ICalendarDay,
 | 
					    ICalendarDay,
 | 
				
			||||||
 | 
					    ICalendarEvent,
 | 
				
			||||||
    ICalendarSeason,
 | 
					    ICalendarSeason,
 | 
				
			||||||
    ILiteSortie,
 | 
					    ILiteSortie,
 | 
				
			||||||
    ISeasonChallenge,
 | 
					    ISeasonChallenge,
 | 
				
			||||||
@ -466,8 +467,8 @@ const birthdays: number[] = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const getCalendarSeason = (week: number): ICalendarSeason => {
 | 
					const getCalendarSeason = (week: number): ICalendarSeason => {
 | 
				
			||||||
    const seasonIndex = week % 4;
 | 
					    const seasonIndex = week % 4;
 | 
				
			||||||
    const seasonDay1 = seasonIndex * 90 + 1;
 | 
					    const seasonDay1 = [1, 91, 182, 274][seasonIndex];
 | 
				
			||||||
    const seasonDay91 = seasonIndex * 90 + 91;
 | 
					    const seasonDay91 = seasonDay1 + 90;
 | 
				
			||||||
    const eventDays: ICalendarDay[] = [];
 | 
					    const eventDays: ICalendarDay[] = [];
 | 
				
			||||||
    for (const day of birthdays) {
 | 
					    for (const day of birthdays) {
 | 
				
			||||||
        if (day < seasonDay1) {
 | 
					        if (day < seasonDay1) {
 | 
				
			||||||
@ -526,8 +527,12 @@ const getCalendarSeason = (week: number): ICalendarSeason => {
 | 
				
			|||||||
            challengeDay = rng.randomInt(chunkDay1, chunkDay13);
 | 
					            challengeDay = rng.randomInt(chunkDay1, chunkDay13);
 | 
				
			||||||
        } while (birthdays.indexOf(challengeDay) != -1);
 | 
					        } while (birthdays.indexOf(challengeDay) != -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const challengeIndex = rng.randomInt(0, challenges.length - 1);
 | 
					        let challengeIndex;
 | 
				
			||||||
        const challenge = challenges[challengeIndex];
 | 
					        let challenge;
 | 
				
			||||||
 | 
					        do {
 | 
				
			||||||
 | 
					            challengeIndex = rng.randomInt(0, challenges.length - 1);
 | 
				
			||||||
 | 
					            challenge = challenges[challengeIndex];
 | 
				
			||||||
 | 
					        } while (i < 2 && !challenge.endsWith("Easy")); // First 2 challenges should be easy
 | 
				
			||||||
        challenges.splice(challengeIndex, 1);
 | 
					        challenges.splice(challengeIndex, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //logger.debug(`challenge on day ${challengeDay}`);
 | 
					        //logger.debug(`challenge on day ${challengeDay}`);
 | 
				
			||||||
@ -574,69 +579,100 @@ const getCalendarSeason = (week: number): ICalendarSeason => {
 | 
				
			|||||||
        "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalViolet"
 | 
					        "/Lotus/StoreItems/Types/Gameplay/NarmerSorties/ArchonCrystalViolet"
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    for (let i = 0; i != rewardRanges.length - 1; ++i) {
 | 
					    for (let i = 0; i != rewardRanges.length - 1; ++i) {
 | 
				
			||||||
        const rewardIndex = rng.randomInt(0, rewards.length - 1);
 | 
					        const events: ICalendarEvent[] = [];
 | 
				
			||||||
        const reward = rewards[rewardIndex];
 | 
					        for (let j = 0; j != 2; ++j) {
 | 
				
			||||||
        rewards.splice(rewardIndex, 1);
 | 
					            const rewardIndex = rng.randomInt(0, rewards.length - 1);
 | 
				
			||||||
 | 
					            events.push({ type: "CET_REWARD", reward: rewards[rewardIndex] });
 | 
				
			||||||
 | 
					            rewards.splice(rewardIndex, 1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //logger.debug(`trying to fit a reward between day ${rewardRanges[i]} and ${rewardRanges[i + 1]}`);
 | 
					        //logger.debug(`trying to fit rewards between day ${rewardRanges[i]} and ${rewardRanges[i + 1]}`);
 | 
				
			||||||
        let day: number;
 | 
					        let day: number;
 | 
				
			||||||
        do {
 | 
					        do {
 | 
				
			||||||
            day = rng.randomInt(rewardRanges[i] + 1, rewardRanges[i + 1] - 1);
 | 
					            day = rng.randomInt(rewardRanges[i] + 1, rewardRanges[i + 1] - 1);
 | 
				
			||||||
        } while (eventDays.find(x => x.day == day));
 | 
					        } while (eventDays.find(x => x.day == day));
 | 
				
			||||||
        eventDays.push({ day, events: [{ type: "CET_REWARD", reward }] });
 | 
					        eventDays.push({ day, events });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const upgrades = [
 | 
					    const upgradesByHexMember = [
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/MeleeCritChance",
 | 
					        [
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/MeleeAttackSpeed",
 | 
					            "/Lotus/Upgrades/Calendar/AttackAndMovementSpeedOnCritMelee",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange",
 | 
					            "/Lotus/Upgrades/Calendar/ElectricalDamageOnBulletJump",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/AbilityStrength",
 | 
					            "/Lotus/Upgrades/Calendar/ElectricDamagePerDistance",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/Armor",
 | 
					            "/Lotus/Upgrades/Calendar/ElectricStatusDamageAndChance",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/RadiationProcOnTakeDamage",
 | 
					            "/Lotus/Upgrades/Calendar/OvershieldCap",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/CompanionDamage",
 | 
					            "/Lotus/Upgrades/Calendar/SpeedBuffsWhenAirborne"
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/GasChanceToPrimaryAndSecondary",
 | 
					        ],
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/MagazineCapacity",
 | 
					        [
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/PunchToPrimary",
 | 
					            "/Lotus/Upgrades/Calendar/AbilityStrength",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/HealingEffects",
 | 
					            "/Lotus/Upgrades/Calendar/EnergyOrbToAbilityRange",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/EnergyRestoration",
 | 
					            "/Lotus/Upgrades/Calendar/MagnetStatusPull",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/OvershieldCap",
 | 
					            "/Lotus/Upgrades/Calendar/MagnitizeWithinRangeEveryXCasts",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/ElectricStatusDamageAndChance",
 | 
					            "/Lotus/Upgrades/Calendar/PowerStrengthAndEfficiencyPerEnergySpent",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/FinisherChancePerComboMultiplier",
 | 
					            "/Lotus/Upgrades/Calendar/SharedFreeAbilityEveryXCasts"
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/MagnetStatusPull",
 | 
					        ],
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/CompanionsBuffNearbyPlayer",
 | 
					        [
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/StatusChancePerAmmoSpent",
 | 
					            "/Lotus/Upgrades/Calendar/EnergyWavesOnCombo",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/OrbsDuplicateOnPickup",
 | 
					            "/Lotus/Upgrades/Calendar/FinisherChancePerComboMultiplier",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/AttackAndMovementSpeedOnCritMelee",
 | 
					            "/Lotus/Upgrades/Calendar/MeleeAttackSpeed",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/RadialJavelinOnHeavy",
 | 
					            "/Lotus/Upgrades/Calendar/MeleeCritChance",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/MagnitizeWithinRangeEveryXCasts",
 | 
					            "/Lotus/Upgrades/Calendar/MeleeSlideFowardMomentumOnEnemyHit",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/CompanionsRadiationChance",
 | 
					            "/Lotus/Upgrades/Calendar/RadialJavelinOnHeavy"
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/BlastEveryXShots",
 | 
					        ],
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/GenerateOmniOrbsOnWeakKill",
 | 
					        [
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/ElectricDamagePerDistance",
 | 
					            "/Lotus/Upgrades/Calendar/Armor",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/MeleeSlideFowardMomentumOnEnemyHit",
 | 
					            "/Lotus/Upgrades/Calendar/CloneActiveCompanionForEnergySpent",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/SharedFreeAbilityEveryXCasts",
 | 
					            "/Lotus/Upgrades/Calendar/CompanionDamage",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/ReviveEnemyAsSpectreOnKill",
 | 
					            "/Lotus/Upgrades/Calendar/CompanionsBuffNearbyPlayer",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/RefundBulletOnStatusProc",
 | 
					            "/Lotus/Upgrades/Calendar/CompanionsRadiationChance",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/ExplodingHealthOrbs",
 | 
					            "/Lotus/Upgrades/Calendar/RadiationProcOnTakeDamage",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/SpeedBuffsWhenAirborne",
 | 
					            "/Lotus/Upgrades/Calendar/ReviveEnemyAsSpectreOnKill"
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/EnergyWavesOnCombo",
 | 
					        ],
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/PowerStrengthAndEfficiencyPerEnergySpent",
 | 
					        [
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/CloneActiveCompanionForEnergySpent",
 | 
					            "/Lotus/Upgrades/Calendar/EnergyOrbsGrantShield",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/GuidingMissilesChance",
 | 
					            "/Lotus/Upgrades/Calendar/EnergyRestoration",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/EnergyOrbsGrantShield",
 | 
					            "/Lotus/Upgrades/Calendar/ExplodingHealthOrbs",
 | 
				
			||||||
        "/Lotus/Upgrades/Calendar/ElectricalDamageOnBulletJump"
 | 
					            "/Lotus/Upgrades/Calendar/GenerateOmniOrbsOnWeakKill",
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/HealingEffects",
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/OrbsDuplicateOnPickup"
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/BlastEveryXShots",
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/GasChanceToPrimaryAndSecondary",
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/GuidingMissilesChance",
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/MagazineCapacity",
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/PunchToPrimary",
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/RefundBulletOnStatusProc",
 | 
				
			||||||
 | 
					            "/Lotus/Upgrades/Calendar/StatusChancePerAmmoSpent"
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    for (let i = 0; i != upgradeRanges.length - 1; ++i) {
 | 
					    for (let i = 0; i != upgradeRanges.length - 1; ++i) {
 | 
				
			||||||
        const upgradeIndex = rng.randomInt(0, upgrades.length - 1);
 | 
					        // Pick 3 unique hex members
 | 
				
			||||||
        const upgrade = upgrades[upgradeIndex];
 | 
					        const hexMembersPickedForThisDay: number[] = [];
 | 
				
			||||||
        upgrades.splice(upgradeIndex, 1);
 | 
					        for (let j = 0; j != 3; ++j) {
 | 
				
			||||||
 | 
					            let hexMemberIndex: number;
 | 
				
			||||||
 | 
					            do {
 | 
				
			||||||
 | 
					                hexMemberIndex = rng.randomInt(0, upgradesByHexMember.length - 1);
 | 
				
			||||||
 | 
					            } while (hexMembersPickedForThisDay.indexOf(hexMemberIndex) != -1);
 | 
				
			||||||
 | 
					            hexMembersPickedForThisDay.push(hexMemberIndex);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        hexMembersPickedForThisDay.sort(); // Always present them in the same order
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //logger.debug(`trying to fit an upgrade between day ${upgradeRanges[i]} and ${upgradeRanges[i + 1]}`);
 | 
					        // For each hex member, pick an upgrade that was not yet picked this season.
 | 
				
			||||||
 | 
					        const events: ICalendarEvent[] = [];
 | 
				
			||||||
 | 
					        for (const hexMemberIndex of hexMembersPickedForThisDay) {
 | 
				
			||||||
 | 
					            const upgrades = upgradesByHexMember[hexMemberIndex];
 | 
				
			||||||
 | 
					            const upgradeIndex = rng.randomInt(0, upgrades.length - 1);
 | 
				
			||||||
 | 
					            events.push({ type: "CET_UPGRADE", upgrade: upgrades[upgradeIndex] });
 | 
				
			||||||
 | 
					            upgrades.splice(upgradeIndex, 1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //logger.debug(`trying to fit upgrades between day ${upgradeRanges[i]} and ${upgradeRanges[i + 1]}`);
 | 
				
			||||||
        let day: number;
 | 
					        let day: number;
 | 
				
			||||||
        do {
 | 
					        do {
 | 
				
			||||||
            day = rng.randomInt(upgradeRanges[i] + 1, upgradeRanges[i + 1] - 1);
 | 
					            day = rng.randomInt(upgradeRanges[i] + 1, upgradeRanges[i + 1] - 1);
 | 
				
			||||||
        } while (eventDays.find(x => x.day == day));
 | 
					        } while (eventDays.find(x => x.day == day));
 | 
				
			||||||
        eventDays.push({ day, events: [{ type: "CET_UPGRADE", upgrade }] });
 | 
					        eventDays.push({ day, events });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eventDays.sort((a, b) => a.day - b.day);
 | 
					    eventDays.sort((a, b) => a.day - b.day);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user