Files
Continentis/Assets/Scripts/MainGame/Character/CharacterSubmodules/AttributeSubmodule.cs

163 lines
7.5 KiB
C#
Raw Normal View History

2025-10-03 00:02:43 -04:00
using System.Collections.Generic;
using System.Linq;
using Continentis.MainGame.Rules;
2025-10-23 00:49:44 -04:00
using SLSFramework.General;
2025-10-03 00:02:43 -04:00
using Unity.VisualScripting;
using UnityEngine;
namespace Continentis.MainGame.Character
{
public partial class AttributeSubmodule : SubmoduleBase<CharacterBase>
{
public AttributeGroup coreAttributeGroup;
public AttributeGroup generalAttributeGroup;
public AttributeSubmodule(CharacterBase character) : base(character)
{
Initialize(character.data);
}
private void Initialize(CharacterData characterData)
{
coreAttributeGroup = new AttributeGroup(characterData.coreAttributes);
generalAttributeGroup = new AttributeGroup(characterData.generalAttributes);
RulesManager.Instance.attributeRulesMerger.convertCoreIntoGeneral(coreAttributeGroup.current, generalAttributeGroup.original);
generalAttributeGroup.ApplyAllAttributes();
2025-10-23 00:49:44 -04:00
generalAttributeGroup.SetUpEndowments(characterData.runtimeGeneralAttributes);
2025-10-03 00:02:43 -04:00
}
}
public partial class AttributeSubmodule
{
public float GetCurrentCoreAttribute(string attributeName, float defaultValue = 0)
{
return coreAttributeGroup.current.GetValueOrDefault(attributeName, defaultValue);
}
public int GetRoundCurrentCoreAttribute(string attributeName, int defaultValue = 0)
{
return coreAttributeGroup.current.GetRoundValue(attributeName, defaultValue);
}
public float GetCurrentGeneralAttribute(string attributeName, float defaultValue = 0)
{
return generalAttributeGroup.current.GetValueOrDefault(attributeName, defaultValue);
}
public int GetRoundCurrentGeneralAttribute(string attributeName, int defaultValue = 0)
{
return generalAttributeGroup.current.GetRoundValue(attributeName, defaultValue);
}
}
public partial class AttributeSubmodule
{
/// <summary>
/// 得出对某个核心属性的检定成功概率
/// 计算方式为达到需求值为100%每低于1点属性值成功率降低20%。
/// </summary>
/// <param name="coreAttributeName">属性名</param>
/// <param name="requirement">需求值</param>
/// <param name="higherPass">设true为高于需求值算作通过probability如果为false则最终概率为1-probability</param>
/// <param name="additionalAmount">额外加成</param>
/// <returns>最终概率</returns>
public float Probability(string coreAttributeName, int requirement, bool higherPass = true, int additionalAmount = 0)
{
return Probability(GetRoundCurrentCoreAttribute(coreAttributeName), requirement, higherPass, additionalAmount);
}
/// <summary>
/// 对某个核心属性进行检定
/// </summary>
/// <param name="coreAttributeName">属性名</param>
/// <param name="requirement">需求值</param>
/// <param name="higherPass">设true为高于需求值算作通过probability如果为false则最终概率为1-probability</param>
/// <param name="additionalAmount">额外加成</param>
/// <returns>本次检定是否通过</returns>
public bool Check(string coreAttributeName, int requirement, bool higherPass = true, int additionalAmount = 0)
{
return Check(GetRoundCurrentCoreAttribute(coreAttributeName), requirement, higherPass, additionalAmount);
}
private float Calculate(int value, int requirement)
{
int difference = value - requirement;
return Mathf.Clamp01(1 + difference * 0.2f);
}
private float Probability(int attributeValue, int requirement, bool higherPass = true, int additionalAmount = 0)
{
float probability = Calculate(attributeValue + additionalAmount, requirement);
return higherPass ? probability : 1 - probability;
}
private bool Check(int attributeValue, int requirement, bool higherPass = true, int additionalAmount = 0)
{
float baseProbability = Probability(attributeValue, requirement, higherPass, additionalAmount);
return baseProbability >= Random.Range(0f, 1f);
}
}
public partial class AttributeSubmodule
{
public void RefreshCoreAttribute(string attributeName)
{
coreAttributeGroup.ResetAttribute(attributeName);
owner.equipmentSubmodule.GetCoreAttributeChange(attributeName, out float e_numeric, out float e_pAccumulation, out float e_pMultiplication);
owner.combatBuffSubmodule.GetCoreAttributeChange(attributeName, out float cb_numeric, out float cb_pAccumulation, out float cb_pMultiplication);
float numeric = e_numeric + cb_numeric;
float pAccumulation = e_pAccumulation + cb_pAccumulation;
float pMultiplication = e_pMultiplication * cb_pMultiplication;
coreAttributeGroup.ModifyAttribute(attributeName, numeric, pAccumulation, pMultiplication);
RulesManager.Instance.attributeRulesMerger.convertCoreIntoGeneral(coreAttributeGroup.current, generalAttributeGroup.original);
}
public void RefreshAllCoreAttributes()
{
foreach (string attributeName in coreAttributeGroup.current.Keys)
{
RefreshCoreAttribute(attributeName);
}
}
}
public partial class AttributeSubmodule
{
public void RefreshGeneralAttribute(string attributeName)
{
generalAttributeGroup.ResetAttribute(attributeName);
owner.equipmentSubmodule.GetGeneralAttributeChange(attributeName, out float e_numeric, out float e_pAccumulation, out float e_pMultiplication);
owner.combatBuffSubmodule.GetGeneralAttributeChange(attributeName, out float cb_numeric, out float cb_pAccumulation, out float cb_pMultiplication);
float numeric = e_numeric + cb_numeric;
float pAccumulation = e_pAccumulation + cb_pAccumulation;
float pMultiplication = e_pMultiplication * cb_pMultiplication;
generalAttributeGroup.ModifyAttribute(attributeName, numeric, pAccumulation, pMultiplication);
2025-10-23 00:49:44 -04:00
//Debug.Log($"Refreshed general attribute: {attributeName}, new value: {generalAttributeGroup.current[attributeName]}");
2025-10-03 00:02:43 -04:00
}
public void RefreshAllGeneralAttributes()
{
foreach (string attributeName in generalAttributeGroup.current.Keys.ToList())
{
RefreshGeneralAttribute(attributeName);
}
}
private void ModifyGeneralAttributeFromEquipments(string attributeName)
{
/*EntityEquipmentModule equipmentModule = entity.equipmentModule;
equipmentModule.GetAttributeChange(attributeName, out int numericChange,
out float percentageChangeOfAccumulation, out float percentChangeOfMultiplication);
currentCombatAttributes[attributeName] += numericChange;
currentCombatAttributes[attributeName] = (int)((1 + percentageChangeOfAccumulation) * currentCombatAttributes[attributeName]);
currentCombatAttributes[attributeName] = (int)(percentChangeOfMultiplication * currentCombatAttributes[attributeName]);*/
}
}
}