forked from OpenWF/SpaceNinjaServer
		
	feat: implement focus.php (#254)
This commit is contained in:
		
							parent
							
								
									e980d34458
								
							
						
					
					
						commit
						ae8913931c
					
				@ -1,6 +1,149 @@
 | 
			
		||||
import { Handler } from "express";
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
			
		||||
import { getInventory, addMiscItems } from "@/src/services/inventoryService";
 | 
			
		||||
import { IMiscItem, TFocusPolarity } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
			
		||||
import { logger } from "@/src/utils/logger";
 | 
			
		||||
import baseFocusPointCosts from "@/static/json/baseFocusPointCosts.json";
 | 
			
		||||
 | 
			
		||||
export const focusController: Handler = (_req, _res) => {
 | 
			
		||||
    //console.log("focusController", req.query);
 | 
			
		||||
    _res.sendStatus(400);
 | 
			
		||||
export const focusController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const accountId = await getAccountIdForRequest(req);
 | 
			
		||||
    switch (req.query.op) {
 | 
			
		||||
        default:
 | 
			
		||||
            logger.error("Unhandled focus op type: " + req.query.op);
 | 
			
		||||
            logger.debug(req.body.toString());
 | 
			
		||||
            res.end();
 | 
			
		||||
            break;
 | 
			
		||||
        case FocusOperation.UnlockWay: {
 | 
			
		||||
            const focusType = (JSON.parse(req.body.toString()) as IWayRequest).FocusType;
 | 
			
		||||
            const focusPolarity = focusTypeToPolarity(focusType);
 | 
			
		||||
            const inventory = await getInventory(accountId);
 | 
			
		||||
            const cost = inventory.FocusAbility ? 50_000 : 0;
 | 
			
		||||
            inventory.FocusAbility ??= focusType;
 | 
			
		||||
            inventory.FocusUpgrades.push({ ItemType: focusType });
 | 
			
		||||
            if (inventory.FocusXP) {
 | 
			
		||||
                inventory.FocusXP[focusPolarity] -= cost;
 | 
			
		||||
            }
 | 
			
		||||
            await inventory.save();
 | 
			
		||||
            res.json({
 | 
			
		||||
                FocusUpgrade: { ItemType: focusType },
 | 
			
		||||
                FocusPointCosts: { [focusPolarity]: cost }
 | 
			
		||||
            });
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case FocusOperation.ActivateWay: {
 | 
			
		||||
            const focusType = (JSON.parse(req.body.toString()) as IWayRequest).FocusType;
 | 
			
		||||
            const inventory = await getInventory(accountId);
 | 
			
		||||
            inventory.FocusAbility = focusType;
 | 
			
		||||
            await inventory.save();
 | 
			
		||||
            res.end();
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case FocusOperation.UnlockUpgrade: {
 | 
			
		||||
            const request = JSON.parse(req.body.toString()) as IUnlockUpgradeRequest;
 | 
			
		||||
            const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
 | 
			
		||||
            const inventory = await getInventory(accountId);
 | 
			
		||||
            let cost = 0;
 | 
			
		||||
            for (const focusType of request.FocusTypes) {
 | 
			
		||||
                cost += baseFocusPointCosts[focusType as keyof typeof baseFocusPointCosts];
 | 
			
		||||
                inventory.FocusUpgrades.push({ ItemType: focusType, Level: 0 });
 | 
			
		||||
            }
 | 
			
		||||
            inventory.FocusXP[focusPolarity] -= cost;
 | 
			
		||||
            await inventory.save();
 | 
			
		||||
            res.json({
 | 
			
		||||
                FocusTypes: request.FocusTypes,
 | 
			
		||||
                FocusPointCosts: { [focusPolarity]: cost }
 | 
			
		||||
            });
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case FocusOperation.LevelUpUpgrade: {
 | 
			
		||||
            const request = JSON.parse(req.body.toString()) as ILevelUpUpgradeRequest;
 | 
			
		||||
            const focusPolarity = focusTypeToPolarity(request.FocusInfos[0].ItemType);
 | 
			
		||||
            const inventory = await getInventory(accountId);
 | 
			
		||||
            let cost = 0;
 | 
			
		||||
            for (const focusUpgrade of request.FocusInfos) {
 | 
			
		||||
                cost += focusUpgrade.FocusXpCost;
 | 
			
		||||
                const focusUpgradeDb = inventory.FocusUpgrades.find(entry => entry.ItemType == focusUpgrade.ItemType)!;
 | 
			
		||||
                focusUpgradeDb.Level = focusUpgrade.Level;
 | 
			
		||||
                if (focusUpgrade.IsUniversal) {
 | 
			
		||||
                    focusUpgradeDb.IsUniversal = true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            inventory.FocusXP[focusPolarity] -= cost;
 | 
			
		||||
            await inventory.save();
 | 
			
		||||
            res.json({
 | 
			
		||||
                FocusInfos: request.FocusInfos,
 | 
			
		||||
                FocusPointCosts: { [focusPolarity]: cost }
 | 
			
		||||
            });
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        case FocusOperation.ConvertShard: {
 | 
			
		||||
            const request = JSON.parse(req.body.toString()) as IConvertShardRequest;
 | 
			
		||||
            // Tally XP
 | 
			
		||||
            let xp = 0;
 | 
			
		||||
            for (const shard of request.Shards) {
 | 
			
		||||
                xp += shardValues[shard.ItemType as keyof typeof shardValues] * shard.ItemCount;
 | 
			
		||||
            }
 | 
			
		||||
            // Send response
 | 
			
		||||
            res.json({
 | 
			
		||||
                FocusPointGains: {
 | 
			
		||||
                    [request.Polarity]: xp
 | 
			
		||||
                },
 | 
			
		||||
                MiscItemCosts: request.Shards
 | 
			
		||||
            });
 | 
			
		||||
            // Commit added XP and removed shards to DB
 | 
			
		||||
            for (const shard of request.Shards) {
 | 
			
		||||
                shard.ItemCount *= -1;
 | 
			
		||||
            }
 | 
			
		||||
            const inventory = await getInventory(accountId);
 | 
			
		||||
            inventory.FocusXP ??= { AP_POWER: 0, AP_TACTIC: 0, AP_DEFENSE: 0, AP_ATTACK: 0, AP_WARD: 0 };
 | 
			
		||||
            inventory.FocusXP[request.Polarity] += xp;
 | 
			
		||||
            addMiscItems(inventory, request.Shards);
 | 
			
		||||
            await inventory.save();
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum FocusOperation {
 | 
			
		||||
    UnlockWay = "2",
 | 
			
		||||
    UnlockUpgrade = "3",
 | 
			
		||||
    LevelUpUpgrade = "4",
 | 
			
		||||
    ActivateWay = "5",
 | 
			
		||||
    ConvertShard = "9"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// For UnlockWay & ActivateWay
 | 
			
		||||
interface IWayRequest {
 | 
			
		||||
    FocusType: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface IUnlockUpgradeRequest {
 | 
			
		||||
    FocusTypes: string[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface ILevelUpUpgradeRequest {
 | 
			
		||||
    FocusInfos: {
 | 
			
		||||
        ItemType: string;
 | 
			
		||||
        FocusXpCost: number;
 | 
			
		||||
        IsUniversal: boolean;
 | 
			
		||||
        Level: number;
 | 
			
		||||
        IsActiveAbility: boolean;
 | 
			
		||||
    }[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface IConvertShardRequest {
 | 
			
		||||
    Shards: IMiscItem[];
 | 
			
		||||
    Polarity: TFocusPolarity;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Works for ways & upgrades
 | 
			
		||||
const focusTypeToPolarity = (type: string): TFocusPolarity => {
 | 
			
		||||
    return ("AP_" + type.substr(1).split("/")[3].toUpperCase()) as TFocusPolarity;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const shardValues = {
 | 
			
		||||
    "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardCommonItem": 2_500,
 | 
			
		||||
    "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardSynthesizedItem": 5_000,
 | 
			
		||||
    "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardBrilliantItem": 25_000,
 | 
			
		||||
    "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardBrilliantTierTwoItem": 40_000
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -553,6 +553,8 @@ export interface IFocusXP {
 | 
			
		||||
    AP_WARD: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type TFocusPolarity = keyof IFocusXP;
 | 
			
		||||
 | 
			
		||||
export interface IFusionTreasure {
 | 
			
		||||
    ItemCount: number;
 | 
			
		||||
    ItemType: string;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										82
									
								
								static/json/baseFocusPointCosts.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								static/json/baseFocusPointCosts.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,82 @@
 | 
			
		||||
{
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/AttackEfficiencyFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/BlastChargeFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/BlastFireballFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/CloakAttackChargeFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/CloakBlindFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/ConsecutiveEfficienyUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/ConsecutivePowerUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/DashDamageFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/DashFireFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/GhostWaveUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Active/GhostlyTouchUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Residual/ElementalDamageFocusUpgrade": 25000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Residual/PhysicalDamageFocusUpgrade": 25000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Residual/PowerSnapFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Stats/MoreAmmoFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Attack/Stats/RegenAmmoFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/BlastAllyShieldFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/BlastSelfShieldFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/CloakHealFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/CloakHealOthersFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/CloakShieldFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/DashImmunityFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/DashShockwaveFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/DefenseShieldBreakFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/DefenseShieldFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Active/SonicDissipationUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Residual/InstantReviveFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Residual/RadialXpFocusUpgrade": 25000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Stats/HealthMaxFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Defense/Stats/HealthRegenFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/BlastBurstFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/BlastSlowFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/CloakPullFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/CloakStaticFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/DashBubbleFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/DashElectricityFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/DisarmedEnergyUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/DisarmingProjectionUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Active/PowerFieldFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Residual/EnergyOverTimeFocusUpgrade": 25000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Residual/FreeAbilityCastsFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Residual/SlowHeadshotDamageFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Stats/EnergyPoolFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Power/Stats/EnergyRestoreFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/BlastConfuseFocusUpgrade": 25000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/BlastDisarmFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/CloakMeleeCritFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/CloakRevealFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/ComboAmpDamageFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/DashFinisherFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/DashWaveFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/FinisherTransferenceUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/LiftHitDamageUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/LiftHitWaveUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/ProjectionExecutionUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/ProjectionStretchUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Active/SlamComboFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Residual/MeleeComboFocusUpgrade": 25000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Residual/MeleeXpFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Stats/DashSpeedFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Tactic/Stats/MoveSpeedFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/BlastBulletAttractorFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/BlastDamagePickupFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/ClearStaticOnKillFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/CloakAllyCloakFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/CloakReduceDamageFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/DashReduceArmourFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/DashReduceDamageFocusUpgrade": 80000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/InvulnerableReturnFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/KnockdownImmunityFocusUpgrade": 25000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/MagneticExtensionUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/MagneticFieldFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/SunderingDissipationUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Active/UnairuWispFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Residual/ArmourBuffFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Residual/ReflectDamageFocusUpgrade": 25000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Residual/SecondChanceDamageBuffFocusUpgrade": 95000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Residual/SecondChanceFocusUpgrade": 60000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Stats/ArmourIncreaseFocusUpgrade": 50000,
 | 
			
		||||
  "/Lotus/Upgrades/Focus/Ward/Stats/BlastRadiusFocusUpgrade": 50000
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user