装备系统完结,修复并加入很多

This commit is contained in:
2026-04-03 19:15:02 +08:00
parent 538085b64f
commit d9376833b6
378 changed files with 62464 additions and 16756 deletions
+88 -54
View File
@@ -146,6 +146,15 @@ public class AllyCombatant : MonoBehaviour, ICombatant
private int _lastManaFullCastFrame = -1;
private bool _pendingManaFullCastRetry = false;
// Last event payloads used by custom equipment skill handlers.
public int lastHealOverflowAmount { get; private set; }
public int lastHealActualAmount { get; private set; }
public int lastDamageTakenAmount { get; private set; }
public int lastAdjacentAllyDamageTakenAmount { get; private set; }
public int lastMaxHPIncreaseAmount { get; private set; }
public int lastManaSpentAmount { get; private set; }
public bool lastManaSpendWasFullBar { get; private set; }
// Reusable buffers to reduce allocations during skill evaluation
private readonly List<SkillDefinition> _tmpSkillDefs = new List<SkillDefinition>(16);
private readonly Dictionary<string, float> _formulaVarsBuffer = new Dictionary<string, float>(16);
@@ -1001,20 +1010,22 @@ public class AllyCombatant : MonoBehaviour, ICombatant
var eff = GetEffectiveLevelForExp(a, slotExp);
if (eff != null)
{
maxHP = eff.maxHP;
maxMana = eff.maxMana;
damageResistance = eff.damageResistance;
scoreEfficiency = eff.scoreEfficiency;
SetAttack(eff.attack);
var resolved = a.GetEffectiveLevelInfoWithEquipment(eff);
maxHP = resolved.maxHP;
maxMana = resolved.maxMana;
damageResistance = resolved.damageResistance;
scoreEfficiency = resolved.scoreEfficiency;
SetAttack(resolved.attack);
}
else
{
var lvl = a.levelStats[0];
maxHP = lvl.maxHP;
maxMana = lvl.maxMana;
damageResistance = lvl.damageResistance;
scoreEfficiency = lvl.scoreEfficiency;
SetAttack(lvl.attack);
var resolved = a.GetEffectiveLevelInfoWithEquipment(lvl);
maxHP = resolved.maxHP;
maxMana = resolved.maxMana;
damageResistance = resolved.damageResistance;
scoreEfficiency = resolved.scoreEfficiency;
SetAttack(resolved.attack);
}
}
@@ -1263,6 +1274,12 @@ public class AllyCombatant : MonoBehaviour, ICombatant
UpdateUIImmediate();
lastMaxHPIncreaseAmount = Mathf.Max(0, maxHP - oldMax);
if (lastMaxHPIncreaseAmount > 0)
{
TryTriggerSkillsOnEvent(SkillDefinition.SkillTrigger.OnMaxHPIncreased);
}
// Max HP change affects percentage triggers
EvaluateHPPercentageTriggers(oldHP);
}
@@ -1309,6 +1326,8 @@ public class AllyCombatant : MonoBehaviour, ICombatant
}
else if (delta < 0)
{
lastManaSpentAmount = -delta;
lastManaSpendWasFullBar = old >= maxMana && currentMana <= 0;
if (_isTriggeringManaLost) return;
_isTriggeringManaLost = true;
try
@@ -1320,6 +1339,11 @@ public class AllyCombatant : MonoBehaviour, ICombatant
_isTriggeringManaLost = false;
}
}
else
{
lastManaSpentAmount = 0;
lastManaSpendWasFullBar = false;
}
int finalMana = currentMana;
if (requestedMana != old || incomingOverflowGainAtFull)
@@ -1648,6 +1672,7 @@ public class AllyCombatant : MonoBehaviour, ICombatant
ModifyHP(-delta, true, true);
int actual = oldHP - currentHP;
lastDamageTakenAmount = actual;
GameplaySkillLogger.RecordAllyResourceEvent(
allyName,
slotIndex,
@@ -1671,6 +1696,12 @@ public class AllyCombatant : MonoBehaviour, ICombatant
iNumberPrefabController.SpawnForAllyStatic(slotIndex, iNumberPrefabController.InstantNumberType.Damage, -actual);
}
}
if (actual > 0)
{
TryTriggerSkillsOnEvent(SkillDefinition.SkillTrigger.OnDamageTaken);
NotifyAdjacentAlliesDamaged(actual);
}
}
public void ReceiveHeal(float amount, GameObject source, bool deferPopup = false)
@@ -1679,8 +1710,11 @@ public class AllyCombatant : MonoBehaviour, ICombatant
int oldHP = currentHP;
float mult = GetTotalHealReceivedMultiplier();
int delta = Mathf.CeilToInt(amount * mult);
int rawTargetHp = oldHP + delta;
ModifyHP(delta, true, true);
int actual = currentHP - oldHP;
lastHealActualAmount = actual;
lastHealOverflowAmount = Mathf.Max(0, rawTargetHp - maxHP);
GameplaySkillLogger.RecordAllyResourceEvent(
allyName,
slotIndex,
@@ -1706,6 +1740,26 @@ public class AllyCombatant : MonoBehaviour, ICombatant
}
}
private void NotifyAdjacentAlliesDamaged(int actualDamage)
{
if (actualDamage <= 0) return;
var ui = teamUIController.Instance;
if (ui == null) return;
int[] adjacent = ui.GetAdjacentAllyIndices(slotIndex);
if (adjacent == null || adjacent.Length == 0) return;
for (int i = 0; i < adjacent.Length; i++)
{
var allyObj = ui.GetAllyObjectBySlot(adjacent[i]);
if (allyObj == null) continue;
var ally = allyObj.GetComponent<AllyCombatant>();
if (ally == null || ally == this || ally.IsDead) continue;
ally.lastAdjacentAllyDamageTakenAmount = actualDamage;
ally.TryTriggerSkillsOnEvent(SkillDefinition.SkillTrigger.OnAdjacentAllyDamaged);
}
}
public void ApplyBuff(Buff buff, GameObject source)
{
ApplyBuffInternal(buff, source, true);
@@ -1764,17 +1818,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
if (so == null) return;
// If equipped groups exist, iterate them first
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
{
foreach (var gid in so.equippedSkillGroupIDs)
foreach (int gid in runtimeGroupIds)
{
if (gid == 0) continue;
SkillGroup group = null;
for (int k = 0; k < so.skillGroups.Length; k++)
{
var g = so.skillGroups[k];
if (g != null && g.skillGroupID == gid) { group = g; break; }
}
SkillGroup group = so.GetSkillGroupByID(gid);
if (group == null) continue;
foreach (var def in group.skills)
{
@@ -1874,13 +1924,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
bool anyTriggered = false;
// First: equipped groups
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
{
foreach (int gid in so.equippedSkillGroupIDs)
foreach (int gid in runtimeGroupIds)
{
if (gid == 0) continue;
SkillGroup group = null;
for (int k = 0; k < so.skillGroups.Length; k++) { var g = so.skillGroups[k]; if (g != null && g.skillGroupID == gid) { group = g; break; } }
SkillGroup group = so.GetSkillGroupByID(gid);
if (group == null) continue;
foreach (var skill in group.skills)
{
@@ -2029,17 +2079,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
// Collect candidate skills (same priority order as other triggers)
var defs = _tmpSkillDefs;
defs.Clear();
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
{
foreach (var gid in so.equippedSkillGroupIDs)
foreach (int gid in runtimeGroupIds)
{
if (gid == 0) continue;
SkillGroup group = null;
for (int k = 0; k < so.skillGroups.Length; k++)
{
var g = so.skillGroups[k];
if (g != null && g.skillGroupID == gid) { group = g; break; }
}
SkillGroup group = so.GetSkillGroupByID(gid);
if (group == null || group.skills == null) continue;
for (int i = 0; i < group.skills.Length; i++)
{
@@ -2193,17 +2239,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
var defs = _tmpSkillDefs;
defs.Clear();
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
{
foreach (var gid in so.equippedSkillGroupIDs)
foreach (int gid in runtimeGroupIds)
{
if (gid == 0) continue;
SkillGroup group = null;
for (int k = 0; k < so.skillGroups.Length; k++)
{
var g = so.skillGroups[k];
if (g != null && g.skillGroupID == gid) { group = g; break; }
}
SkillGroup group = so.GetSkillGroupByID(gid);
if (group == null || group.skills == null) continue;
for (int i = 0; i < group.skills.Length; i++)
{
@@ -2299,17 +2341,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
var defs = _tmpSkillDefs;
defs.Clear();
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
{
foreach (var gid in so.equippedSkillGroupIDs)
foreach (int gid in runtimeGroupIds)
{
if (gid == 0) continue;
SkillGroup group = null;
for (int k = 0; k < so.skillGroups.Length; k++)
{
var g = so.skillGroups[k];
if (g != null && g.skillGroupID == gid) { group = g; break; }
}
SkillGroup group = so.GetSkillGroupByID(gid);
if (group == null || group.skills == null) continue;
for (int i = 0; i < group.skills.Length; i++)
{
@@ -2424,17 +2462,13 @@ public class AllyCombatant : MonoBehaviour, ICombatant
var defs = _tmpSkillDefs;
defs.Clear();
if (so.equippedSkillGroupIDs != null && so.equippedSkillGroupIDs.Length > 0 && so.skillGroups != null)
int[] runtimeGroupIds = so.GetEffectiveEquippedSkillGroupIDs();
if (runtimeGroupIds != null && runtimeGroupIds.Length > 0)
{
foreach (var gid in so.equippedSkillGroupIDs)
foreach (int gid in runtimeGroupIds)
{
if (gid == 0) continue;
SkillGroup group = null;
for (int k = 0; k < so.skillGroups.Length; k++)
{
var g = so.skillGroups[k];
if (g != null && g.skillGroupID == gid) { group = g; break; }
}
SkillGroup group = so.GetSkillGroupByID(gid);
if (group == null || group.skills == null) continue;
for (int i = 0; i < group.skills.Length; i++)
{