forked from phenom/healer-man
Release Healer Man 0.1.41
This commit is contained in:
1 parent
197a64117c
commit
c3f8a69b51
42 files changed
+886
-127
No files matched your search
@@ -22,6 +22,7 @@ import {
|
||||
import { usePartyStore } from "./partyStore";
|
||||
import { EMPTY_ITEM_STATS } from "./itemStats";
|
||||
import { subscribeCombatPresentation, type CombatPresentationEvent } from "./combatPresentation";
|
||||
import { abilitiesForClass } from "./abilityCatalog";
|
||||
|
||||
function registerEngagedMob(id = "pack:a", maxHealth = 200): void {
|
||||
useCombatStore.getState().registerMob(id, { name: id, maxHealth, xpReward: 0 });
|
||||
@@ -49,6 +50,28 @@ describe("party combat runtime", () => {
|
||||
expect(activePartyTargetId(mobs, null)).toBe("pack:a");
|
||||
});
|
||||
|
||||
it("maintains HoTs on separate injured allies without resetting pending ticks", () => {
|
||||
useCombatStore.getState().initializeCharacter({ classId: "mage", role: "damage", level: 8 });
|
||||
usePartyStore.getState().initializeParty("party-hot-coverage", 8, useCombatStore.getState().health, "damage");
|
||||
const healer = usePartyStore.getState().members.find(member => member.role === "healer")!;
|
||||
const abilities = abilitiesForClass("druid");
|
||||
const hot = abilities.find(ability => ability.name === "Rejuvenation")!;
|
||||
usePartyStore.setState(state => ({ members: state.members.map(member => member.id === healer.id
|
||||
? { ...member, classId: "druid", resourceType: "mana", resource: 10_000, maxResource: 10_000,
|
||||
resourcePools: { mana: 10_000 }, talentRanks: {}, cooldowns: Object.fromEntries(abilities.filter(a => a.id !== hot.id).map(a => [a.id, 60_000])) }
|
||||
: { ...member, health: member.maxHealth * .5 }) }));
|
||||
for (const member of usePartyStore.getState().members) registerPartyRuntimePosition(member.id, [0, 0, 0]);
|
||||
useCombatStore.getState().synchronizeActors();
|
||||
registerEngagedMob("hot-boss", 100_000);
|
||||
advanceDungeonPartyCombat(1_000);
|
||||
const first = useCombatStore.getState().effects.find(effect => effect.kind === "hot" && effect.sourceActorId === healer.id)!;
|
||||
expect(first).toBeDefined();
|
||||
advanceDungeonPartyCombat(3_000);
|
||||
const effects = useCombatStore.getState().effects.filter(effect => effect.kind === "hot" && effect.sourceActorId === healer.id);
|
||||
expect(new Set(effects.map(effect => effect.targetId)).size).toBe(2);
|
||||
expect(effects.find(effect => effect.targetId === first.targetId)?.nextTickAt).toBe(first.nextTickAt);
|
||||
});
|
||||
|
||||
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")!;
|
||||
|
||||
Reference in new issue
Block a user