狗屎Minimax坏我代码
This commit is contained in:
@@ -6,30 +6,60 @@ namespace Cielonos.MainGame.Characters.Inventory
|
||||
{
|
||||
public class AttributeSubmodule : SubmoduleBase<ItemBase>
|
||||
{
|
||||
public int level;
|
||||
|
||||
public AttributeGroup attributeGroup;
|
||||
public Dictionary<string, float> numericChange;
|
||||
public Dictionary<string, float> percentageChangeOfAccumulation;
|
||||
public Dictionary<string, float> percentageChangeOfMultiplication;
|
||||
|
||||
private UpgradeData _upgradeData;
|
||||
|
||||
public bool Has(string attributeName) => attributeGroup.current.ContainsKey(attributeName);
|
||||
public float Get(string attributeName, float defaultValue) => attributeGroup.current.GetValueOrDefault(attributeName, defaultValue);
|
||||
|
||||
public AttributeSubmodule(ItemBase owner, AttributeData data) : base(owner)
|
||||
public float this[string attributeName]
|
||||
{
|
||||
get => attributeGroup.current.GetValueOrDefault(attributeName, attributeName.Contains("Multiplier") ? 1 : 0);
|
||||
set => attributeGroup.current[attributeName] = value;
|
||||
}
|
||||
|
||||
public AttributeSubmodule(ItemBase owner, AttributeData data, UpgradeData upgradeData = null) : base(owner)
|
||||
{
|
||||
this.attributeGroup = new AttributeGroup(data.itemAttributes.ToDictionary());
|
||||
this.numericChange = new Dictionary<string, float>(data.chaAttrNumericChange);
|
||||
this.percentageChangeOfAccumulation = new Dictionary<string, float>(data.chaAttrPercentageChangeOfAccumulation);
|
||||
this.percentageChangeOfMultiplication = new Dictionary<string, float>(data.chaAttrPercentageChangeOfMultiplication);
|
||||
this._upgradeData = upgradeData;
|
||||
}
|
||||
|
||||
public void GetAttributeChanges(string attributeName, out float numeric, out float pAccumulation, out float pMultiplication)
|
||||
{
|
||||
numeric = numericChange.GetValueOrDefault(attributeName, 0f);
|
||||
numeric = numericChange.GetValueOrDefault(attributeName, 0f) + GetUpgradeNumericValue(attributeName);
|
||||
pAccumulation = percentageChangeOfAccumulation.GetValueOrDefault(attributeName, 0f);
|
||||
pMultiplication = percentageChangeOfMultiplication.GetValueOrDefault(attributeName, 1f);
|
||||
}
|
||||
|
||||
public void ApplyAttributeChanges(string attributeName, ref float numeric, ref float pAccumulation, ref float pMultiplication)
|
||||
{
|
||||
numeric += numericChange.GetValueOrDefault(attributeName, 0f);
|
||||
numeric += numericChange.GetValueOrDefault(attributeName, 0f) + GetUpgradeNumericValue(attributeName);
|
||||
pAccumulation += percentageChangeOfAccumulation.GetValueOrDefault(attributeName, 0f);
|
||||
pMultiplication *= percentageChangeOfMultiplication.GetValueOrDefault(attributeName, 1f);
|
||||
}
|
||||
|
||||
private float GetUpgradeNumericValue(string attributeName)
|
||||
{
|
||||
if (_upgradeData == null || level == 0) return 0f;
|
||||
|
||||
foreach (var upgradeInfo in _upgradeData.upgrades)
|
||||
{
|
||||
if (upgradeInfo.attributeKey == attributeName)
|
||||
{
|
||||
return upgradeInfo.GetValue(level);
|
||||
}
|
||||
}
|
||||
return 0f;
|
||||
}
|
||||
|
||||
public List<string> RefreshAllModifiedAttributes()
|
||||
{
|
||||
@@ -37,7 +67,13 @@ namespace Cielonos.MainGame.Characters.Inventory
|
||||
modifiedAttributes.AddRange(numericChange.Select(kvp => kvp.Key));
|
||||
modifiedAttributes.AddRange(percentageChangeOfAccumulation.Select(kvp => kvp.Key));
|
||||
modifiedAttributes.AddRange(percentageChangeOfMultiplication.Select(kvp => kvp.Key));
|
||||
|
||||
|
||||
if (_upgradeData != null)
|
||||
{
|
||||
modifiedAttributes.AddRange(_upgradeData.upgrades.Select(u => u.attributeKey));
|
||||
}
|
||||
|
||||
modifiedAttributes = modifiedAttributes.Distinct().ToList();
|
||||
modifiedAttributes.ForEach(attr => owner.player.attributeSm.RefreshAttribute(attr));
|
||||
|
||||
return modifiedAttributes;
|
||||
|
||||
@@ -23,10 +23,24 @@ namespace Cielonos.MainGame.Characters.Inventory
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
if (owner?.player != null)
|
||||
_timeProvider = new CharacterFeedbackTimeProvider(owner.player);
|
||||
}
|
||||
|
||||
public FeedbackData GetFeedbackData(string feedbackName)
|
||||
{
|
||||
if (feedbackDataCollection == null)
|
||||
{
|
||||
_timeProvider = new CharacterFeedbackTimeProvider(owner.player);
|
||||
Debug.LogWarning($"[Item.FeedbackSubcontroller] feedbackDataCollection is null on {owner?.name}.");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!feedbackDataCollection.TryGet(feedbackName, out FeedbackData data))
|
||||
{
|
||||
Debug.LogWarning($"[Item.FeedbackSubcontroller] FeedbackData '{feedbackName}' not found on {owner?.name}.");
|
||||
return null;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -109,7 +123,7 @@ namespace Cielonos.MainGame.Characters.Inventory
|
||||
}
|
||||
|
||||
// 新系统驱动
|
||||
float dt = Time.unscaledDeltaTime;
|
||||
float dt = Time.deltaTime;
|
||||
for (int i = _activePlayers.Count - 1; i >= 0; i--)
|
||||
{
|
||||
FeedbackPlayer player = _activePlayers[i];
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
using System;
|
||||
using Sirenix.OdinInspector;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Cielonos.MainGame.Characters.Inventory
|
||||
{
|
||||
public class OverloadSubmodule : SubmoduleBase<ItemBase>
|
||||
{
|
||||
public float maximumOverload;
|
||||
public float currentOverload;
|
||||
public float minimumCooldown;
|
||||
public float cooldownTimer;
|
||||
[ShowInInspector]
|
||||
public float currentWeight => cooldownTimer > 0f ? 0f : owner.overloadData.overloadWeight;
|
||||
|
||||
[HideInInspector]
|
||||
public Action OnTriggered;
|
||||
public OverloadSubmodule(ItemBase owner, OverloadData data) : base(owner)
|
||||
{
|
||||
this.maximumOverload = data.maxOverload;
|
||||
this.minimumCooldown = data.triggerCooldown;
|
||||
}
|
||||
|
||||
public void Update(float deltaTime)
|
||||
{
|
||||
if (cooldownTimer > 0f)
|
||||
{
|
||||
cooldownTimer -= deltaTime;
|
||||
if (cooldownTimer <= 0f)
|
||||
{
|
||||
cooldownTimer = 0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ReceiveEnergy(float amount)
|
||||
{
|
||||
if (cooldownTimer > 0f) return;
|
||||
|
||||
currentOverload += amount;
|
||||
|
||||
if (currentOverload >= maximumOverload)
|
||||
{
|
||||
currentOverload = 0f; // 清空能量
|
||||
cooldownTimer = minimumCooldown; // 开始冷却
|
||||
OnTriggered?.Invoke(); // 触发监听件
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 78c68ec19d139584b86cb8f01cd86c10
|
||||
Reference in New Issue
Block a user