Release Healer Man 0.1.54

This commit is contained in:
phenom committed 2026-09-18 16:09:25 -04:00
1 parent d6976e6ef6
commit 2dbb0acfc1
26 files changed
+1893 -912

No files matched your search

+69 -1
View File
@@ -19,7 +19,7 @@ import {
partyUsesRangedAttacks,
resetPartyRuntimeClock,
} from "./partyRuntime";
import { usePartyStore } from "./partyStore";
import { createConfiguredPartyMember, usePartyStore } from "./partyStore";
import { EMPTY_ITEM_STATS } from "./itemStats";
import { subscribeCombatPresentation, type CombatPresentationEvent } from "./combatPresentation";
import { abilitiesForClass } from "./abilityCatalog";
@@ -72,6 +72,74 @@ describe("party combat runtime", () => {
expect(effects.find(effect => effect.targetId === first.targetId)?.nextTickAt).toBe(first.nextTickAt);
});
it("precasts Earth Shield on the tank while the Restoration Shaman is at full health", () => {
useCombatStore.getState().initializeCharacter({ classId: "mage", role: "damage", level: 80 });
const tank = createConfiguredPartyMember({
name: "Tank",
classId: "warrior",
specialization: "Protection",
specializationId: "warrior:protection",
talentTreeId: "warrior-protection",
role: "tank",
}, 80, 0, "earth-shield-runtime");
const healer = createConfiguredPartyMember({
name: "Healer",
classId: "shaman",
specialization: "Restoration",
specializationId: "shaman:restoration",
talentTreeId: "shaman-restoration",
role: "healer",
}, 80, 1, "earth-shield-runtime");
usePartyStore.getState().initializeParty("earth-shield-runtime", 80, useCombatStore.getState().health, "damage");
usePartyStore.setState({ members: [tank, healer] });
registerPartyRuntimePosition(tank.id, [0, 0, 0]);
registerPartyRuntimePosition(healer.id, [-12, 0, 0]);
useCombatStore.getState().synchronizeActors();
useCombatStore.getState().registerMob("earth-shield-boss", {
name: "Earth Shield boss", boss: true, maxHealth: 100_000, xpReward: 0,
});
setMobPosition("earth-shield-boss", [2, 0, 0]);
useCombatStore.getState().damageMob("earth-shield-boss", 1, 100);
updatePartyRuntimeTargetVisibility(tank.id, "earth-shield-boss", true);
updatePartyRuntimeTargetVisibility(healer.id, "earth-shield-boss", true);
for (const now of [1_000, 2_500, 4_000]) advanceDungeonPartyCombat(now);
expect(useCombatStore.getState().auras.some((aura) => (
aura.sourceId === healer.id
&& aura.targetId === tank.id
&& aura.definition.exclusiveGroup === "shaman:earth-shield"
))).toBe(true);
});
it("turns Feral Spirit into two live Enhancement summons against a boss", () => {
useCombatStore.getState().initializeCharacter({ classId: "mage", role: "damage", level: 80 });
const shaman = createConfiguredPartyMember({
name: "Enhancement",
classId: "shaman",
specialization: "Enhancement",
specializationId: "shaman:enhancement",
talentTreeId: "shaman-enhancement",
role: "damage",
}, 80, 0, "feral-spirit-runtime");
usePartyStore.getState().initializeParty("feral-spirit-runtime", 80, useCombatStore.getState().health, "damage");
usePartyStore.setState({ members: [shaman] });
registerPartyRuntimePosition(shaman.id, [0, 0, 0]);
useCombatStore.getState().synchronizeActors();
useCombatStore.getState().registerMob("feral-spirit-boss", {
name: "Feral Spirit boss", boss: true, maxHealth: 100_000, xpReward: 0,
});
setMobPosition("feral-spirit-boss", [2, 0, 0]);
useCombatStore.getState().damageMob("feral-spirit-boss", 1, 100);
updatePartyRuntimeTargetVisibility(shaman.id, "feral-spirit-boss", true);
for (const now of [1_000, 2_500, 4_000, 5_500, 7_000]) advanceDungeonPartyCombat(now);
const feralSpirit = abilitiesForClass("shaman").find((ability) => ability.name === "Feral Spirit")!;
expect(useCombatStore.getState().summons.filter((summon) => (
summon.ownerActorId === shaman.id && summon.sourceAbilityId === feralSpirit.id
))).toHaveLength(2);
});
it("lets a resurrected tank rejoin independently instead of taunting or casting from its checkpoint", () => {
registerEngagedMob();
const tank = usePartyStore.getState().members.find((member) => member.role === "tank")!;