Files
Cielonos/Assets/Scripts/MainGame/Characters/Player/PlayerFunctions.cs
2026-04-18 13:57:19 -04:00

110 lines
3.5 KiB
C#

using Cielonos.MainGame.UI;
using SLSUtilities.General;
using UnityEngine;
namespace Cielonos.MainGame.Characters
{
public partial class Player
{
private float deltaTime => selfTimeSm.DeltaTime;
}
public partial class Player
{
private void Regeneration()
{
float healthRegenRate = attributeSm["HealthRegeneration"] * deltaTime;
if (healthRegenRate != 0)
{
attributeSm["Health"] += healthRegenRate;
attributeSm["Health"] = Mathf.Min(attributeSm["Health"], attributeSm["MaximumHealth"]);
PlayerCanvas.Instance.playerInfoUIArea.UpdateHealth(true);
}
float energyRegenRate = attributeSm["EnergyRegeneration"] * deltaTime;
if (energyRegenRate != 0)
{
AddEnergy(energyRegenRate);
}
}
public void AddEnergy(float amount)
{
if (amount == 0) return;
if (amount > 0)
{
float current = attributeSm["Energy"];
float max = attributeSm["MaximumEnergy"];
float availableSpace = max - current;
if (amount > availableSpace)
{
attributeSm["Energy"] = max;
float conversionRate = attributeSm.Has("OverloadConversionRate") ? attributeSm["OverloadConversionRate"] : 1f;
float overflowEnergy = (amount - availableSpace) * conversionRate;
DistributeOverloadEnergy(overflowEnergy);
}
else
{
attributeSm["Energy"] += amount;
}
}
else
{
attributeSm["Energy"] += amount;
attributeSm["Energy"] = Mathf.Max(0, attributeSm["Energy"]);
}
PlayerCanvas.Instance.playerInfoUIArea.UpdateEnergy(true);
eventSm.onEnergyChanged.Invoke(amount);
}
private void DistributeOverloadEnergy(float totalOverflowAmount)
{
if (totalOverflowAmount <= 0) return;
var overloadSubmodules = new System.Collections.Generic.List<Inventory.OverloadSubmodule>();
if (inventorySc.equipmentSm.currentMainWeapon?.overloadSm != null)
{
overloadSubmodules.Add(inventorySc.equipmentSm.currentMainWeapon.overloadSm);
}
foreach (var equip in inventorySc.equipmentSm.currentSupportEquipments)
{
if (equip?.overloadSm != null)
{
overloadSubmodules.Add(equip.overloadSm);
}
}
foreach (var equip in inventorySc.backpack.passiveEquipments)
{
if (equip?.overloadSm != null)
{
overloadSubmodules.Add(equip.overloadSm);
}
}
if (overloadSubmodules.Count == 0) return;
float totalWeight = 0;
foreach (var sm in overloadSubmodules)
{
totalWeight += sm.currentWeight;
}
if (totalWeight <= 0) return;
foreach (var sm in overloadSubmodules)
{
float assignedAmount = totalOverflowAmount * (sm.currentWeight / totalWeight);
sm.ReceiveEnergy(assignedAmount);
}
}
}
}