Skip to content

Commit 26cb0d1

Browse files
author
LocalIdentity
committed
Apply Spectre Auras / Buffs from skills without needing multiple gems
This most likely needs a fair bit of checking but should now loop through all the spectre skills in the spectre list and apply buffs without needing to go and create a spectre gem and select each spectre so the aura applies to you Raise Spectre now builds a `spectreListMinions` set so CalcPerform can spin up minion skill lists for each spectre entry. A shared funcion initialises these temporary minions without affecting the selected main spectre, and the buff processing iterates over every spectre so their auras/skills work with players/minions
1 parent 4304570 commit 26cb0d1

File tree

2 files changed

+96
-24
lines changed

2 files changed

+96
-24
lines changed

src/Modules/CalcActiveSkill.lua

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -648,24 +648,18 @@ function calcs.buildActiveSkillModList(env, activeSkill)
648648
end
649649
activeSkill.minionList = minionList
650650
if minionList[1] and not activeSkill.actor.minionData then
651-
local minionType
652-
if env.mode == "CALCS" and activeSkill == env.player.mainSkill then
653-
local index = isValueInArray(minionList, activeEffect.srcInstance.skillMinionCalcs) or 1
654-
minionType = minionList[index]
655-
activeEffect.srcInstance.skillMinionCalcs = minionType
656-
else
657-
local index = isValueInArray(minionList, activeEffect.srcInstance.skillMinion) or 1
658-
minionType = minionList[index]
659-
activeEffect.srcInstance.skillMinion = minionType
660-
end
661-
if minionType then
651+
local function instantiateMinion(minionType)
652+
if not minionType then
653+
return
654+
end
662655
local minion = { }
663-
activeSkill.minion = minion
664-
skillFlags.haveMinion = true
665656
minion.parent = env.player
666657
minion.enemy = env.enemy
667658
minion.type = minionType
668659
minion.minionData = env.data.minions[minionType]
660+
if not minion.minionData then
661+
return
662+
end
669663
minion.level = activeSkill.skillData.minionLevelIsEnemyLevel and env.enemyLevel or
670664
activeSkill.skillData.minionLevelIsPlayerLevel and (m_min(env.build and env.build.characterLevel or activeSkill.skillData.minionLevel or activeEffect.grantedEffectLevel.levelRequirement, activeSkill.skillData.minionLevelIsPlayerLevel)) or
671665
minionSupportLevel[minion.type] or activeSkill.skillData.minionLevel or activeEffect.grantedEffectLevel.levelRequirement
@@ -732,6 +726,39 @@ function calcs.buildActiveSkillModList(env, activeSkill)
732726
end
733727
end
734728
end
729+
return minion
730+
end
731+
local minionType
732+
if env.mode == "CALCS" and activeSkill == env.player.mainSkill then
733+
local index = isValueInArray(minionList, activeEffect.srcInstance.skillMinionCalcs) or 1
734+
minionType = minionList[index]
735+
activeEffect.srcInstance.skillMinionCalcs = minionType
736+
else
737+
local index = isValueInArray(minionList, activeEffect.srcInstance.skillMinion) or 1
738+
minionType = minionList[index]
739+
activeEffect.srcInstance.skillMinion = minionType
740+
end
741+
activeSkill.spectreListMinions = nil
742+
if minionType then
743+
local minion = instantiateMinion(minionType)
744+
if minion then
745+
activeSkill.minion = minion
746+
skillFlags.haveMinion = true
747+
if isSpectre then
748+
activeSkill.spectreListMinions = { minion }
749+
end
750+
end
751+
end
752+
if isSpectre then
753+
activeSkill.spectreListMinions = activeSkill.spectreListMinions or { }
754+
for _, spectreType in ipairs(minionList) do
755+
if not activeSkill.minion or spectreType ~= activeSkill.minion.type then
756+
local extraMinion = instantiateMinion(spectreType)
757+
if extraMinion then
758+
t_insert(activeSkill.spectreListMinions, extraMinion)
759+
end
760+
end
761+
end
735762
end
736763
elseif activeEffect.srcInstance and not (activeEffect.gemData and activeEffect.gemData.secondaryGrantedEffect) then
737764
activeEffect.srcInstance.skillMinionCalcs = nil

src/Modules/CalcPerform.lua

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,13 +1063,48 @@ function calcs.perform(env, skipEHP)
10631063
modLib.mergeKeystones(env, env.modDB)
10641064

10651065
-- Build minion skills
1066+
local function initMinionSkills(activeSkill, minion, isPrimary)
1067+
minion.modDB = new("ModDB")
1068+
minion.modDB.actor = minion
1069+
if isPrimary then
1070+
calcs.createMinionSkills(env, activeSkill)
1071+
activeSkill.skillPartName = activeSkill.minion.mainSkill.activeEffect.grantedEffect.name
1072+
return
1073+
end
1074+
local tempSkill = {
1075+
activeEffect = activeSkill.activeEffect,
1076+
effectList = activeSkill.effectList,
1077+
supportList = activeSkill.supportList,
1078+
actor = activeSkill.actor,
1079+
socketGroup = activeSkill.socketGroup,
1080+
baseSkillModList = activeSkill.baseSkillModList,
1081+
skillModList = activeSkill.skillModList,
1082+
skillCfg = activeSkill.skillCfg,
1083+
skillData = activeSkill.skillData,
1084+
skillFlags = activeSkill.skillFlags,
1085+
buffList = activeSkill.buffList,
1086+
minion = minion,
1087+
}
1088+
local srcInstance = activeSkill.activeEffect and activeSkill.activeEffect.srcInstance
1089+
local savedMinionSkill = srcInstance and srcInstance.skillMinionSkill
1090+
local savedMinionSkillCalcs = srcInstance and srcInstance.skillMinionSkillCalcs
1091+
calcs.createMinionSkills(env, tempSkill)
1092+
if srcInstance then
1093+
srcInstance.skillMinionSkill = savedMinionSkill
1094+
srcInstance.skillMinionSkillCalcs = savedMinionSkillCalcs
1095+
end
1096+
end
10661097
for _, activeSkill in ipairs(env.player.activeSkillList) do
10671098
activeSkill.skillModList = new("ModList", activeSkill.baseSkillModList)
10681099
if activeSkill.minion then
1069-
activeSkill.minion.modDB = new("ModDB")
1070-
activeSkill.minion.modDB.actor = activeSkill.minion
1071-
calcs.createMinionSkills(env, activeSkill)
1072-
activeSkill.skillPartName = activeSkill.minion.mainSkill.activeEffect.grantedEffect.name
1100+
initMinionSkills(activeSkill, activeSkill.minion, true)
1101+
end
1102+
if activeSkill.spectreListMinions then
1103+
for _, spectreMinion in ipairs(activeSkill.spectreListMinions) do
1104+
if not activeSkill.minion or spectreMinion ~= activeSkill.minion then
1105+
initMinionSkills(activeSkill, spectreMinion, false)
1106+
end
1107+
end
10731108
end
10741109
end
10751110

@@ -2484,9 +2519,19 @@ function calcs.perform(env, skipEHP)
24842519
end
24852520
end
24862521
end
2522+
local minionsToProcess = { }
24872523
if activeSkill.minion and activeSkill.minion.activeSkillList then
2488-
local castingMinion = activeSkill.minion
2489-
for _, activeMinionSkill in ipairs(activeSkill.minion.activeSkillList) do
2524+
t_insert(minionsToProcess, activeSkill.minion)
2525+
end
2526+
if activeSkill.spectreListMinions then
2527+
for _, spectreMinion in ipairs(activeSkill.spectreListMinions) do
2528+
if spectreMinion ~= activeSkill.minion and spectreMinion.activeSkillList then
2529+
t_insert(minionsToProcess, spectreMinion)
2530+
end
2531+
end
2532+
end
2533+
for _, castingMinion in ipairs(minionsToProcess) do
2534+
for _, activeMinionSkill in ipairs(castingMinion.activeSkillList) do
24902535
local skillModList = activeMinionSkill.skillModList
24912536
local skillCfg = activeMinionSkill.skillCfg
24922537
for _, buff in ipairs(activeMinionSkill.buffList) do
@@ -2519,7 +2564,7 @@ function calcs.perform(env, skipEHP)
25192564
if envMinionCheck then
25202565
env.minion.modDB.conditions["AffectedBy"..buff.name:gsub(" ","")] = true
25212566
else
2522-
activeSkill.minion.modDB.conditions["AffectedBy"..buff.name:gsub(" ","")] = true
2567+
castingMinion.modDB.conditions["AffectedBy"..buff.name:gsub(" ","")] = true
25232568
end
25242569
local srcList = new("ModList")
25252570
local inc = modStore:Sum("INC", skillCfg, "BuffEffect", (env.minion == castingMinion) and "BuffEffectOnSelf" or nil)
@@ -2536,7 +2581,7 @@ function calcs.perform(env, skipEHP)
25362581
if env.mode_buffs and activeMinionSkill.skillData.enable then
25372582
-- Check for extra modifiers to apply to aura skills
25382583
local extraAuraModList = { }
2539-
for _, value in ipairs(activeSkill.minion.modDB:List(skillCfg, "ExtraAuraEffect")) do
2584+
for _, value in ipairs(castingMinion.modDB:List(skillCfg, "ExtraAuraEffect")) do
25402585
local add = true
25412586
for _, mod in ipairs(extraAuraModList) do
25422587
if modLib.compareModParams(mod, value.mod) then
@@ -2549,7 +2594,7 @@ function calcs.perform(env, skipEHP)
25492594
t_insert(extraAuraModList, copyTable(value.mod, true))
25502595
end
25512596
end
2552-
if not (activeSkill.minion.modDB:Flag(nil, "SelfAurasCannotAffectAllies") or activeSkill.minion.modDB:Flag(nil, "SelfAurasOnlyAffectYou") or activeSkill.minion.modDB:Flag(nil, "SelfAuraSkillsCannotAffectAllies") or skillModList:Flag(skillCfg, "SelfAurasAffectYouAndLinkedTarget")) then
2597+
if not (castingMinion.modDB:Flag(nil, "SelfAurasCannotAffectAllies") or castingMinion.modDB:Flag(nil, "SelfAurasOnlyAffectYou") or castingMinion.modDB:Flag(nil, "SelfAuraSkillsCannotAffectAllies") or skillModList:Flag(skillCfg, "SelfAurasAffectYouAndLinkedTarget")) then
25532598
if not modDB:Flag(nil, "AlliesAurasCannotAffectSelf") and not modDB.conditions["AffectedBy"..buff.name:gsub(" ","")] then
25542599
local inc = skillModList:Sum("INC", skillCfg, "AuraEffect", "BuffEffect", "BuffEffectOnPlayer", "AuraBuffEffect") + modDB:Sum("INC", skillCfg, "BuffEffectOnSelf", "AuraEffectOnSelf")
25552600
local more = skillModList:More(skillCfg, "AuraEffect", "BuffEffect", "AuraBuffEffect") * modDB:More(skillCfg, "BuffEffectOnSelf", "AuraEffectOnSelf")
@@ -2567,7 +2612,7 @@ function calcs.perform(env, skipEHP)
25672612
mergeBuff(srcList, buffs, buff.name)
25682613
end
25692614
end
2570-
if env.minion and not env.minion.modDB.conditions["AffectedBy"..buff.name:gsub(" ","")] and (env.minion ~= activeSkill.minion or not activeSkill.skillData.auraCannotAffectSelf) then
2615+
if env.minion and not env.minion.modDB.conditions["AffectedBy"..buff.name:gsub(" ","")] and (env.minion ~= castingMinion or not activeSkill.skillData.auraCannotAffectSelf) then
25712616
local inc = skillModList:Sum("INC", skillCfg, "AuraEffect", "BuffEffect") + env.minion.modDB:Sum("INC", skillCfg, "BuffEffectOnSelf", "AuraEffectOnSelf")
25722617
local more = skillModList:More(skillCfg, "AuraEffect", "BuffEffect") * env.minion.modDB:More(skillCfg, "BuffEffectOnSelf", "AuraEffectOnSelf")
25732618
local mult = (1 + inc / 100) * more
@@ -2668,7 +2713,7 @@ function calcs.perform(env, skipEHP)
26682713
end
26692714
end
26702715
enemyDB.conditions["AffectedBy"..buff.name:gsub(" ","")] = true
2671-
if env.minion and env.minion == activeSkill.minion then
2716+
if env.minion and env.minion == castingMinion then
26722717
env.minion.modDB.conditions["AffectedBy"..buff.name:gsub(" ","")] = true
26732718
end
26742719
if buff.type == "Debuff" then

0 commit comments

Comments
 (0)