diff --git a/packages/core/src/sims/common/potion.ts b/packages/core/src/sims/common/potion.ts index ac49c070..3b06b0eb 100644 --- a/packages/core/src/sims/common/potion.ts +++ b/packages/core/src/sims/common/potion.ts @@ -43,7 +43,7 @@ export function makeGemdraught(stat: RawStatKey, grade: GemdraughtGrade): Readon strength: 44157, dexterity: 44158, intelligence: 44160, - } + }; const gradeToStatCap = [351, 392]; return makePotion(`Grade ${grade} Gemdraught of ${camel2title(stat)}`, stat, statToPotItemId[stat], 0.1, gradeToStatCap[grade - 1]); diff --git a/packages/core/src/sims/sim_utils.ts b/packages/core/src/sims/sim_utils.ts index 862ca73f..7b92fd1c 100644 --- a/packages/core/src/sims/sim_utils.ts +++ b/packages/core/src/sims/sim_utils.ts @@ -55,6 +55,7 @@ export function abilityToDamageNew(stats: ComputedSetStats, ability: Ability, co } // noinspection AssignmentToFunctionParameterJS stats = combinedBuffEffects.modifyStats(stats); + // TODO: can we avoid having all of these separate stat modifications? return { directDamage: ability.potency ? potencyToDamage(stats, ability.potency, ability as DamagingAbility, combinedBuffEffects) : null, dot: 'dot' in ability ? { diff --git a/packages/core/src/test/sims/cycle_processor_tests.ts b/packages/core/src/test/sims/cycle_processor_tests.ts index bbfc247a..68cd7ddb 100644 --- a/packages/core/src/test/sims/cycle_processor_tests.ts +++ b/packages/core/src/test/sims/cycle_processor_tests.ts @@ -25,6 +25,7 @@ import { } from "@xivgear/core/sims/sim_types"; import {CycleProcessor, CycleSimResult, ExternalCycleSettings, Rotation} from "@xivgear/core/sims/cycle_sim"; import { BaseMultiCycleSim } from '@xivgear/core/sims/processors/sim_processors'; +import {gemdraught1mind} from "../../sims/common/potion"; // Example of end-to-end simulation // This one is testing the simulation engine itself, so it copies the full simulation code rather than @@ -1566,4 +1567,33 @@ describe('gcd clipping check', () => { canUse = cp.canUseWithoutClipping(pom); assert.equal(canUse, false); }); +}); + +describe('potion logic', () => { + it('reflects potions', () => { + const cp = new CycleProcessor({ + allBuffs: [], + cycleTime: 120, + stats: exampleGearSet.computedStats, + totalTime: 120, + useAutos: false + }); + cp.use(filler); + cp.use(gemdraught1mind); + cp.use(filler); + cp.advanceTo(100); + cp.use(filler); + const displayRecords = cp.finalizedRecords; + const actualAbilities: FinalizedAbility[] = displayRecords.filter((record): record is FinalizedAbility => { + return 'ability' in record; + }); + // console.log(actualAbilities); + // Unbuffed skill + assertClose(actualAbilities[0].directDamage, 15057.71, 0.01); + // Buffed skill + assertClose(actualAbilities[2].directDamage, 16627.44, 0.01); + // Unbuffed skill after it falls off + assertClose(actualAbilities[3].directDamage, 15057.71, 0.01); + }); + }); \ No newline at end of file diff --git a/packages/xivmath/src/xivstats.ts b/packages/xivmath/src/xivstats.ts index fbe9ab61..7afa85e4 100644 --- a/packages/xivmath/src/xivstats.ts +++ b/packages/xivmath/src/xivstats.ts @@ -200,6 +200,7 @@ export class ComputedSetStatsImpl implements ComputedSetStats { this.classJobStats, this.partyBonus ); + Object.assign(out.finalBonusStats, this.finalBonusStats); modifications(out, out.finalBonusStats); return out; }