251 lines
6.8 KiB
JavaScript
251 lines
6.8 KiB
JavaScript
/**
|
|
* Galaxy Strike Online - XP Progression Configuration
|
|
* Math settings from https://math.korvarix.com/
|
|
*
|
|
* Decoded configuration parameters:
|
|
* - Current Level: 1
|
|
* - Max Level: 50
|
|
* - Formula parameters with multiple progression curves enabled
|
|
*/
|
|
|
|
const XP_CONFIG = {
|
|
// Basic settings
|
|
currentLevel: 1,
|
|
maxLevel: 50,
|
|
|
|
// Formula parameters (decoded from the website)
|
|
formula: {
|
|
// Linear progression parameters
|
|
linearBase: 500, // lb: 500
|
|
linearExponent: 2.2, // le: 2.2
|
|
|
|
// Base curve parameters
|
|
curveBase: 12.5, // kb: 12.5
|
|
curveExponent: 1.4, // ke: 1.4
|
|
|
|
// Multiplier parameters
|
|
multiplier: 0.11667, // mqm: 0.11667
|
|
squareMultiplier: 0.05, // sqm: 0.05
|
|
divisionMultiplier: 0.125, // dm: 0.125
|
|
rootMultiplier: 0.25, // rm: 0.25
|
|
constant: 0.5, // kt: 0.5
|
|
|
|
// Threshold parameters
|
|
multiplierThreshold: 15, // mqt: 15
|
|
squareThreshold: 10, // sqt: 10
|
|
divisionThreshold: 45 // dt: 45
|
|
},
|
|
|
|
// Enabled formula types
|
|
enabled: {
|
|
linear: true, // l: true
|
|
curve: true, // k: true
|
|
multiplier: true, // mq: true
|
|
square: true, // sq: true
|
|
division: true, // d: true
|
|
root: true // r: true
|
|
},
|
|
|
|
// Activity XP rewards (based on website estimates)
|
|
activities: {
|
|
combat: {
|
|
tutorial: 10,
|
|
easy: 25,
|
|
normal: 50,
|
|
hard: 100,
|
|
extreme: 200,
|
|
legendary: 500,
|
|
mythic: 1000
|
|
},
|
|
quests: {
|
|
main: 200,
|
|
side: 50,
|
|
daily_easy: 25,
|
|
daily_medium: 75,
|
|
daily_hard: 150,
|
|
daily_extreme: 300,
|
|
weekly_basic: 200,
|
|
weekly_medium: 500,
|
|
weekly_hard: 800,
|
|
weekly_extreme: 1200,
|
|
weekly_legendary: 2000,
|
|
weekly_mythic: 3000
|
|
},
|
|
dungeons: {
|
|
tutorial: 50,
|
|
easy: 100,
|
|
medium: 250,
|
|
hard: 500,
|
|
extreme: 1000,
|
|
legendary: 2000,
|
|
mythic: 5000
|
|
},
|
|
raids: {
|
|
weekly: 1000,
|
|
monthly: 5000
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Calculate XP required for a specific level
|
|
* Uses the complex formula from the website configuration
|
|
* @param {number} level - The level to calculate XP for
|
|
* @returns {number} XP required for this level
|
|
*/
|
|
function calculateXPForLevel(level) {
|
|
if (level <= 1) return 0;
|
|
if (level > XP_CONFIG.maxLevel) return Infinity;
|
|
|
|
const f = XP_CONFIG.formula;
|
|
const enabled = XP_CONFIG.enabled;
|
|
let xp = 0;
|
|
|
|
// Base linear progression: lb * level^le
|
|
if (enabled.linear) {
|
|
xp += f.linearBase * Math.pow(level, f.linearExponent);
|
|
}
|
|
|
|
// Curve progression: kb * level^ke
|
|
if (enabled.curve) {
|
|
xp += f.curveBase * Math.pow(level, f.curveExponent);
|
|
}
|
|
|
|
// Multiplier progression (after threshold)
|
|
if (enabled.multiplier && level > f.multiplierThreshold) {
|
|
const multiplierBonus = (level - f.multiplierThreshold) * f.multiplier;
|
|
xp *= (1 + multiplierBonus);
|
|
}
|
|
|
|
// Square progression (after threshold)
|
|
if (enabled.square && level > f.squareThreshold) {
|
|
const squareBonus = Math.pow(level - f.squareThreshold, 2) * f.squareMultiplier;
|
|
xp += squareBonus;
|
|
}
|
|
|
|
// Division progression (after threshold)
|
|
if (enabled.division && level > f.divisionThreshold) {
|
|
const divisionBonus = (level - f.divisionThreshold) * f.divisionMultiplier;
|
|
xp *= (1 + divisionBonus);
|
|
}
|
|
|
|
// Root progression
|
|
if (enabled.root) {
|
|
const rootBonus = Math.sqrt(level) * f.rootMultiplier;
|
|
xp += rootBonus;
|
|
}
|
|
|
|
// Add constant
|
|
xp += f.constant;
|
|
|
|
return Math.floor(xp);
|
|
}
|
|
|
|
/**
|
|
* Calculate total XP needed to reach from level 1 to target level
|
|
* @param {number} targetLevel - The target level
|
|
* @returns {number} Total XP needed
|
|
*/
|
|
function calculateTotalXPToLevel(targetLevel) {
|
|
let totalXP = 0;
|
|
for (let level = 2; level <= targetLevel; level++) {
|
|
totalXP += calculateXPForLevel(level);
|
|
}
|
|
return totalXP;
|
|
}
|
|
|
|
/**
|
|
* Calculate XP remaining until next level up
|
|
* @param {number} currentLevel - Current player level
|
|
* @param {number} currentXP - Current player XP
|
|
* @returns {number} XP needed for next level
|
|
*/
|
|
function calculateXPToNextLevel(currentLevel, currentXP) {
|
|
if (currentLevel >= XP_CONFIG.maxLevel) return 0;
|
|
|
|
const xpForNextLevel = calculateXPForLevel(currentLevel + 1);
|
|
const totalXPToCurrentLevel = calculateTotalXPToLevel(currentLevel);
|
|
|
|
return Math.max(0, xpForNextLevel - currentXP);
|
|
}
|
|
|
|
/**
|
|
* Get level from total XP
|
|
* @param {number} totalXP - Total accumulated XP
|
|
* @returns {object} Level info { level, xpIntoLevel, xpToNext, progress }
|
|
*/
|
|
function getLevelFromXP(totalXP) {
|
|
let level = 1;
|
|
let cumulativeXP = 0;
|
|
|
|
// Find current level
|
|
while (level < XP_CONFIG.maxLevel) {
|
|
const xpForNextLevel = calculateXPForLevel(level + 1);
|
|
if (cumulativeXP + xpForNextLevel > totalXP) {
|
|
break;
|
|
}
|
|
cumulativeXP += xpForNextLevel;
|
|
level++;
|
|
}
|
|
|
|
const xpIntoLevel = totalXP - cumulativeXP;
|
|
const xpToNext = calculateXPToNextLevel(level, totalXP);
|
|
const progress = xpToNext > 0 ? xpIntoLevel / (xpIntoLevel + xpToNext) : 1;
|
|
|
|
return {
|
|
level,
|
|
xpIntoLevel,
|
|
xpToNext,
|
|
progress: Math.min(1, Math.max(0, progress))
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Generate XP progression table for all levels
|
|
* @returns {Array} Array of level data
|
|
*/
|
|
function generateProgressionTable() {
|
|
const table = [];
|
|
let cumulativeXP = 0;
|
|
|
|
for (let level = 1; level <= XP_CONFIG.maxLevel; level++) {
|
|
const xpForThisLevel = level === 1 ? 0 : calculateXPForLevel(level);
|
|
const xpToNext = level < XP_CONFIG.maxLevel ? calculateXPForLevel(level + 1) : 0;
|
|
|
|
table.push({
|
|
level,
|
|
xpForThisLevel,
|
|
xpToNext,
|
|
cumulativeXP,
|
|
totalXPToLevel: cumulativeXP
|
|
});
|
|
|
|
cumulativeXP += xpForThisLevel;
|
|
}
|
|
|
|
return table;
|
|
}
|
|
|
|
// Export for use in both client and server
|
|
if (typeof module !== 'undefined' && module.exports) {
|
|
// Node.js (server)
|
|
module.exports = {
|
|
XP_CONFIG,
|
|
calculateXPForLevel,
|
|
calculateTotalXPToLevel,
|
|
calculateXPToNextLevel,
|
|
getLevelFromXP,
|
|
generateProgressionTable
|
|
};
|
|
} else {
|
|
// Browser (client)
|
|
window.XPProgression = {
|
|
XP_CONFIG,
|
|
calculateXPForLevel,
|
|
calculateTotalXPToLevel,
|
|
calculateXPToNextLevel,
|
|
getLevelFromXP,
|
|
generateProgressionTable
|
|
};
|
|
}
|