NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/ShowAllCharacter/CharacterDataInfo.cs

1320 lines
42 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Collections.Generic;
using cfg.CharacterCfg;
using Framework;
using CharacterInfo = Gameplay.Net.CharacterInfo;
using cfg;
using Gameplay;
using Gameplay.Utils;
using PhxhSDK;
using cfg.WeaponCfg;
using UnityEngine;
using Gameplay.Common;
using System.Text;
using Gameplay.Character.Utils;
using System;
using cfg.SkillCfg;
public class CharacterDataInfoManager : Singlenton<CharacterDataInfoManager>, IInitable
{
public List<CharacterDataInfo> DataList;
public Dictionary<uint, CharacterDataInfo> DataDic;
private const int CharacterRedPointParentID = 30;
void IInitable.Init()
{
DataList = new List<CharacterDataInfo>();
DataDic = new Dictionary<uint, CharacterDataInfo>();
}
void IInitable.Release()
{
DataList.Clear();
DataDic.Clear();
}
public void Dispose()
{
DataList.Clear();
DataDic.Clear();
}
public void AddAllCfgCharacter()
{
DataList.Clear();
DataDic.Clear();
cfg.Tables Table = TableManager.Instance.Tables;
CharacterAttri attriCfg = Table.CharacterAttri;
foreach (var item in attriCfg.DataList)
{
var isAvaliable = _CheckCharacterCfgAvaliable(item);
if (!isAvaliable)
{
DebugUtil.LogError("角色ID:{0}的配置不可用", item.RoleID);
continue;
}
CharacterDataInfo info = new CharacterDataInfo(item);
if (DataDic.ContainsKey((uint)info.Cfg.RoleID))
{
continue;
}
info.ConstructRedPointTree(CharacterRedPointParentID);
DataList.Add(info);
DataDic[(uint)info.Cfg.RoleID] = info;
}
}
private bool _CheckCharacterCfgAvaliable(DataCharacterAttri checkCfg)
{
var skinCfg = TableManager.Instance.Tables.SkinCfg.Get(GLConfig.Inst.data.DEFAULTSKINID, checkCfg.RoleID);
if (skinCfg == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的皮肤配置为空");
return false;
}
var picHeadPath = CommonUtils.GetCharacterPicPath(checkCfg.RoleID, CommonUtils.ECharacterPicPathType.HeadPic);//CommonUtils.GetWholeHeadPath(skinCfg.PIcHeadPath);
if (!AssetManager.Instance.CanLocateAsset<Sprite>(picHeadPath))
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的头像资源路径:{picHeadPath}不存在");
// TODO: 暂时允许头像资源不存在
// return false;
}
var fakeSkillLevel = 1;
var skillLevelInfo = TableManager.Instance.Tables.CharacterSkillLevel.Get(checkCfg.RoleID, fakeSkillLevel);
if (skillLevelInfo == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的技能等级配置为空");
return false;
}
var skillGroupInfo = TableManager.Instance.Tables.SkillReferConfig.Get(skillLevelInfo.SkillGroupId);
if (skillGroupInfo == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的技能组配置为空");
return false;
}
var awakeLevel = 1;
var awakeCfg = TableManager.Instance.Tables.CharacterAwaking.Get(checkCfg.RoleID, awakeLevel);
if (awakeCfg == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的觉醒配置为空");
return false;
}
var breakLevel = 1;
var breakCfg = TableManager.Instance.Tables.CharacterBreak.Get(checkCfg.RoleID, breakLevel);
if (breakCfg == null)
{
DebugUtil.LogError($"角色ID:{checkCfg.RoleID}的突破配置为空");
return false;
}
return true;
}
public void Add(CharacterInfo info)
{
if (DataDic.TryGetValue(info.ID, out CharacterDataInfo info2))//已添加则刷新相关信息
{
DataDic[info.ID].Refresh(info);
for (int i = 0; i < DataList.Count; i++)
{
if (DataList[i].ID == info.ID)
{
DataList[i].Refresh(info);
return;
}
}
}
else
{
CharacterDataInfo newInfo = new CharacterDataInfo();
var cfg = TableManager.Instance.Tables.CharacterAttri.GetOrDefault((int)info.ID);
if (cfg == null)
{
DebugUtil.LogError($"CharacterDefaultConfig缺少角色配置当前角色ID{info.ID}");
return;
}
newInfo.Refresh(info);
DataList.Add(newInfo);
DataDic[info.ID] = newInfo;
newInfo.ConstructRedPointTree(CharacterRedPointParentID);
EventManager.Instance.Send(EventManager.EventName.GetNewCharacter, info.ID);
}
}
public void SortCharactersByLevel()
{
DataList.Sort((a, b) => b.Level.CompareTo(a.Level));
}
public void SortCharactersByID()//角色ID排序默认为从小到大升序
{
DataList.Sort((a, b) => a.Cfg.RoleID.CompareTo(b.Cfg.RoleID));
}
public void SortCharacterDefault()//默认排序方式整体以等级降序等级相同的情况下按照角色ID升序
{
DataList.Sort((a, b) =>
{
int ret = b.Level.CompareTo(a.Level);
if (ret == 0)
{
ret = a.Cfg.RoleID.CompareTo(b.Cfg.RoleID);
}
return ret;
});
}
public void SortCharactersByLevel(List<CharacterDataInfo> dataInfos)
{
dataInfos.Sort((a, b) => b.Level.CompareTo(a.Level));
}
public CharacterDataInfo GetCharacterInfo(uint selectId)
{
if (DataDic.TryGetValue(selectId, out var info))
{
return info;
}
else
{
DebugUtil.LogError("找不到该角色ID {0}", selectId);
return null;
}
}
public CharacterDataInfo GetMaxLevelCharacter()
{
if (DataList.Count <= 0)
{
return null;
}
var dataList = new List<CharacterDataInfo>(DataList);
dataList.Sort((a, b) =>
{
if (a.Level > b.Level) return 1;
return 0;
});
return dataList[0];
}
/// <summary>
/// 获取指挥官推荐职业列表
/// </summary>
public List<ProvideJob> GetCommanderProvideJobs(uint id)
{
var jobs = new List<ProvideJob>();
DataCharacterAttri cfg = null;
if (DataDic.TryGetValue(id, out var characterDataInfo))
{
cfg = characterDataInfo.Cfg;
}
else
{
cfg = TableManager.Instance.Tables.CharacterAttri.GetOrDefault((int)id);
}
if (cfg.Job != Ejob.Job_Commander)
{
DebugUtil.LogError("该角色不为指挥官{0}", id);
return jobs;
}
var provideJobs = cfg.ProvideJob;
if (provideJobs.Length == 0)
{
DebugUtil.LogError("该指挥官{0}推荐职位为空", id);
return jobs;
}
var vehicleList = new List<ProvideJob>();
var characterList = new List<ProvideJob>();
foreach (var job in provideJobs)
{
if (job == ProvideJob.ProvideJob_None)
{
DebugUtil.LogError("该指挥官{0}配置的推荐职业包含空");
continue;
}
if (job == ProvideJob.ProvideJob_Vehicle)
{
vehicleList.Add(job);
}
else
{
characterList.Add(job);
}
}
jobs.AddRange(vehicleList);
jobs.AddRange(characterList);
return jobs;
}
public int GetSpendLeadership(uint id)
{
if (DataDic.TryGetValue(id, out var characterDataInfo))
{
if (characterDataInfo.Cfg != null)
return characterDataInfo.SpendLeadership();
}
return 0;
}
}
public class CharacterDataInfo : CharacterInfo, IRedPointTreeNode
{
public DataCharacterAttri Cfg => _cfg;
private DataCharacterAttri _cfg;
private DataCharacterBreak _breakCfg;
public DataCharacterBreak BreakCfg => _breakCfg;
private DataCharacterAwaking _awakeCfg;
public DataCharacterAwaking AwakeCfg => _awakeCfg;
private DataCharacterLevelup _levelUpCfg;
public DataCharacterLevelup LevelUpCfg => _levelUpCfg;
RedPointNodeCharacter _redPointNode;
public RedPointNodeCharacter RedPointNode => _redPointNode;
RedPointNodeCharacter characterAwakingNode;
public RedPointNodeCharacter CharacterAwakingNode => characterAwakingNode;
public uint Uid => ID;
public CharacterDataInfo()
{
}
public CharacterDataInfo(uint id, uint level, uint breakLevel, uint awakeLevel)
{
ID = id;
Level = level;
BreakLevel = breakLevel;
AwakeLevel = awakeLevel;
LikelyExp = 0;
LikelyLevel = 0;
UltraSkillLevel = 0;
SkinID = 1;
isCheck = 1;
LoadAllConfigs();
}
private void LoadConfig<T>(Func<int, int, T> getConfig, int roleId, int level, out T config)
{
config = getConfig(roleId, level);
if (config == null)
{
DebugUtil.LogError($"未能加载到该角色{roleId}的该等级{level}配置,请检查配置");
}
}
private void LoadAllConfigs()
{
_cfg = TableManager.Instance.Tables.CharacterAttri.GetOrDefault((int)ID);
LoadConfig(TableManager.Instance.Tables.CharacterBreak.Get, (int)Cfg.RoleID, (int)BreakLevel, out _breakCfg);
LoadConfig(TableManager.Instance.Tables.CharacterAwaking.Get, (int)Cfg.RoleID, (int)AwakeLevel, out _awakeCfg);
LoadConfig(TableManager.Instance.Tables.CharacterLevelUp.Get, Cfg.LevelUpTemplate, (int)Level, out _levelUpCfg);
}
public int GetBreakPassiveId()
{
// if (BreakLevel == 0)
// {
// return Cfg.PassiveBreakSkillID;
// }
// else
if (_breakCfg != null)
return _breakCfg.PassiveSkillID;
return 0;
}
public int HasPassiveSkillCount()
{
var count = 0;
if (GetBreakPassiveId() != 0)
{
count++;
}
if (GetAwakePassiveId() != 0)
{
count++;
}
return count;
}
public int GetAwakePassiveId()
{
// if (AwakeLevel == 0)
// {
// return Cfg.PassiveAwakeSkillID;
// }
// else
{
return _awakeCfg.PassiveSkillID;
}
}
public CharacterDataInfo(DataCharacterAttri cfg)
{
ID = (uint)cfg.RoleID;
Exp = 10000;
Level = 10;
BreakLevel = 1;
AwakeLevel = 1;
LikelyExp = 1;
LikelyLevel = 1;
UltraSkillLevel = 1;
SkinID = 1;
isCheck = 1;
LoadAllConfigs();
}
public void Refresh(CharacterInfo info)
{
ID = info.ID;
Exp = info.Exp;
Level = info.Level;
BreakLevel = info.BreakLevel;
AwakeLevel = info.AwakeLevel;
LikelyExp = info.LikelyExp;
LikelyLevel = info.LikelyLevel;
UltraSkillLevel = info.UltraSkillLevel;
SkinID = info.SkinID;
isCheck = info.isCheck;
LoadAllConfigs();
}
/// <summary>
/// 养成属性枚举
/// </summary>
public enum CultivateProperty
{
/// <summary>
/// 生命值
/// </summary>
HP,
/// <summary>
/// 护甲值
/// </summary>
Shiled,
/// <summary>
/// 士气值
/// </summary>
Solider,
/// <summary>
/// 熟练度
/// </summary>
Proficiency,
/// <summary>
/// 防御力
/// </summary>
Defend,
/// <summary>
/// 移动速度
/// </summary>
MoveSpeed,
/// <summary>
/// 所属势力
/// </summary>
Belong,
/// <summary>
/// 装配武器
/// </summary>
Weapon,
/// <summary>
/// 单发伤害
/// </summary>
BulletAttack,
/// <summary>
/// 弹夹容量
/// </summary>
BulletCapacity,
/// <summary>
/// 主动技能名
/// </summary>
ActiveSkillName,
/// <summary>
/// 主动技能描述
/// </summary>
ActiveSkillDesc,
/// <summary>
/// 主动技能等级
/// </summary>
ActiveSkillLevel,
/// <summary>
/// 主动技能CD
/// </summary>
ActiveSkillCD,
/// <summary>
/// 被动技能名1
/// </summary>
PassivitySkillName1,
/// <summary>
/// 被动技能描述1
/// </summary>
PassivitySkillDesc1,
/// <summary>
/// 被动技能名2
/// </summary>
PassivitySkillName2,
/// <summary>
/// 被动技能描述2
/// </summary>
PassivitySkillDesc2,
}
/// <summary>
/// 获取初始属性值
/// </summary>
/// <param name="prop"></param>
/// <returns></returns>
public string GetInitialProperty(CultivateProperty prop)
{
// 创建一个字典,映射 CultivateProperty 到对应的获取属性方法
var propertyGetters = new Dictionary<CultivateProperty, Func<string>>
{
{ CultivateProperty.HP, this.HpLevelUp(1).ToString},
{ CultivateProperty.Shiled, this.ArmorLevelUp(1).ToString },
{ CultivateProperty.Solider, this.Corrage().ToString },
{ CultivateProperty.Proficiency, this.WeaponDegree(1).ToString },
{ CultivateProperty.Defend, DefenceLevelUp(1).ToString },
{ CultivateProperty.MoveSpeed, Cfg.Speed.ToString },
{ CultivateProperty.Belong, this.CharacterBelong },
{ CultivateProperty.Weapon, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.weapon, this.InitialWeapon().ID) },
{ CultivateProperty.BulletAttack, this.InitialWeapon().AttackPower.ToString },
{ CultivateProperty.BulletCapacity, () => TableManager.Instance.Tables.WeaponConfig.Get(Cfg.WeaponId).MaxBulletCount.ToString() },
{ CultivateProperty.ActiveSkillName, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.skill, CharacterDataHelper.GetCharacterSkillId((int)ID, 1)) },
{ CultivateProperty.ActiveSkillDesc, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.skill_desc, CharacterDataHelper.GetCharacterSkillId((int)ID, 1)) },
{ CultivateProperty.ActiveSkillLevel, () => CommonUtils.GetRomanCode(1) },
{ CultivateProperty.ActiveSkillCD, () => TableManager.Instance.Tables.SkillConfig.Get(CharacterDataHelper.GetCharacterSkillId((int)ID, 1))?.ChargeParam.ToString() },
{ CultivateProperty.PassivitySkillName1, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkill, TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, 0).PassiveSkillID) },
{ CultivateProperty.PassivitySkillDesc1, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkillDesc, TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, 0).PassiveSkillID) },
{ CultivateProperty.PassivitySkillDesc2, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkillDesc, TableManager.Instance.Tables.CharacterAwaking.Get(Cfg.RoleID, 0).PassiveSkillID) },
{ CultivateProperty.PassivitySkillName2, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkill, TableManager.Instance.Tables.CharacterAwaking.Get(Cfg.RoleID, 0).PassiveSkillID) }
};
try
{
// 通过字典调用相应的方法
if (propertyGetters.TryGetValue(prop, out var getter))
{
return getter();
}
}
catch (Exception e)
{
DebugUtil.LogError("获取ID{0}初始属性值失败,错误信息:{1}", ID, e.Message);
}
return string.Empty;
}
//public string GetInitialProperty(CultivateProperty prop)
//{
// switch (prop)
// {
// case CultivateProperty.HP:
// return HpLevelUp(1).ToString();
//
// case CultivateProperty.Shiled:
// return ArmorLevelUp(1).ToString();
//
// case CultivateProperty.Solider:
// return Corrage().ToString();
//
// case CultivateProperty.Proficiency:
// return WeaponDegree(1).ToString();
//
// case CultivateProperty.Defend:
// return DefenceLevelUp(1).ToString();
//
// case CultivateProperty.MoveSpeed:
// return Cfg.Speed.ToString();
//
// case CultivateProperty.Belong:
// return CharacterBelong();
//
// case CultivateProperty.Weapon:
// return CommonUtils.GetLocalizeText(E_LocalizePrefix.weapon, InitialWeapon().ID);
//
// case CultivateProperty.BulletAttack:
// return InitialWeapon().AttackPower.ToString();
//
// case CultivateProperty.BulletCapacity:
// return TableManager.Instance.Tables.WeaponConfig.Get(Cfg.WeaponId).MaxBulletCount.ToString();
//
// case CultivateProperty.ActiveSkillName:
// var skillCfg = TableManager.Instance.Tables.SkillConfig.Get(CharacterDataHelper.GetCharacterSkillId((int)ID, 1));
// return CommonUtils.GetLocalizeText(E_LocalizePrefix.skill, skillCfg.ID);
//
// case CultivateProperty.ActiveSkillDesc:
// var skillCfg2 = TableManager.Instance.Tables.SkillConfig.Get(CharacterDataHelper.GetCharacterSkillId((int)ID, 1));
// return CommonUtils.GetLocalizeText(E_LocalizePrefix.skill_desc, skillCfg2.ID);
//
// case CultivateProperty.ActiveSkillLevel:
// return CommonUtils.GetRomanCode(1);
//
// case CultivateProperty.ActiveSkillCD:
// var skillCfg3 = TableManager.Instance.Tables.SkillConfig.Get(CharacterDataHelper.GetCharacterSkillId((int)ID, 1));
// return skillCfg3.ChargeParam.ToString();
//
// case CultivateProperty.PassivitySkillName1:
// var _breakCfg = TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, 0);
// return CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkill, _breakCfg.PassiveSkillID);
//
// case CultivateProperty.PassivitySkillDesc1:
// var _breakCfg2 = TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, 0);
// return CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkillDesc, _breakCfg2.PassiveSkillID);
//
// case CultivateProperty.PassivitySkillDesc2:
// var _awakeCfg = TableManager.Instance.Tables.CharacterAwaking.Get(Cfg.RoleID, 0);
// return CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkillDesc, _awakeCfg.PassiveSkillID);
//
// case CultivateProperty.PassivitySkillName2:
// var _awakeCfg2 = TableManager.Instance.Tables.CharacterAwaking.Get(Cfg.RoleID, 0);
// return CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkill, _awakeCfg2.PassiveSkillID);
//
// default:
// return string.Empty;
// }
//}
/// <summary>
/// 获取最大养成属性值
/// </summary>
/// <param name="prop"></param>
/// <returns></returns>
public string GetMaxProperty(CultivateProperty prop)
{
// 创建一个字典,映射 CultivateProperty 到对应的获取属性方法
var propertyGetters = new Dictionary<CultivateProperty, Func<string>>
{
{ CultivateProperty.HP, () => HpLevelUp(GetMaxLevel()).ToString() },
{ CultivateProperty.Shiled, () => ArmorLevelUp(GetMaxLevel()).ToString() },
{ CultivateProperty.Solider, this.Corrage().ToString },
{ CultivateProperty.Proficiency, () => WeaponDegree(GetMaxLevel()).ToString() },
{ CultivateProperty.Defend, () => DefenceLevelUp(GetMaxLevel()).ToString() },
{ CultivateProperty.MoveSpeed, () => (Cfg.Speed + TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, GetMaxBreakLevel()).Speed + SpeedAwakeLvUp()).ToString() },
{ CultivateProperty.Belong, this.CharacterBelong },
{ CultivateProperty.Weapon, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.weapon, MaxWeapon().ID) },
{ CultivateProperty.BulletAttack, () => (AttackLevelUp(GetMaxLevel(), GetMaxBreakLevel()) + MaxWeapon().AttackPower).ToString() },
{ CultivateProperty.BulletCapacity, () => TableManager.Instance.Tables.WeaponConfig.Get(MaxWeapon().ID).MaxBulletCount.ToString() },
{ CultivateProperty.ActiveSkillName, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.skill, TableManager.Instance.Tables.SkillConfig.Get(CharacterDataHelper.GetCharacterSkillId((int)ID, GetMaxUltralSkillLevel(), GetMaxBreakLevel())).ID) },
{ CultivateProperty.ActiveSkillDesc, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.skill_desc, TableManager.Instance.Tables.SkillConfig.Get(CharacterDataHelper.GetCharacterSkillId((int)ID, GetMaxUltralSkillLevel(), GetMaxBreakLevel())).ID) },
{ CultivateProperty.ActiveSkillLevel, () => CommonUtils.GetRomanCode(GetMaxUltralSkillLevel()) },
{ CultivateProperty.ActiveSkillCD, () => TableManager.Instance.Tables.SkillConfig.Get(CharacterDataHelper.GetCharacterSkillId((int)ID, GetMaxUltralSkillLevel(), GetMaxBreakLevel())).ChargeParam.ToString() },
{ CultivateProperty.PassivitySkillName1, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkill, TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, GetMaxBreakLevel()).PassiveSkillID) },
{ CultivateProperty.PassivitySkillDesc1, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkillDesc, TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, GetMaxBreakLevel()).PassiveSkillID) },
{ CultivateProperty.PassivitySkillDesc2, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkillDesc, TableManager.Instance.Tables.CharacterAwaking.Get(Cfg.RoleID, GetMaxAwakeLevel()).PassiveSkillID) },
{ CultivateProperty.PassivitySkillName2, () => CommonUtils.GetLocalizeText(E_LocalizePrefix.PassiveSkill, TableManager.Instance.Tables.CharacterAwaking.Get(Cfg.RoleID, GetMaxAwakeLevel()).PassiveSkillID) }
};
try
{
// 通过字典调用相应的方法
if (propertyGetters.TryGetValue(prop, out var getter))
{
return getter();
}
}
catch (Exception e)
{
DebugUtil.LogError("获取ID{0}最大属性值失败,错误信息:{1}", ID, e.Message);
}
return string.Empty;
}
private int GetMaxLevel()
{
var maxBreakLevel = GetMaxBreakLevel();
var breakCfg = TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, maxBreakLevel);
return breakCfg.LevelLimit;
}
private DataWeapon InitialWeapon()
{
var breakcfg = TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, 0);
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(breakcfg.WeaponId);
return weaponConfig;
}
private DataWeapon MaxWeapon()
{
var breakcfg = TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, GetMaxBreakLevel());
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(breakcfg.WeaponId);
return weaponConfig;
}
public int SpendLeadership()
{
var spendLeadership = Cfg.SpendLeadership;
if (BreakLevel == 0)
{
return spendLeadership;
}
else
{
return _breakCfg.SpendLeadership;
}
}
private int HPBreakLvUp()
{
if (_breakCfg != null)
return _breakCfg.Hp;
return 0;
}
private int HpAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Hp;
}
return 0;
}
/// <summary>
/// 突破获取的攻击力,受武器影响
/// </summary>
/// <returns></returns>
private int AttackBreakLvUp()
{
//更换武器后,攻击力不再由突破表上的攻击力决定,而是由武器表上的攻击力决定
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
else
return weaponConfig.AttackPower;
}
public string Name => CommonUtils.GetCharacterName(_cfg.RoleID);
public string NickName { get { return CommonUtils.GetLocalizeText(E_LocalizePrefix.Chara_NickName, _cfg.RoleID); } }
public int HP()
{
return HpLevelUp((int)Level) + HPBreakLvUp() + HpAwakeLvUp();
}
public int HpLevelUp(int level)
{
var mCharacterLevelExpCfg = TableManager.Instance.Tables.CharacterLevelUp;
var CharacterLevelupTemplate = Cfg.LevelUpTemplate;
if (CharacterLevelupTemplate == 0)
{
DebugUtil.LogWarning("没有配置该角色等级模板:{0},自动使用默认模板", Cfg.RoleID);
CharacterLevelupTemplate = 1;
}
var levelCfg = mCharacterLevelExpCfg.Get(CharacterLevelupTemplate, level);
if (levelCfg == null)
{
DebugUtil.LogError("CharacterLevelUp表{0}模板不包含{1}等级的defence配置", Cfg.LevelUpTemplate, level);
return Cfg.HpBase;
}
else
{
var hp = levelCfg.Hp * Cfg.HpBase;
DebugUtil.Log("基础血量{0},等级{1},等级血量{2}", Cfg.HpBase, level, hp);
return Mathf.RoundToInt(hp);
}
}
/// <summary>
/// 武器熟练度 * 养成攻击力
/// </summary>
/// <returns></returns>
public int Attack()
{
var res = WeaponDegree((int)Level) * AttackBreakLvUp();
return Mathf.RoundToInt(res);
}
public int AttackLevelUp(int level, int breakLevel = -1)
{
//角色攻击力受等级武器熟练度影响
if (breakLevel == -1)
return (int)(WeaponDegree(level) * AttackBreakLvUp());
else
{
var breakcfg = TableManager.Instance.Tables.CharacterBreak.Get(Cfg.RoleID, breakLevel);
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(breakcfg.WeaponId);
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
else
{
var result = (weaponConfig.AttackPower * WeaponDegree(level));
return Mathf.RoundToInt(result);
}
}
}
/// <summary>
/// 武器熟练度
/// </summary>
/// <returns></returns>
public float WeaponDegree(int level = -1)
{
if (level == -1)
level = (int)Level;
var mCharacterLevelExpCfg = TableManager.Instance.Tables.CharacterLevelUp;
var CharacterLevelupTemplate = Cfg.LevelUpTemplate;
if (CharacterLevelupTemplate == 0)
{
DebugUtil.LogWarning("没有配置该角色等级模板:{0},自动使用默认模板", Cfg.RoleID);
CharacterLevelupTemplate = 1;
}
var levelCfg = mCharacterLevelExpCfg.Get(CharacterLevelupTemplate, level);
if (levelCfg == null)
{
DebugUtil.LogError("CharacterLevelUp表{0}模板不包含{1}等级的defence配置", Cfg.LevelUpTemplate, level);
return Cfg.WeaponDegree;
}
else
{
return levelCfg.WeaponDegree;
}
}
/// <summary>
/// 武器掌握度,受觉醒影响
/// </summary>
/// <returns></returns>
public float WeaponGrasp()
{
if (_awakeCfg != null)
{
return _awakeCfg.WeaponGrasp;
}
return 0;
}
private int ArmorAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Shield;
}
return 0;
}
private int ArmorBreakLvUp()
{
return _breakCfg.Shield;
}
public float Armor()
{
return ArmorLevelUp((int)Level);
}
/// <summary>
/// 指定等级护盾值
/// </summary>
/// <param name="level"></param>
/// <returns></returns>
public int ArmorLevelUp(int level)
{
var mCharacterLevelExpCfg = TableManager.Instance.Tables.CharacterLevelUp;
var CharacterLevelupTemplate = Cfg.LevelUpTemplate;
if (CharacterLevelupTemplate == 0)
{
DebugUtil.LogWarning("没有配置该角色等级模板:{0},自动使用默认模板", Cfg.RoleID);
CharacterLevelupTemplate = 1;
}
var levelCfg = mCharacterLevelExpCfg.Get(CharacterLevelupTemplate, level);
if (levelCfg == null)
{
DebugUtil.LogError("CharacterLevelUp表{0}模板不包含{1}等级的defence配置", Cfg.LevelUpTemplate, level);
return Cfg.Shield;
}
else
{
var shield = levelCfg.Shield * Cfg.Shield;
return Mathf.RoundToInt(shield);
}
}
//private float LevelUpArmor()
//{
// return Cfg.ShieldLevelUpTemplate[Level - 1];
//}
private int DenfenceBreakLvUp()
{
if (_breakCfg != null)
return _breakCfg.Defence;
return 0;
}
private int DenfenceAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Defence;
}
return 0;
}
public int Defence()
{
return DefenceLevelUp((int)Level) + DenfenceAwakeLvUp() + DenfenceBreakLvUp();
}
public int DefenceLevelUp(int level)
{
var mCharacterLevelExpCfg = TableManager.Instance.Tables.CharacterLevelUp;
var CharacterLevelupTemplate = Cfg.LevelUpTemplate;
if (CharacterLevelupTemplate == 0)
{
DebugUtil.LogWarning("没有配置该角色等级模板:{0},自动使用默认模板", Cfg.RoleID);
CharacterLevelupTemplate = 1;
}
var levelCfg = mCharacterLevelExpCfg.Get(CharacterLevelupTemplate, level);
if (levelCfg == null)
{
DebugUtil.LogError("CharacterLevelUp表{0}模板不包含{1}等级的defence配置", Cfg.LevelUpTemplate, level);
return Cfg.Defence;
}
else
{
var result = levelCfg.Defence * Cfg.Defence;
return Mathf.RoundToInt(result);
}
}
public float Corrage()
{
// 最大士气值
return Cfg.MaxMorale;
}
/// <summary>
/// 弹夹容量
/// </summary>
/// <returns></returns>
public int BulletCapacity()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.MaxBulletCount;
}
/// <summary>
/// 换弹时间
/// </summary>
/// <returns></returns>
public float ChangeBulletTime()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.ReloadTime;
}
/// <summary>
/// 攻击轮次,每次攻击多少轮进入一次攻击间隔
/// </summary>
/// <returns></returns>
public int AttackLoopCount()
{
return Cfg.AttackLoopCount;
}
/// <summary>
/// 射速,每秒开几枪
/// </summary>
/// <returns></returns>
public float ShootSpeed()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.ShootSpeed;
}
/// <summary>
/// 攻击校准时间(后摇时间)
/// </summary>
/// <returns></returns>
public float AttackEndTime()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.AttackEndTime;
}
/// <summary>
/// 攻击范围,单位:格子
/// </summary>
/// <returns></returns>
public int AttackDistance()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.AttackDistance;
}
private float SpeedAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.Speed;
}
return 0;
}
float SpeedBreakLvUp()
{
if (_breakCfg != null)
return _breakCfg.Speed;
return 0;
}
public float MoveSpeed()
{
return Cfg.Speed + SpeedBreakLvUp() + SpeedAwakeLvUp();
}
public int WeaponId()
{
if (_breakCfg == null || _breakCfg.WeaponId == 0)
{
return Cfg.WeaponId;
}
return _breakCfg.WeaponId;
}
public float YaZhi()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.MoraleDamage;
}
/// <summary>
/// 对人形伤害缩放
/// </summary>
/// <returns></returns>
public float DamageScaleToHuman()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.DamageScaleForHuman;
}
/// <summary>
/// 对载具伤害缩放
/// </summary>
/// <returns></returns>
public float DamageScaleToCarrier()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.DamageScaleForVehicle;
}
/// <summary>
/// 对建筑伤害缩放
/// </summary>
/// <returns></returns>
public float DamageScaleToBuilding()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 0;
}
return weaponConfig.DamageScaleForBuilding;
}
/// <summary>
/// 对血量伤害缩放
/// </summary>
/// <returns></returns>
public float DamageScaleToHp()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 1f;
}
return weaponConfig.DamageScaleForHp;
}
public float DamageScaleToShiled()
{
var weaponConfig = TableManager.Instance.Tables.WeaponConfig.Get(WeaponId());
if (weaponConfig == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + WeaponId());
return 1f;
}
return weaponConfig.DamageScaleForShiled;
}
private float CriticalDamageAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.CriticalDamage;
}
return 0;
}
public float CriticalDamage()
{
return Cfg.CriticalDamage + _breakCfg.CriticalDamage + CriticalDamageAwakeLvUp();
}
private float CriticalRatioAwakeLvUp()
{
if (_awakeCfg != null)
{
return _awakeCfg.CriticalRatio;
}
return 0;
}
public float CriticalRatio()
{
return Cfg.CriticalRatio + _breakCfg.CriticalRatio + CriticalRatioAwakeLvUp();
}
public string CharacterBelong()
{
var factionCfg = TableManager.Instance.Tables.FactionAttri.Get((int)CommonUtils.GetEfactionByCfg(Cfg));
StringBuilder sb = new StringBuilder();
if (factionCfg == null)
{
DebugUtil.LogError($"势力配置为空RoleID:{ID}");
}
else
sb.Append(CommonUtils.GetLocalizeText(E_LocalizePrefix.faction, (int)CommonUtils.GetEfactionByCfg(Cfg)));
Army armyData = CommonUtils.GetArmyByCfg(Cfg);
var armyCfg = TableManager.Instance.Tables.ArmyAttri.Get((int)armyData);
if (armyCfg == null)
{
DebugUtil.LogError($"部队配置为空RoleID:{ID}");
}
else
sb.Append(sb.Length > 0 ? "-" : "").Append(CommonUtils.GetLocalizeText(E_LocalizePrefix.army, (int)armyData));
return sb.ToString();
}
public void AddLikeLyEXPInfo(int exp)
{
SetLikelyLv();
}
private void SetLikelyLv()
{
}
public bool IsMaxBreak()
{
if ((GetBreakPassiveId() == 0) || BreakLevel >= GetMaxBreakLevel())
{
return true;
}
return false;
}
public bool IsMaxAwake()
{
if ((GetAwakePassiveId() == 0) || AwakeLevel >= GetMaxAwakeLevel())
{
return true;
}
return false;
}
/// <summary>
/// 是否满好感度
/// </summary>
/// <returns></returns>
public bool IsMaxLikely()
{
return LikelyLevel >= GetMaxLikelyLevel();
}
public int GetMaxLikelyLevel()
{
int maxLevel = 0;
CharacterLikability likelyCfg = TableManager.Instance.Tables.CharacterLikability;
for (int i = 0; i < likelyCfg.DataList.Count; i++)
{
if (likelyCfg.DataList[i].RoleID == ID && likelyCfg.DataList[i].LikabilityLevel > maxLevel)
maxLevel = likelyCfg.DataList[i].LikabilityLevel;
}
return maxLevel;
}
public int GetMaxBreakLevel()
{
int maxLevel = 0;
CharacterBreak breakCfg = TableManager.Instance.Tables.CharacterBreak;
for (int i = 0; i < breakCfg.DataList.Count; i++)
{
if (breakCfg.DataList[i].RoleID == ID)
{
if (breakCfg.DataList[i].BreakLevel > maxLevel)
{
maxLevel = breakCfg.DataList[i].BreakLevel;
}
}
}
return maxLevel;
}
public int GetMaxAwakeLevel()
{
int maxLevel = 0;
CharacterAwaking breakCfg = TableManager.Instance.Tables.CharacterAwaking;
for (int i = 0; i < breakCfg.DataList.Count; i++)
{
if (breakCfg.DataList[i].RoleID == ID)
{
if (breakCfg.DataList[i].AwakingLevel > maxLevel)
{
maxLevel = breakCfg.DataList[i].AwakingLevel;
}
}
}
return maxLevel;
}
public int GetMaxUltralSkillLevel()
{
int maxSkillLevel = 0;
CharacterSkillLevel cfg = TableManager.Instance.Tables.CharacterSkillLevel;
for (int i = 0; i < cfg.DataList.Count; i++)
{
if (cfg.DataList[i].RoleID == ID)
{
if (cfg.DataList[i].SkillLevel > maxSkillLevel)
{
maxSkillLevel = cfg.DataList[i].SkillLevel;
}
}
}
return maxSkillLevel;
}
public string GetWholeHeadPath(int Skinindex = -1)
{
if (Skinindex == -1)
Skinindex = GLConfig.Inst.data.DEFAULTSKINID;
return CommonUtils.GetCharacterPicPath(Cfg.RoleID, CommonUtils.ECharacterPicPathType.HeadPic, Skinindex);//CommonUtils.GetWholeHeadPath(TableManager.Instance.Tables.SkinCfg.Get(Skinindex, Cfg.RoleID).PIcHeadPath);
}
public string PrefabPath =>
PathEx.GetCharacterDisplayModelPath(Cfg.NameID);
public string WeaponName()
{
DataWeapon dataWeapon = TableManager.Instance.Tables.WeaponConfig.Get(Cfg.WeaponId);
if (dataWeapon == null)
{
DebugUtil.LogError("武器id为{0}的武器没配" + Cfg.WeaponId);
return Cfg.WeaponId.ToString();
}
return CommonUtils.GetLocalizeText(E_LocalizePrefix.weapon, Cfg.WeaponId);//dataWeapon.Name
}
public void ConstructRedPointTree(int parentID)
{
//角色列表内节点,非叶子节点
_redPointNode = RedPointManager.Instance.AddDynamicNode
(cfg.RedPoint.NodeType.Character,
parentID,
new List<int>() { (int)ID, (int)RedPointNodeCharacter.CharacterType.Equip }) as RedPointNodeCharacter;
//此处添加角色所需要的所有红点节点,如觉醒,突破,技能等,挂在角色节点下
#region 觉醒红点
characterAwakingNode = RedPointManager.Instance.AddDynamicNode
(cfg.RedPoint.NodeType.Character,
_redPointNode.ID,
new List<int>() { (int)ID, (int)RedPointNodeCharacter.CharacterType.Awaking }) as RedPointNodeCharacter;
#endregion
if (_redPointNode == null)
DebugUtil.LogError("_redPointNode is null");
if (characterAwakingNode == null)
{
DebugUtil.LogError("characterAwakingNode is null");
}
}
public void ConstructRedPointTree(RedPointNode parent)
{
throw new System.NotImplementedException();
}
public void ForceSetCfg(DataCharacterAttri cfg)
{
_cfg = cfg;
}
}