Files
Continentis/Assets/Scripts/MainGame/Character/CharacterSubmodules/AttributeSubmodule.cs
SoulliesOfficial 61a397dd4c MOD!
2025-10-23 00:49:44 -04:00

163 lines
7.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.Generic;
using System.Linq;
using Continentis.MainGame.Rules;
using SLSFramework.General;
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();
generalAttributeGroup.SetUpEndowments(characterData.runtimeGeneralAttributes);
}
}
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);
//Debug.Log($"Refreshed general attribute: {attributeName}, new value: {generalAttributeGroup.current[attributeName]}");
}
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]);*/
}
}
}