diff --git a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs index 4414c63..9123c9c 100644 --- a/DungeonShooting_Godot/src/game/activity/role/RoleState.cs +++ b/DungeonShooting_Godot/src/game/activity/role/RoleState.cs @@ -67,4 +67,62 @@ return damage; } + + /// + /// 武器初始散射值增量 + /// + public float WeaponMinScatteringRangeIncrement = 0; + + /// + /// 武器最终散射值增量 + /// + public float WeaponFinalScatteringRangeIncrement = 0; + + /// + /// 武器开火发射子弹最大数量 + /// + public event Action> CalcWeaponFireBulletCount; + public int CallCalcWeaponFireBulletCount(Weapon weapon, int count) + { + if (CalcWeaponFireBulletCount != null) + { + var result = new RefValue(count); + CalcWeaponFireBulletCount(weapon, result); + return result.Value; + } + + return count; + } + + /// + /// 子弹速度 + /// + public event Action> CalcBulletSpeed; + public float CallCalcBulletSpeed(Weapon weapon, float speed) + { + if (CalcBulletSpeed != null) + { + var result = new RefValue(speed); + CalcBulletSpeed(weapon, result); + return result.Value; + } + + return speed; + } + + /// + /// 子弹射程 + /// + public event Action> CalcBulletDistance; + public float CallBulletDistance(Weapon weapon, float distance) + { + if (CalcBulletDistance != null) + { + var result = new RefValue(distance); + CalcBulletDistance(weapon, result); + return result.Value; + } + + return distance; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs index 2b74d67..6d05203 100644 --- a/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs +++ b/DungeonShooting_Godot/src/game/activity/weapon/Weapon.cs @@ -238,7 +238,7 @@ { if (_weaponAttributeMap.TryGetValue(itemId, out var attr)) { - return attr; + return attr.Clone(); } throw new Exception($"武器'{itemId}'没有在 Weapon 表中配置属性数据!"); @@ -422,8 +422,7 @@ //攻击冷却计时 _attackTimer = _attackTimer > 0 ? _attackTimer - delta : 0; //武器的当前散射半径 - CurrScatteringRange = Mathf.Max(CurrScatteringRange - Attribute.ScatteringRangeBackSpeed * delta, - Attribute.StartScatteringRange); + ScatteringRangeBackHandler(delta); //松开扳机 if (_triggerFlag || _downTimer > 0) { @@ -620,8 +619,7 @@ //散射值销退 if (_noAttackTime >= Attribute.ScatteringRangeBackDelayTime) { - CurrScatteringRange = Mathf.Max(CurrScatteringRange - Attribute.ScatteringRangeBackSpeed * delta, - Attribute.StartScatteringRange); + ScatteringRangeBackHandler(delta); } _triggerTimer = _triggerTimer > 0 ? _triggerTimer - delta : 0; @@ -937,8 +935,8 @@ } //开火添加散射值 - CurrScatteringRange = Mathf.Min(CurrScatteringRange + Attribute.ScatteringRangeAddValue, - Attribute.FinalScatteringRange); + ScatteringRangeAddHandler(); + //武器的旋转角度 tempAngle -= Attribute.UpliftAngle; RotationDegrees = tempAngle; @@ -1297,6 +1295,50 @@ } } + //散射值消退处理 + private void ScatteringRangeBackHandler(float delta) + { + var startScatteringRange = Attribute.StartScatteringRange; + var finalScatteringRange = Attribute.FinalScatteringRange; + if (Master != null) + { + startScatteringRange += Master.RoleState.WeaponMinScatteringRangeIncrement; + finalScatteringRange += Master.RoleState.WeaponFinalScatteringRangeIncrement; + } + if (startScatteringRange <= finalScatteringRange) + { + CurrScatteringRange = Mathf.Max(CurrScatteringRange - Attribute.ScatteringRangeBackSpeed * delta, + startScatteringRange); + } + else + { + CurrScatteringRange = Mathf.Min(CurrScatteringRange + Attribute.ScatteringRangeBackSpeed * delta, + startScatteringRange); + } + } + + //散射值添加处理 + private void ScatteringRangeAddHandler() + { + var startScatteringRange = Attribute.StartScatteringRange; + var finalScatteringRange = Attribute.FinalScatteringRange; + if (Master != null) + { + startScatteringRange += Master.RoleState.WeaponMinScatteringRangeIncrement; + finalScatteringRange += Master.RoleState.WeaponFinalScatteringRangeIncrement; + } + if (startScatteringRange <= finalScatteringRange) + { + CurrScatteringRange = Mathf.Min(CurrScatteringRange + Attribute.ScatteringRangeAddValue, + finalScatteringRange); + } + else + { + CurrScatteringRange = Mathf.Min(CurrScatteringRange - Attribute.ScatteringRangeAddValue, + finalScatteringRange); + } + } + //停止当前的换弹状态 private void StopReloadState() {