1320 lines
42 KiB
C#
1320 lines
42 KiB
C#
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;
|
||
}
|
||
}
|