多轮审查和修复

This commit is contained in:
2026-05-12 15:34:08 +08:00
parent f55d2a57c3
commit ebbbb7332e
805 changed files with 838724 additions and 1905 deletions

View File

@@ -0,0 +1,28 @@
using System;
using UnityEngine;
namespace BaseGames.Equipment
{
/// <summary>
/// 攻击速度加成护符效果(架构 09_ProgressionModule §5
/// 修改 PlayerStats.AnimatorSpeedMultiplier动画控制器查询该倒数应用速度。
/// </summary>
[Serializable]
public class AttackSpeedEffect : ICharmEffect
{
[Range(0.1f, 2.0f)]
public float speedMultiplier = 1.2f; // 动画速度倍率1.2 = 加速 20%
public void OnEquip(EquipmentContext ctx)
{
ctx.Stats?.AddAnimatorSpeedBonus(speedMultiplier - 1f);
}
public void OnUnequip(EquipmentContext ctx)
{
ctx.Stats?.RemoveAnimatorSpeedBonus(speedMultiplier - 1f);
}
public string GetEffectDescription() => $"攻击速度 +{(speedMultiplier - 1f) * 100:0}%";
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0496fa028b434bb4aa5a8db318949418
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,69 @@
using System;
using UnityEngine;
using BaseGames.Combat;
using BaseGames.Core.Events;
namespace BaseGames.Equipment
{
/// <summary>
/// 命中触发效果类型。
/// </summary>
public enum OnHitEffectType
{
ApplyPoison,
ApplyFire,
KnockbackBoost
}
/// <summary>
/// 命中触发护符效果(架构 09_ProgressionModule §5
/// 订阅 HitConfirmedEventChannelSO("EVT_HitConfirmed") 并按概率对命中目标施加状态效果。
/// KnockbackBoost 类型通过 DamageInfo.KnockbackForce 标记,由 HurtBox 流水线读取。
/// </summary>
[Serializable]
public class OnHitEffect : ICharmEffect
{
public OnHitEffectType effectType;
[Range(0f, 1f)]
public float chance; // 触发概率0~1
private HitConfirmedEventChannelSO _onHitChannel;
private EventSubscription _sub;
public void OnEquip(EquipmentContext ctx)
{
_onHitChannel = ctx.Events?.Get<HitConfirmedEventChannelSO>("EVT_HitConfirmed");
_sub = _onHitChannel?.Subscribe(HandleHit);
}
public void OnUnequip(EquipmentContext ctx)
{
_sub?.Dispose();
_sub = null;
_onHitChannel = null;
}
private void HandleHit(HitInfo info)
{
if (UnityEngine.Random.value > chance) return;
switch (effectType)
{
case OnHitEffectType.ApplyPoison:
info.HitTransform?.GetComponentInParent<IStatusEffectable>()
?.ApplyStatusEffect(DamageType.Poison);
break;
case OnHitEffectType.ApplyFire:
info.HitTransform?.GetComponentInParent<IStatusEffectable>()
?.ApplyStatusEffect(DamageType.Fire);
break;
case OnHitEffectType.KnockbackBoost:
// KnockbackBoost 在 HitBox 构建 DamageInfo 前生效,
// 此处为命中后的反馈(可在此播放特效;实际击退已在 HurtBox 流水线处理)。
break;
}
}
public string GetEffectDescription() => $"命中时 {chance * 100:0}% 概率附加 {effectType}";
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e37498b992275324896706fb0237f9ca
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
using System;
using BaseGames.Skills;
namespace BaseGames.Equipment
{
/// <summary>
/// 技能数值修改护符效果(架构 09_ProgressionModule §5
/// 通过 SkillModifierRegistry 对指定技能的数值加成。
/// </summary>
[Serializable]
public class SkillNumericModifierEffect : ICharmEffect
{
public string TargetSkillId;
public SkillStat Stat;
public float Delta;
public bool IsPercent;
public void OnEquip(EquipmentContext ctx)
=> ctx.SkillMods?.Register(TargetSkillId, Stat, Delta, IsPercent);
public void OnUnequip(EquipmentContext ctx)
=> ctx.SkillMods?.Unregister(TargetSkillId, Stat, Delta, IsPercent);
public string GetEffectDescription()
=> $"{TargetSkillId}.{Stat} {(Delta >= 0 ? "+" : "")}{Delta}{(IsPercent ? "%" : "")}";
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fa27d39b594b954449a14cfab572255c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,30 @@
using System;
using BaseGames.Skills;
namespace BaseGames.Equipment
{
/// <summary>
/// 技能插槽替换护符效果(架构 09_ProgressionModule §5
/// 将指定形态的某技能槽替换为另一技能。
/// </summary>
[Serializable]
public class SkillSlotOverrideEffect : ICharmEffect
{
public SkillSlotOverride overrideData;
public void OnEquip(EquipmentContext ctx)
=> ctx.SkillMods?.AddSlotOverride(overrideData);
public void OnUnequip(EquipmentContext ctx)
=> ctx.SkillMods?.RemoveSlotOverride(overrideData);
public string GetEffectDescription()
{
string formStr = overrideData.targetForm != null
? overrideData.targetForm.name : "所有形态";
string skillName = overrideData.replacementSkill != null
? overrideData.replacementSkill.displayNameKey : "null";
return $"{formStr}的 {overrideData.targetSlot} 替换为 [{skillName}]";
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 337f2ae2dd788c5489eb13d19db1bbbc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,36 @@
using System;
namespace BaseGames.Equipment
{
/// <summary>
/// 法术资源类型。
/// </summary>
public enum SpellType
{
SoulAttack,
HealingWave
}
/// <summary>
/// 灵魂法术强化护符效果(架构 09_ProgressionModule §5
/// 装备时减少灵力消耗卸下时还原。SpellManager 消耗时查询 PlayerStats.SoulCostReduction。
/// </summary>
[Serializable]
public class SoulSpellEffect : ICharmEffect
{
public SpellType spellType;
public int soulCostReduction; // 减少消耗的灵力点数
public void OnEquip(EquipmentContext ctx)
{
ctx.Stats?.AddSoulCostReduction(soulCostReduction);
}
public void OnUnequip(EquipmentContext ctx)
{
ctx.Stats?.RemoveSoulCostReduction(soulCostReduction);
}
public string GetEffectDescription() => $"{spellType} 消耗减少 {soulCostReduction} 灵力";
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7d2819daddf61c54890ee8bfd55c0093
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,28 @@
using System;
namespace BaseGames.Equipment
{
/// <summary>
/// 属性加成护符效果(架构 09_ProgressionModule §5
/// 装备时通过 PlayerStats.AddModifier 叠加固定/百分比属性加成。
/// </summary>
[Serializable]
public class StatModifierEffect : ICharmEffect
{
public StatType statType;
public float flatBonus; // 固定加成(如 +1 HP
public float percentBonus; // 百分比加成(如 +0.2 = +20%
public void OnEquip(EquipmentContext ctx)
{
ctx.Stats?.AddModifier(statType, flatBonus, percentBonus);
}
public void OnUnequip(EquipmentContext ctx)
{
ctx.Stats?.RemoveModifier(statType, flatBonus, percentBonus);
}
public string GetEffectDescription() => $"{statType}: +{flatBonus} +{percentBonus * 100:0}%";
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a360d87b54b496f448a78f9abf2ef5c0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
using System;
using BaseGames.Player;
namespace BaseGames.Equipment
{
/// <summary>
/// 武器替换护符效果(架构 09_ProgressionModule §5
/// 通过 WeaponManager 将指定形态的武器替换为另一武器。
/// </summary>
[Serializable]
public class WeaponOverrideEffect : ICharmEffect
{
public string targetFormId; // 目标形态 ID留空 = 所有形态)
public WeaponSO replacementWeapon; // 替换武器 SO
public void OnEquip(EquipmentContext ctx)
=> ctx.WeaponMgr?.SetOverride(targetFormId, replacementWeapon);
public void OnUnequip(EquipmentContext ctx)
=> ctx.WeaponMgr?.ClearOverride(targetFormId);
public string GetEffectDescription()
{
string formStr = string.IsNullOrEmpty(targetFormId) ? "所有形态" : targetFormId;
string wName = replacementWeapon != null ? replacementWeapon.displayName : "null";
return $"{formStr}的武器替换为 [{wName}]";
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0f78ad8b20f68db4d9673de1a7cb5a58
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: