Skip to content

Commit e5672f2

Browse files
committed
Split calc prepass from skill-local pass
1 parent 3cc41e1 commit e5672f2

2 files changed

Lines changed: 49 additions & 15 deletions

File tree

src/Modules/CalcPerform.lua

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,14 +1074,38 @@ end
10741074
-- 8. Processes buffs and debuffs
10751075
-- 9. Processes charges and misc buffs (doActorCharges, doActorMisc)
10761076
-- 10. Calculates defence and offence stats (calcs.defence, calcs.offence)
1077-
function calcs.perform(env, skipEHP)
1078-
local modDB = env.modDB
1079-
local enemyDB = env.enemyDB
1077+
function calcs.performActorPrepass(env, options)
1078+
options = options or { }
1079+
local prepassState = {
1080+
partyTabEnableExportBuffs = env.build.partyTab.enableExportBuffs and env.mode ~= "CALCULATOR",
1081+
}
1082+
env.partyMembers = env.build.partyTab.actor
1083+
env.player.partyMembers = env.partyMembers
10801084

1081-
-- Merge keystone modifiers
1085+
-- Merge keystone modifiers once per actor-global pass so the skill-local
1086+
-- phase can reuse the resulting DB baseline.
10821087
env.keystonesAdded = { }
10831088
modLib.mergeKeystones(env, env.modDB)
10841089

1090+
if options.snapshotDBs then
1091+
prepassState.cachedPlayerDB, prepassState.cachedEnemyDB, prepassState.cachedMinionDB = specCopy(env)
1092+
prepassState.cachedPlayerDB.parent = env.modDB.parent
1093+
prepassState.cachedEnemyDB.parent = env.enemyDB.parent
1094+
if prepassState.cachedMinionDB and env.minion and env.minion.modDB then
1095+
prepassState.cachedMinionDB.parent = env.minion.modDB.parent
1096+
end
1097+
end
1098+
env.performActorPrepassState = prepassState
1099+
return prepassState
1100+
end
1101+
1102+
function calcs.performSkillPass(env, skipEHP, prepassState)
1103+
local modDB = env.modDB
1104+
local enemyDB = env.enemyDB
1105+
prepassState = prepassState or env.performActorPrepassState
1106+
env.partyMembers = env.partyMembers or env.build.partyTab.actor
1107+
env.player.partyMembers = env.partyMembers
1108+
10851109
-- Build minion skills
10861110
for _, activeSkill in ipairs(env.player.activeSkillList) do
10871111
activeSkill.skillModList = new("ModList", activeSkill.baseSkillModList)
@@ -1097,9 +1121,7 @@ function calcs.perform(env, skipEHP)
10971121
env.enemy.output = { }
10981122
local output = env.player.output
10991123

1100-
env.partyMembers = env.build.partyTab.actor
1101-
env.player.partyMembers = env.partyMembers
1102-
local partyTabEnableExportBuffs = env.build.partyTab.enableExportBuffs and env.mode ~= "CALCULATOR"
1124+
local partyTabEnableExportBuffs = prepassState and prepassState.partyTabEnableExportBuffs or (env.build.partyTab.enableExportBuffs and env.mode ~= "CALCULATOR")
11031125

11041126
env.minion = env.player.mainSkill.minion
11051127
if env.minion then
@@ -3591,3 +3613,8 @@ function calcs.perform(env, skipEHP)
35913613

35923614
cacheData(env.requestedSkillUUID or cacheSkillUUID(env.player.mainSkill, env), env)
35933615
end
3616+
3617+
function calcs.perform(env, skipEHP)
3618+
local prepassState = calcs.performActorPrepass(env)
3619+
return calcs.performSkillPass(env, skipEHP, prepassState)
3620+
end

src/Modules/Calcs.lua

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ end
207207
function calcs.calcFullDPS(build, mode, override, specEnv)
208208
local fullEnv, cachedPlayerDB, cachedEnemyDB, cachedMinionDB = calcs.initEnv(build, mode, override, specEnv)
209209
local usedEnv = nil
210+
local prepassState = calcs.performActorPrepass(fullEnv, { snapshotDBs = true })
211+
local skillPassPlayerDB = prepassState.cachedPlayerDB or cachedPlayerDB
212+
local skillPassEnemyDB = prepassState.cachedEnemyDB or cachedEnemyDB
213+
local skillPassMinionDB = prepassState.cachedMinionDB or cachedMinionDB
210214

211215
local fullDPS = {
212216
combinedDPS = 0,
@@ -238,7 +242,7 @@ function calcs.calcFullDPS(build, mode, override, specEnv)
238242
local activeSkillCount, enabled = getActiveSkillCount(activeSkill)
239243
if enabled then
240244
fullEnv.player.mainSkill = activeSkill
241-
calcs.perform(fullEnv, true)
245+
calcs.performSkillPass(fullEnv, true, prepassState)
242246
usedEnv = fullEnv
243247
local output = usedEnv.player.output
244248
local minionOutput = usedEnv.minion and usedEnv.minion.output or nil
@@ -368,9 +372,9 @@ function calcs.calcFullDPS(build, mode, override, specEnv)
368372
everything = true,
369373
}
370374
fullEnv, _, _, _ = calcs.initEnv(build, mode, override, {
371-
cachedPlayerDB = cachedPlayerDB,
372-
cachedEnemyDB = cachedEnemyDB,
373-
cachedMinionDB = cachedMinionDB,
375+
cachedPlayerDB = skillPassPlayerDB,
376+
cachedEnemyDB = skillPassEnemyDB,
377+
cachedMinionDB = skillPassMinionDB,
374378
env = fullEnv,
375379
accelerate = accelerationTbl,
376380
cacheGeneration = fullEnv.cacheGeneration,
@@ -452,16 +456,19 @@ function calcs.buildActiveSkill(env, mode, skill, targetUUID, limitedProcessingF
452456
skills = true,
453457
everything = true,
454458
} or nil
459+
local cachedSkillPrepassState = env.cachedSkillBuildPrepassState
455460
local fullEnv, _, _, _ = calcs.initEnv(env.build, mode, env.override, {
456-
cachedPlayerDB = env.cachedPlayerDB,
457-
cachedEnemyDB = env.cachedEnemyDB,
458-
cachedMinionDB = env.cachedMinionDB,
461+
cachedPlayerDB = cachedSkillPrepassState and cachedSkillPrepassState.cachedPlayerDB or env.cachedPlayerDB,
462+
cachedEnemyDB = cachedSkillPrepassState and cachedSkillPrepassState.cachedEnemyDB or env.cachedEnemyDB,
463+
cachedMinionDB = cachedSkillPrepassState and cachedSkillPrepassState.cachedMinionDB or env.cachedMinionDB,
459464
env = env.cachedSkillBuildEnv,
460465
accelerate = accelerationTbl,
461466
cacheGeneration = env.cacheGeneration,
462467
recursionGuards = recursionGuards,
463468
})
464469
env.cachedSkillBuildEnv = fullEnv
470+
local prepassState = cachedSkillPrepassState or calcs.performActorPrepass(fullEnv, { snapshotDBs = true })
471+
env.cachedSkillBuildPrepassState = prepassState
465472

466473
-- env.limitedSkills contains a map of uuids that should be limited in calculation
467474
-- this is in order to prevent infinite recursion loops
@@ -478,7 +485,7 @@ function calcs.buildActiveSkill(env, mode, skill, targetUUID, limitedProcessingF
478485
if activeSkillUUID == targetUUID then
479486
fullEnv.player.mainSkill = activeSkill
480487
fullEnv.requestedSkillUUID = targetUUID
481-
calcs.perform(fullEnv, true)
488+
calcs.performSkillPass(fullEnv, true, prepassState)
482489
fullEnv.requestedSkillUUID = nil
483490
recursionGuards.buildingSkills[guardKey] = nil
484491
return true

0 commit comments

Comments
 (0)