100 lines
3.8 KiB
C#
100 lines
3.8 KiB
C#
using Cielonos.MainGame.Characters;
|
||
using UnityEngine;
|
||
|
||
namespace Cielonos.MainGame.Inventory.Collections
|
||
{
|
||
/// <summary>
|
||
/// 激情系统配套被动装备
|
||
/// - 提供与激情系统等级相关的属性加成。
|
||
/// - 加成效果根据激情等级逐级递增,最高可达 SSS 级别。
|
||
/// 具体效果如下:
|
||
/// - C级:+8 能量回复,+0 攻击获得能量,0% 攻击速度,0% 暴击率,0% 受到的最终伤害倍率
|
||
/// - B级:+4 能量回复,+0 攻击获得能量,1% 攻击速度,2% 暴击率,0% 受到的最终伤害倍率
|
||
/// - A级:+2 能量回复,+0 攻击获得能量,2% 攻击速度,4% 暴击率,0% 受到的最终伤害倍率
|
||
/// - S级:+1 能量回复,+1 攻击获得能量,3% 攻击速度,6% 暴击率,5% 受到的最终伤害倍率
|
||
/// - SS级:+1 能量回复,+1 攻击获得能量,4% 攻击速度,8% 暴击率,10% 受到的最终伤害倍率
|
||
/// - SSS级:+1 能量回复,+1 攻击获得能量,5% 攻击速度,10% 暴击率,20% 受到的最终伤害倍率
|
||
/// </summary>
|
||
public partial class Passion : PassiveEquipmentBase
|
||
{
|
||
private PassionSystem _passionSystem;
|
||
|
||
private int PassionLevel => _passionSystem.LevelIndex;
|
||
|
||
public override void Initialize()
|
||
{
|
||
base.Initialize();
|
||
_passionSystem = CombatManager.GetCombatSystem<PassionSystem>();
|
||
passiveAttributeSm = new AttributeSubmodule(this, passiveAttributeData);
|
||
}
|
||
|
||
public override void OnObtained()
|
||
{
|
||
base.OnObtained();
|
||
_passionSystem.OnLevelChanged += Refresh;
|
||
UpdateAttributes();
|
||
passiveAttributeSm.RefreshAllModifiedAttributes();
|
||
}
|
||
|
||
public override void OnDiscarded()
|
||
{
|
||
base.OnDiscarded();
|
||
_passionSystem.OnLevelChanged -= Refresh;
|
||
}
|
||
|
||
private void Refresh(int oldLevel, int newLevel)
|
||
{
|
||
UpdateAttributes();
|
||
passiveAttributeSm.RefreshAllModifiedAttributes();
|
||
}
|
||
|
||
private void UpdateAttributes()
|
||
{
|
||
passiveAttributeSm.charAttrNumericChange[CharacterAttribute.EnergyRegeneration] = GetEnergyRegen();
|
||
passiveAttributeSm.chaAttrPercentageChangeOfAccumulation[CharacterAttribute.AttackSpeed] = GetAttackSpeed();
|
||
passiveAttributeSm.charAttrNumericChange[CharacterAttribute.CriticalAttackProbability] = GetCriticalAttackProbability();
|
||
passiveAttributeSm.chaAttrPercentageChangeOfMultiplication[CharacterAttribute.FinalDamageReceivedMultiplier] = GetFinalDamageReceivedMultiplier();
|
||
}
|
||
}
|
||
|
||
public partial class Passion
|
||
{
|
||
private float GetEnergyRegen()
|
||
{
|
||
return PassionLevel switch
|
||
{
|
||
0 => 8.0f, // C-Rank
|
||
1 => 4.0f, // B-Rank
|
||
2 => 2.0f, // A-Rank
|
||
_ => 1.0f // S, SS, SSS (Ranks 3, 4, 5)
|
||
};
|
||
}
|
||
|
||
private float GetEnergyGainByAttack()
|
||
{
|
||
if (PassionLevel < 3) return 0f; // C, B, A ranks have no extra energy gain
|
||
return 1f; // S, SS, SSS ranks provide +1 energy gain on attack
|
||
}
|
||
|
||
private float GetAttackSpeed()
|
||
{
|
||
return PassionLevel * 0.01f;
|
||
}
|
||
|
||
private float GetCriticalAttackProbability()
|
||
{
|
||
return PassionLevel * 0.02f;
|
||
}
|
||
|
||
private float GetFinalDamageReceivedMultiplier()
|
||
{
|
||
return PassionLevel switch
|
||
{
|
||
3 => 1.05f, // S-Rank (LevelIndex 3)
|
||
4 => 1.10f, // SS-Rank (LevelIndex 4)
|
||
5 => 1.20f, // SSS-Rank (LevelIndex 5)
|
||
_ => 1.00f // C, B, A-Ranks (0, 1, 2)
|
||
};
|
||
}
|
||
}
|
||
} |