generated from nhcarrigan/template
feat: add milestone prestige bonuses every 5th prestige
Every 5th prestige awards a scaling runestone windfall: milestone_number * 25 stones (prestige 5 = 25, 10 = 50, 50 = 250, etc). Shown in the ascension success message when non-zero.
This commit is contained in:
@@ -47,7 +47,7 @@ prestigeRouter.post("/", async (context) => {
|
||||
challengeCrystals = result.crystalsAwarded;
|
||||
}
|
||||
|
||||
const { newState, newPrestigeData, runestonesEarned } = buildPostPrestigeState(
|
||||
const { newState, newPrestigeData, runestonesEarned, milestoneRunestones } = buildPostPrestigeState(
|
||||
state,
|
||||
characterName,
|
||||
);
|
||||
@@ -81,6 +81,7 @@ prestigeRouter.post("/", async (context) => {
|
||||
return context.json({
|
||||
runestones: runestonesEarned,
|
||||
newPrestigeCount: newPrestigeData.count,
|
||||
milestoneRunestones,
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@ import { DEFAULT_PRESTIGE_UPGRADES } from "../data/prestigeUpgrades.js";
|
||||
const BASE_PRESTIGE_GOLD_THRESHOLD = 1_000_000;
|
||||
const THRESHOLD_SCALE_FACTOR = 5;
|
||||
const RUNESTONES_PER_PRESTIGE_LEVEL = 10;
|
||||
const MILESTONE_INTERVAL = 5;
|
||||
const MILESTONE_RUNESTONES_PER_INTERVAL = 25;
|
||||
|
||||
/**
|
||||
* Calculates the gold threshold required for the next prestige.
|
||||
@@ -65,6 +67,16 @@ export const calculateRunestones = (
|
||||
export const calculateProductionMultiplier = (prestigeCount: number): number =>
|
||||
Math.pow(1.15, prestigeCount);
|
||||
|
||||
/**
|
||||
* Returns the milestone runestone bonus for the given prestige count.
|
||||
* Every MILESTONE_INTERVAL prestiges awards milestone_number * MILESTONE_RUNESTONES_PER_INTERVAL stones.
|
||||
*/
|
||||
export const calculateMilestoneBonus = (newPrestigeCount: number): number => {
|
||||
if (newPrestigeCount % MILESTONE_INTERVAL !== 0) return 0;
|
||||
const milestoneNumber = newPrestigeCount / MILESTONE_INTERVAL;
|
||||
return milestoneNumber * MILESTONE_RUNESTONES_PER_INTERVAL;
|
||||
};
|
||||
|
||||
/**
|
||||
* Generates the reset game state after a prestige.
|
||||
* Carries over prestige data and runestones; resets everything else.
|
||||
@@ -72,7 +84,7 @@ export const calculateProductionMultiplier = (prestigeCount: number): number =>
|
||||
export const buildPostPrestigeState = (
|
||||
currentState: GameState,
|
||||
characterName: string,
|
||||
): { newState: GameState; newPrestigeData: PrestigeData; runestonesEarned: number } => {
|
||||
): { newState: GameState; newPrestigeData: PrestigeData; runestonesEarned: number; milestoneRunestones: number } => {
|
||||
const runestonesEarned = calculateRunestones(
|
||||
currentState.player.totalGoldEarned,
|
||||
currentState.prestige.count,
|
||||
@@ -80,10 +92,11 @@ export const buildPostPrestigeState = (
|
||||
);
|
||||
const newPrestigeCount = currentState.prestige.count + 1;
|
||||
const { purchasedUpgradeIds } = currentState.prestige;
|
||||
const milestoneRunestones = calculateMilestoneBonus(newPrestigeCount);
|
||||
|
||||
const newPrestigeData: PrestigeData = {
|
||||
count: newPrestigeCount,
|
||||
runestones: currentState.prestige.runestones + runestonesEarned,
|
||||
runestones: currentState.prestige.runestones + runestonesEarned + milestoneRunestones,
|
||||
productionMultiplier: calculateProductionMultiplier(newPrestigeCount),
|
||||
purchasedUpgradeIds,
|
||||
lastPrestigedAt: Date.now(),
|
||||
@@ -97,5 +110,5 @@ export const buildPostPrestigeState = (
|
||||
lastTickAt: Date.now(),
|
||||
};
|
||||
|
||||
return { newState, newPrestigeData, runestonesEarned };
|
||||
return { newState, newPrestigeData, runestonesEarned, milestoneRunestones };
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user