forked from phenom/healer-man
Update Healer Man server
This commit is contained in:
1 parent
fdb6739f8d
commit
f90ba7d989
41 files changed
+1671
-118
No files matched your search
+24
-10
@@ -31,6 +31,7 @@ import { BrandMark, FrontSurface } from "./FrontSurface";
|
||||
import { CompanionPoolControls } from "./CompanionPoolControls";
|
||||
import { CompanionReadinessScreen } from "./CompanionReadinessScreen";
|
||||
import { useCompanionPartyPreferences } from "../game/companionPartyPreferences";
|
||||
import type { CompanionSpecReadinessPolicy } from "../game/companionSpecReadiness";
|
||||
import { useCompanionSpecReadinessStore } from "../game/companionSpecReadinessStore";
|
||||
|
||||
type BossScope = BalanceLabBossCategory | "specific";
|
||||
@@ -93,6 +94,17 @@ function buildIdentity(build: SelectableBenchmarkBuildCatalogEntry): string {
|
||||
return `${build.source}:${build.classId}:${build.role}:${build.orientation}:${build.talentBuildId ?? "default"}`;
|
||||
}
|
||||
|
||||
function readinessEligible(
|
||||
build: SelectableBenchmarkBuildCatalogEntry,
|
||||
policy: CompanionSpecReadinessPolicy,
|
||||
includeBetaSpecs: boolean,
|
||||
): boolean {
|
||||
const status = policy.statuses[build.specializationId ?? ""]
|
||||
?? build.readinessStatus
|
||||
?? "needs-testing";
|
||||
return status === "ready" || (includeBetaSpecs && status === "beta");
|
||||
}
|
||||
|
||||
function randomPartyCapacity(builds: readonly SelectableBenchmarkBuildCatalogEntry[]): number {
|
||||
const defaults = builds.filter((build) => build.defaultTalentBuild);
|
||||
const pool = defaults.length > 0 ? defaults : builds;
|
||||
@@ -123,7 +135,7 @@ export function BalanceLabScreen({
|
||||
const session = useShellStore((state) => state.session);
|
||||
const local = executionTarget === "local";
|
||||
const token = local ? "" : session?.accessToken ?? "";
|
||||
const [source, setSource] = useState<BalanceLabPartySource>("all");
|
||||
const [source, setSource] = useState<BalanceLabPartySource>("wow");
|
||||
const [specSelection, setSpecSelection] = useState<BalanceLabSpecSelection>("random");
|
||||
const [specSearch, setSpecSearch] = useState("");
|
||||
const [selectedBuildIds, setSelectedBuildIds] = useState<readonly string[]>([]);
|
||||
@@ -175,11 +187,9 @@ export function BalanceLabScreen({
|
||||
|| left.role.localeCompare(right.role)
|
||||
)), [catalogLevel, source]);
|
||||
const selectedBuildSet = useMemo(() => new Set(selectedBuildIds), [selectedBuildIds]);
|
||||
const automaticBuilds = useMemo(() => availableBuilds.filter((build) => {
|
||||
if (build.source !== "wow" || !build.specializationId) return true;
|
||||
const status = readinessPolicy.statuses[build.specializationId] ?? "needs-testing";
|
||||
return status === "ready" || (includeBetaSpecs && status === "beta");
|
||||
}), [availableBuilds, includeBetaSpecs, readinessPolicy]);
|
||||
const automaticBuilds = useMemo(() => availableBuilds.filter((build) => (
|
||||
readinessEligible(build, readinessPolicy, includeBetaSpecs)
|
||||
)), [availableBuilds, includeBetaSpecs, readinessPolicy]);
|
||||
const selectedBuilds = useMemo(() => availableBuilds.filter((build) => selectedBuildSet.has(build.id)), [
|
||||
availableBuilds,
|
||||
selectedBuildSet,
|
||||
@@ -198,7 +208,8 @@ export function BalanceLabScreen({
|
||||
? selectedBossKeys.length
|
||||
: BOSS_TESTING_CATALOG.filter((boss) => bossScope === "all" || boss.category === bossScope).length;
|
||||
const coverageBuilds = specSelection === "all" ? automaticBuilds : selectedBuilds;
|
||||
const requestedRandomPartyCount = partyConfigurations * (source === "all" ? 3 : 1);
|
||||
const eligibleSourceCount = new Set(automaticBuilds.map((build) => build.source)).size;
|
||||
const requestedRandomPartyCount = partyConfigurations * eligibleSourceCount;
|
||||
const partyCount = specSelection === "random"
|
||||
? cappedRandomPartyCount(automaticBuilds, partyConfigurations)
|
||||
: coveragePartyCount(coverageBuilds);
|
||||
@@ -310,7 +321,9 @@ export function BalanceLabScreen({
|
||||
.filter((build) => source === "all" || build.source === source);
|
||||
const chosenBuilds = specSelection === "specific"
|
||||
? levelBuilds.filter((build) => selectedIdentities.has(buildIdentity(build)))
|
||||
: specSelection === "all" ? levelBuilds : [];
|
||||
: specSelection === "all"
|
||||
? levelBuilds.filter((build) => readinessEligible(build, readinessPolicy, includeBetaSpecs))
|
||||
: [];
|
||||
if (specSelection === "specific" && chosenBuilds.length !== selectedIdentities.size) {
|
||||
throw new Error(`One or more selected class/spec builds are unavailable at level ${targetLevel}.`);
|
||||
}
|
||||
@@ -393,7 +406,7 @@ export function BalanceLabScreen({
|
||||
setSelectedBuildIds([]);
|
||||
setSpecSearch("");
|
||||
}}>
|
||||
<option value="all">WoW + CoA + RoM</option><option value="wow">WoW only</option><option value="coa">CoA only</option><option value="rom">RoM only</option>
|
||||
<option value="all">All sources (Ready only)</option><option value="wow">WoW only</option><option value="coa">CoA only (Needs Testing)</option><option value="rom">RoM only (Needs Testing)</option>
|
||||
</select></label>
|
||||
<label><span>Level coverage</span><select value={levelCoverage} onChange={(event) => {
|
||||
setLevelCoverage(event.currentTarget.value as LevelCoverage);
|
||||
@@ -409,7 +422,7 @@ export function BalanceLabScreen({
|
||||
setSelectedBuildIds([]);
|
||||
}}><option value={10}>Every 10 levels</option><option value={5}>Every 5 levels</option><option value={1}>Every 1 level</option></select></label>}
|
||||
<label className="balance-lab-form-grid__wide"><span>Class/spec selection</span><select value={specSelection} onChange={(event) => setSpecSelection(event.currentTarget.value as BalanceLabSpecSelection)}>
|
||||
<option value="random">Random parties</option><option value="all">All specs</option><option value="specific">Specific specs</option>
|
||||
<option value="random">Random Ready parties</option><option value="all">All Ready specs</option><option value="specific">Specific targeted specs</option>
|
||||
</select></label>
|
||||
{specSelection === "random"
|
||||
? <label><span>Parties per source</span><input type="number" min={1} max={100} value={partyConfigurations} onChange={(event) => setPartyConfigurations(event.currentTarget.valueAsNumber)} /></label>
|
||||
@@ -422,6 +435,7 @@ export function BalanceLabScreen({
|
||||
<option value="all">Every boss</option><option value="wow">Every WoW boss</option><option value="rom">Every RoM boss</option><option value="specific">Pick specific bosses</option>
|
||||
</select></label>
|
||||
</div>
|
||||
<p className="balance-lab-coverage-note"><strong>Certification scope: Ready only.</strong> Automatic, all-spec, bracket, regression, and seat-audit runs currently use Protection Warrior, Discipline Priest, Marksmanship Hunter, Fire Mage, and Assassination Rogue. CoA and RoM remain Needs Testing.</p>
|
||||
{levelCoverage === "brackets" && <p className="balance-lab-coverage-note">
|
||||
{targetLevels.length} separate level jobs: {bracketStep === 1 ? "levels 1 through 80" : targetLevels.join(", ")}. Up to {runtimeStatus?.maxConcurrent ?? 4} run at the same time; each keeps its own report.
|
||||
</p>}
|
||||
|
||||
Reference in new issue
Block a user