NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Buff/Impl/BuffChangeProp.cs

625 lines
25 KiB
C#
Raw Normal View History

2023-10-19 15:00:19 +08:00
using System.Collections.Generic;
using cfg.BuffCfg;
2023-12-13 16:20:41 +08:00
using Gameplay.Unit.Data;
2023-10-19 15:00:19 +08:00
using UnityEngine;
namespace Gameplay.Buff
{
public class BuffChangeProp : BaseBuff
{
private List<EPropType> _propList;
private List<float> _changeList;
private Queue<float> _cacheValues = new Queue<float>(10);
2023-10-19 15:00:19 +08:00
private int _propCount;
protected override void _OnInit()
{
base._OnInit();
_propList = configData.PorpParams;
_changeList = configData.FloatParams;
_cacheValues.Clear();
2023-10-19 15:00:19 +08:00
if (_propList.Count != _changeList.Count)
{
DebugUtil.LogError("BuffChangeProp的属性数量和变化值数量不一致: buff id- {0}", configData.ID);
2023-10-19 15:00:19 +08:00
_propCount = Mathf.Min(_propList.Count, _changeList.Count);
}
else
{
// 数据一致
_propCount = _propList.Count;
}
}
2024-11-19 18:56:48 +08:00
private void _ReCalcShootCD()
{
2024-09-10 12:32:44 +08:00
DebugUtil.Log("原始射击间隔:{0},射速加成:{1}", owner.fightData.baseShootCd, owner.fightData.p_shootCdScale);
2024-11-19 18:56:48 +08:00
owner.fightData.shootCd = owner.fightData.baseShootCd * (1 + (1 / Mathf.Max(1 + owner.fightData.p_shootCdScale, 0.01f) - 1));
DebugUtil.Log("新射击间隔:{0}", owner.fightData.shootCd);
}
2023-10-19 15:00:19 +08:00
protected override void _OnAdd()
{
base._OnAdd();
for (int i = 0; i < _propCount; i++)
{
var propType = _propList[i];
var changeValue = _changeList[i];
_HandleForAddSingle(propType, changeValue);
}
}
private void _HandleForAddSingle(EPropType propType,
float changeValue)
{
switch (propType)
{
case EPropType.MoveSpeed:
2023-10-19 15:00:19 +08:00
{
var cacheValue = changeValue;
owner.fightData.moveSpeed += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.BeDamageScale:
{
var cacheValue = changeValue;
owner.fightData.beDamageScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.FinalDamageScale:
{
var cacheValue = changeValue;
owner.fightData.finalDamageScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.MoraleDamageScale:
{
var cacheValue = changeValue;
owner.fightData.moraleDamageScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.BeMoraleDamageScale:
{
var cacheValue = changeValue;
owner.fightData.moraleBeDamageScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.AttackValue:
{
var cacheValue = changeValue;
owner.fightData.attack += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.DefenseValue:
{
var cacheValue = changeValue;
owner.fightData.defense += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.ShootRate:
{
var cacheValue = changeValue;
owner.fightData.p_shootCdScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
// 射击间隔 * ( 1+ 1/(1+射速加成) -1) )
_ReCalcShootCD();
_UpdateViewShootCd();
break;
case EPropType.MoveShoot:
{
var cacheValue = changeValue;
_cacheValues.Enqueue(cacheValue);
// 只有角色才有移动射击
if (owner.gameunitType == EGameUnitType.Character)
{
if (owner is Character.Character character)
character.runtimeData.fightData.moveShootType += (int)cacheValue;
}
2023-10-19 15:00:19 +08:00
}
break;
case EPropType.MoveSpeedPercent:
{
var cacheValue = creator.fightData.baseMoveSpeed * changeValue;
owner.fightData.moveSpeed += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.RetretSpeedPercent:
{
var cacheValue = creator.fightData.baseRetreatSpeed * changeValue;
owner.fightData.retreatSpeed += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.AttackValuePercent:
{
var cacheValue = creator.fightData.baseAttack * changeValue;
owner.fightData.attack += (int)cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.DefenseValuePercent:
{
var cacheValue = creator.fightData.baseDefense * changeValue;
owner.fightData.defense += (int)cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.AttackDistancePercent:
{
var cacheValue = changeValue;
creator.fightData.baseAttackDistanceScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
_UpdateBaseAttackDistance();
break;
case EPropType.AttackDistance:
{
var cacheValue = Mathf.RoundToInt(changeValue);
creator.fightData.baseAttackDistanceFixed += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
_UpdateBaseAttackDistance();
break;
case EPropType.SkillReleaseDistancePercent:
{
var cacheValue = changeValue;
creator.fightData.skillReleaseDistanceScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.ReloadTimePercent:
{
var cacheValue = creator.fightData.baseReloadTime * changeValue;
owner.fightData.reloadTime += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
_UpdateViewReloadCd();
break;
case EPropType.MoraleRecoverScale:
{
var cacheValue = changeValue;
owner.fightData.moraleRecoverScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.DamageScaleForVehicle:
{
var cacheValue = changeValue;
owner.fightData.scaleForVehicle += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.IgnoreShieldRate:
{
var cacheValue = changeValue;
owner.fightData.ignoreShieldRate += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.ignoreDebuffRate:
{
var cacheValue = changeValue;
owner.fightData.ignoreDebuffRate += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.MaxBullet:
{
var cacheValue = Mathf.CeilToInt(changeValue * owner.fightData.baseMaxBulletCount);
owner.fightData.maxBulletCount += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.RetreatTime:
{
var cacheValue = changeValue;
owner.fightData.retreateTime += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.RetreatTimePercent:
{
var cacheValue = owner.fightData.baseRetreateTime * changeValue;
owner.fightData.retreateTime += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.LastBulletDamageScale:
{
var cacheValue = changeValue;
owner.fightData.lastBulletDamageScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.DamageScaleForHuman:
{
var cacheValue = changeValue;
owner.fightData.scaleForHuman += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.SkillCDReduceScale:
{
var cacheValue = changeValue;
owner.fightData.skillCdReduceScale += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.MoraleDamage:
{
var cacheValue = changeValue;
owner.fightData.moraleAttack += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.AttackEndTimeFix:
{
var cacheValue = changeValue;
owner.fightData.attackEndTime += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
_UpdateViewAttackEndTime();
break;
case EPropType.AttackEndTimePercent:
{
var cacheValue = owner.fightData.baseAttackEndTime * changeValue;
owner.fightData.attackEndTime += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
_UpdateViewAttackEndTime();
break;
case EPropType.HitRateFix:
{
var cacheValue = changeValue;
_ChangeHitRateFix(cacheValue);
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.HitRatePercent:
// 在内部进行缓存处理
_ChangeHitRatePercent(changeValue);
break;
case EPropType.MaxBulletPercent:
{
var cacheValue = Mathf.CeilToInt(changeValue * owner.fightData.baseMaxBulletCount);
owner.fightData.maxBulletCount += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
case EPropType.PerReloadPercent:
{
var cacheValue = Mathf.CeilToInt(changeValue * owner.fightData.basePerReloadCount);
owner.fightData.perReloadCount += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
break;
default:
DebugUtil.LogError("暂未处理的属性类型:{0}", propType);
break;
2023-10-19 15:00:19 +08:00
}
}
2024-12-04 16:48:36 +08:00
private void _ChangeHitRatePercent(float changePercent)
{
for (int i = 0; i < owner.fightData.distanceHitRate.Count; i++)
{
var baseHitRate = owner.fightData.baseDistanceHitRate[i];
var cacheValue = baseHitRate * changePercent;
owner.fightData.distanceHitRate[i] += cacheValue;
_cacheValues.Enqueue(cacheValue);
}
}
private void _RevertChangeHitRatePercent()
{
for (int i = 0; i < owner.fightData.distanceHitRate.Count; i++)
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.distanceHitRate[i] -= cacheValue;
2024-12-04 16:48:36 +08:00
}
}
private void _ChangeHitRateFix(float changeValue)
{
for (int i = 0; i < owner.fightData.distanceHitRate.Count; i++)
{
owner.fightData.distanceHitRate[i] += changeValue;
}
}
private void _UpdateBaseAttackDistance()
{
owner.fightData.normalAttackDistance = Mathf.CeilToInt(
creator.fightData.baseAttackDistance * creator.fightData.baseAttackDistanceScale
+ creator.fightData.baseAttackDistanceFixed);
}
2023-11-06 16:28:35 +08:00
private void _UpdateViewReloadCd()
{
switch (owner.gameunitType)
{
case EGameUnitType.Character:
{
if (owner is Character.Character character)
{
character.cAnim.ResetReloadAnim();
}
}
break;
}
}
2023-10-19 15:00:19 +08:00
private void _UpdateViewShootCd()
{
switch (owner.gameunitType)
{
case EGameUnitType.Character:
{
if (owner is Character.Character character)
{
character.cAnim.ResetShootAnim();
}
}
break;
}
}
private void _UpdateViewAttackEndTime()
{
switch (owner.gameunitType)
{
case EGameUnitType.Character:
{
if (owner is Character.Character character)
{
character.cAnim.ResetAttackEndAnim();
}
}
break;
}
}
2023-10-19 15:00:19 +08:00
protected override void _OnRemove()
{
base._OnRemove();
for (int i = 0; i < _propCount; i++)
{
var propType = _propList[i];
switch (propType)
{
case EPropType.MoveSpeed:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.moveSpeed -= cacheValue;
}
2023-10-19 15:00:19 +08:00
break;
case EPropType.BeDamageScale:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.beDamageScale -= cacheValue;
}
2023-10-19 15:00:19 +08:00
break;
case EPropType.FinalDamageScale:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.finalDamageScale -= cacheValue;
}
2023-10-19 15:00:19 +08:00
break;
case EPropType.MoraleDamageScale:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.moraleDamageScale -= cacheValue;
}
2023-10-19 15:00:19 +08:00
break;
case EPropType.BeMoraleDamageScale:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.moraleBeDamageScale -= cacheValue;
}
2023-10-19 15:00:19 +08:00
break;
case EPropType.AttackValue:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.attack -= cacheValue;
}
2023-10-19 15:00:19 +08:00
break;
case EPropType.DefenseValue:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.defense -= cacheValue;
}
2023-10-19 15:00:19 +08:00
break;
case EPropType.ShootRate:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.p_shootCdScale -= cacheValue;
}
2023-10-19 15:00:19 +08:00
// 射击间隔 * ( 1+ 1/(1+射速加成) -1) )
2024-11-19 18:56:48 +08:00
_ReCalcShootCD();
2023-10-19 15:00:19 +08:00
_UpdateViewShootCd();
break;
case EPropType.MoveShoot:
{
var cacheValue = _cacheValues.Dequeue();
2023-10-19 15:00:19 +08:00
// 只有角色才有移动射击
if (owner.gameunitType == EGameUnitType.Character)
{
if (owner is Character.Character character)
character.runtimeData.fightData.moveShootType -= (int)cacheValue;
2023-10-19 15:00:19 +08:00
}
}
2023-10-19 15:00:19 +08:00
break;
2023-11-06 16:50:41 +08:00
case EPropType.MoveSpeedPercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.moveSpeed -= cacheValue;
}
2023-11-06 16:50:41 +08:00
break;
case EPropType.RetretSpeedPercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.retreatSpeed -= cacheValue;
}
2023-11-06 16:50:41 +08:00
break;
case EPropType.AttackValuePercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.attack -= cacheValue;
}
2023-11-06 16:50:41 +08:00
break;
case EPropType.DefenseValuePercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.defense -= cacheValue;
}
2023-11-06 16:50:41 +08:00
break;
case EPropType.AttackDistancePercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.baseAttackDistanceScale -= cacheValue;
}
_UpdateBaseAttackDistance();
break;
case EPropType.AttackDistance:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.baseAttackDistanceFixed -= Mathf.RoundToInt(cacheValue);
}
_UpdateBaseAttackDistance();
2023-11-06 16:50:41 +08:00
break;
case EPropType.SkillReleaseDistancePercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.skillReleaseDistanceScale -= cacheValue;
}
2023-11-06 16:50:41 +08:00
break;
2023-11-16 13:06:13 +08:00
case EPropType.ReloadTimePercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.reloadTime -= cacheValue;
}
2023-11-16 13:06:13 +08:00
_UpdateViewReloadCd();
break;
case EPropType.MoraleRecoverScale:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.moraleRecoverScale -= cacheValue;
}
2023-11-16 13:06:13 +08:00
break;
2023-11-16 13:20:03 +08:00
case EPropType.DamageScaleForVehicle:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.scaleForVehicle -= cacheValue;
}
2023-11-16 13:20:03 +08:00
break;
2023-11-16 13:48:40 +08:00
case EPropType.IgnoreShieldRate:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.ignoreShieldRate -= cacheValue;
}
2023-11-16 13:48:40 +08:00
break;
2023-11-16 14:15:30 +08:00
case EPropType.ignoreDebuffRate:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.ignoreDebuffRate -= cacheValue;
}
2023-11-16 14:15:30 +08:00
break;
2023-12-13 14:11:09 +08:00
case EPropType.MaxBullet:
2024-03-20 15:49:53 +08:00
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.maxBulletCount -= Mathf.RoundToInt(cacheValue);
2024-03-20 15:49:53 +08:00
}
break;
case EPropType.RetreatTime:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.retreateTime -= cacheValue;
}
2024-03-20 15:49:53 +08:00
break;
case EPropType.RetreatTimePercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.retreateTime -= cacheValue;
2024-03-20 15:49:53 +08:00
}
2023-12-13 14:11:09 +08:00
break;
case EPropType.LastBulletDamageScale:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.lastBulletDamageScale -= cacheValue;
}
break;
2024-07-12 18:27:04 +08:00
case EPropType.DamageScaleForHuman:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.scaleForHuman -= cacheValue;
}
2024-07-12 18:27:04 +08:00
break;
case EPropType.SkillCDReduceScale:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.skillCdReduceScale -= cacheValue;
}
break;
case EPropType.MoraleDamage:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.moraleAttack -= cacheValue;
}
break;
case EPropType.AttackEndTimeFix:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.attackEndTime -= cacheValue;
}
_UpdateViewAttackEndTime();
break;
case EPropType.AttackEndTimePercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.attackEndTime -= cacheValue;
}
_UpdateViewAttackEndTime();
break;
2024-12-04 16:48:36 +08:00
case EPropType.HitRateFix:
{
var cacheValue = _cacheValues.Dequeue();
_ChangeHitRateFix(-cacheValue);
}
2024-12-04 16:48:36 +08:00
break;
case EPropType.HitRatePercent:
// 内部处理
_RevertChangeHitRatePercent();
2024-12-04 16:48:36 +08:00
break;
case EPropType.MaxBulletPercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.maxBulletCount -= Mathf.RoundToInt(cacheValue);
}
break;
case EPropType.PerReloadPercent:
{
var cacheValue = _cacheValues.Dequeue();
owner.fightData.perReloadCount -= Mathf.RoundToInt(cacheValue);
}
break;
2023-10-19 15:00:19 +08:00
default:
DebugUtil.LogError("暂未处理的属性类型:{0}", propType);
break;
}
}
}
}
}