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
|
|
|
|
|
|
{
|
2025-11-08 09:50:55 -05:00
|
|
|
|
public float GetRawCurrentCoreAttribute(string attributeName, float defaultValue = 0)
|
2025-10-03 00:02:43 -04:00
|
|
|
|
{
|
|
|
|
|
|
return coreAttributeGroup.current.GetValueOrDefault(attributeName, defaultValue);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-08 09:50:55 -05:00
|
|
|
|
public int GetCurrentCoreAttribute(string attributeName, int defaultValue = 0)
|
2025-10-03 00:02:43 -04:00
|
|
|
|
{
|
|
|
|
|
|
return coreAttributeGroup.current.GetRoundValue(attributeName, defaultValue);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-08 09:50:55 -05:00
|
|
|
|
public float GetRawGeneralAttribute(string attributeName, float defaultValue = 0)
|
2025-10-03 00:02:43 -04:00
|
|
|
|
{
|
|
|
|
|
|
return generalAttributeGroup.current.GetValueOrDefault(attributeName, defaultValue);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-08 09:50:55 -05:00
|
|
|
|
public int GetGeneralAttribute(string attributeName, int defaultValue = 0)
|
2025-10-03 00:02:43 -04:00
|
|
|
|
{
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
2025-11-08 09:50:55 -05:00
|
|
|
|
return Probability(GetCurrentCoreAttribute(coreAttributeName), requirement, higherPass, additionalAmount);
|
2025-10-03 00:02:43 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <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)
|
|
|
|
|
|
{
|
2025-11-08 09:50:55 -05:00
|
|
|
|
return Check(GetCurrentCoreAttribute(coreAttributeName), requirement, higherPass, additionalAmount);
|
2025-10-03 00:02:43 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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]);*/
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|