generated from nhcarrigan/template
fix: resolve auto-boss signature mismatch, expose full CP, cap auto-buy, show unlock hints
Closes #148: clear stale signature after each boss fight so subsequent auto-boss pre-saves don't send a mismatched HMAC. Closes #151: auto-buy skips non-max-tier adventurers once they reach 100, keeping gold flowing to the highest-unlocked tier. Closes #152: introduce computePartyCombatPower() in tick.ts mirroring the server-side formula (global upgrades, prestige, equipment, set bonuses, echo, crafted, companion). Resource bar, auto-quest gate, and boss panel all now use the same multiplier-accurate value. Closes #146: tick engine auto-unlocks adventurer-specific upgrades when their adventurer is first recruited; upgrade panel shows a recruit hint for locked entries with no boss/quest source.
This commit is contained in:
@@ -58,6 +58,7 @@ import {
|
||||
RESOURCE_CAP,
|
||||
applyTick,
|
||||
calculateClickPower,
|
||||
computePartyCombatPower,
|
||||
} from "../engine/tick.js";
|
||||
import { updateChallengeProgress } from "../utils/dailyChallenges.js";
|
||||
import { formatNumber as formatNumberUtil } from "../utils/format.js";
|
||||
@@ -1078,11 +1079,7 @@ export const GameProvider = ({
|
||||
return q.status === "active";
|
||||
});
|
||||
if (!hasActiveQuest) {
|
||||
// eslint-disable-next-line unicorn/no-array-reduce -- Need the total!
|
||||
const partyCombatPower = next.adventurers.reduce((total, a) => {
|
||||
const power = total + a.combatPower;
|
||||
return power * a.count;
|
||||
}, 0);
|
||||
const partyCombatPower = computePartyCombatPower(next);
|
||||
const zoneOrder = new Map(
|
||||
next.zones.map((z, index) => {
|
||||
return [ z.id, index ];
|
||||
@@ -1120,11 +1117,28 @@ export const GameProvider = ({
|
||||
next.autoAdventurer === true
|
||||
&& next.prestige.purchasedUpgradeIds.includes("auto_adventurer")
|
||||
) {
|
||||
const maxAdventurerLevel = Math.max(
|
||||
...next.adventurers.
|
||||
filter((a) => {
|
||||
return a.unlocked;
|
||||
}).
|
||||
map((a) => {
|
||||
return a.level;
|
||||
}),
|
||||
);
|
||||
const autoBuyCap = 100;
|
||||
const [ bestAdventurer ] = next.adventurers.
|
||||
filter((adventurer) => {
|
||||
const cost
|
||||
= adventurer.baseCost * Math.pow(1.15, adventurer.count);
|
||||
return adventurer.unlocked && next.resources.gold >= cost;
|
||||
const isMaxTier = adventurer.level === maxAdventurerLevel;
|
||||
const withinCap
|
||||
= isMaxTier || adventurer.count < autoBuyCap;
|
||||
return (
|
||||
adventurer.unlocked
|
||||
&& next.resources.gold >= cost
|
||||
&& withinCap
|
||||
);
|
||||
}).
|
||||
sort((adventurerA, adventurerB) => {
|
||||
return adventurerB.level - adventurerA.level;
|
||||
@@ -1346,6 +1360,13 @@ export const GameProvider = ({
|
||||
}
|
||||
return afterBoss;
|
||||
});
|
||||
|
||||
/*
|
||||
* Boss fight modifies server state; clear stale signature so
|
||||
* the next pre-save or auto-save does not send a mismatched one.
|
||||
*/
|
||||
signatureReference.current = null;
|
||||
localStorage.removeItem("elysium_save_signature");
|
||||
setAutoBossLastResult({
|
||||
at: Date.now(),
|
||||
bossName: bossName,
|
||||
|
||||
Reference in New Issue
Block a user