NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/Utils/CharacterDataHelper.cs

237 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using Framework;
using Gameplay.Unit.Data;
using Gameplay.Utils;
using UnityEngine;
namespace Gameplay.Character.Utils
{
public static class CharacterDataHelper
{
public static int GetCharacterSkillId(CharacterDataInfo characterInfo)
{
var skillLevelInfo = TableManager.Instance.Tables.CharacterSkillLevel.Get(characterInfo.Cfg.RoleID, (int)characterInfo.UltraSkillLevel);
if (skillLevelInfo == null)
{
DebugUtil.LogError($"角色ID:{characterInfo.Cfg.RoleID} 等级:{characterInfo.UltraSkillLevel} 无法找到对应的技能等级配置");
return 0;
}
var skillGroupId = skillLevelInfo.SkillGroupId;
var breakLevel = characterInfo.AwakeLevel;
var skillReferInfo = TableManager.Instance.Tables.SkillReferConfig.Get(skillGroupId);
var breakLevelIndex = (int)breakLevel;
var skillId = skillReferInfo.SkillIds[^1];
if (breakLevelIndex < 0 || breakLevelIndex >= skillReferInfo.SkillIds.Count)
{
DebugUtil.LogError("技能组ID:{0} 突破等级:{1} 无法找到对应的技能ID" , skillGroupId, breakLevel);
}
else
{
skillId = skillReferInfo.SkillIds[breakLevelIndex];
}
return skillId;
}
public static CharacterConfigData CombineConfigData(int npcId,
int npcLevel)
{
var monsterConfig = TableManager.Instance.Tables.Monster.Get(npcId);
var monsterTConfig = TableManager.Instance.Tables.MonsterClass.Get(monsterConfig.MonsterClassID);
var monsterLevelConfig = TableManager.Instance.Tables.MonsterLevelUp.Get(npcLevel);
var configData = new CharacterConfigData();
configData.debugShowInfo = new DebugShowInfo();
configData.debugShowInfo.name = monsterTConfig.Name;
configData.debugShowInfo.iconPath = "";
configData.debugShowInfo.configId = "MonsterClass@" + monsterTConfig.MonsterClassID;
configData.level = npcLevel;
configData.attack = Mathf.CeilToInt(monsterTConfig.Attack * monsterConfig.AttackFix * monsterLevelConfig.AttackLevelUpTemplate);
var shootCd = 1f / monsterTConfig.ShootSpeed;
configData.shootCD = shootCd;
configData.firstShootTime = monsterTConfig.FirstShootTime;
configData.maxBulletCount = monsterTConfig.ManagazinContain;
configData.reloadTime = monsterTConfig.ChangeBulletTime;
configData.defense = Mathf.CeilToInt(monsterTConfig.Defence * monsterConfig.DefenceFix * monsterLevelConfig.DefenceLevelUpTemplate);
configData.defenseScale = monsterTConfig.DefenceStatusPara;
configData.maxHp = Mathf.CeilToInt(monsterTConfig.Hp * monsterConfig.HPFix * monsterLevelConfig.HpLevelUpTemplate);
configData.maxShield = Mathf.CeilToInt(monsterTConfig.Shield * monsterConfig.ShieldFix * monsterLevelConfig.ShieldLevelUpTemplate);
configData.moveSpeed = monsterTConfig.Speed;
configData.retreatSpeed = monsterTConfig.RetreatSpeed;
configData.shootDistance = monsterTConfig.ShootRange;
configData.moraleAttack = monsterTConfig.YaZhi;
configData.initMorale = monsterTConfig.MaxMorale;
configData.maxMorale = monsterTConfig.MaxMorale;
configData.suppressMorale = monsterTConfig.SuppressMorale;
configData.retreatMorale = monsterTConfig.RetreatMorale;
configData.moraleRecover = (int)monsterTConfig.CorrageRecover;
configData.damagePepoleScale = monsterTConfig.DamageToHuman;
configData.damageCarsScale = monsterTConfig.DamageToCarrier;
configData.criticalRate = monsterTConfig.CriticalRatio;
configData.criticalScale = monsterTConfig.CriticalDamage;
configData.moveShootType = monsterTConfig.MoveShootType;
configData.breakShootType = (int)monsterTConfig.ShootMode;
configData.perShootCount = monsterTConfig.PerShootCount;
configData.skillId = monsterTConfig.SkillId;
configData.turnSpeed = monsterTConfig.TurnSpeed;
configData.job = monsterTConfig.Job;
configData.faction = monsterTConfig.Fraction;
configData.rarity = 0;
// configData.modelPath = monsterTConfig.PrefabPath;
configData.weaponId = monsterTConfig.WeaponId;
configData.crossLevel = monsterTConfig.MoveCrossLevel;
configData.standLevel = monsterTConfig.StandCrossLevel;
configData.findEnemyRange = monsterConfig.FindEnemyRange;
configData.eyeBrowsType = monsterTConfig.EmojiEyeBowsType;
configData.eyeBrowColor = monsterTConfig.EmojiEyeBowsColor;
configData.eyesColor = monsterTConfig.EmojiEyesColor;
configData.attackShiledScale = monsterTConfig.AttackShiledScale;
configData.attackHpScale = monsterTConfig.AttackHpScale;
configData.nameId = monsterTConfig.NameId;
configData.isAttackIgnoreBlock = monsterTConfig.AttackIgnoreBlock;
// TODO: 目前没有怪物的被动技能
configData.breakPassiveSkillId = 0;
configData.awakePassiveSkillId = 0;
for (int i = 0; i < monsterTConfig.PassiveBuffIds.Count; i++)
{
var buffId = monsterTConfig.PassiveBuffIds[i];
configData.passiveBuffIds.Add(buffId);
}
return configData;
}
public static CharacterConfigData CombineConfigData(CharacterDataInfo characterInfo)
{
var cId = characterInfo.Cfg.RoleID;
var characterData = TableManager.Instance.Tables.CharacterAttri.Get(cId);
var fakeLevel = (int)characterInfo.Level;
var levelIndex = fakeLevel - 1;
var attackDataList = characterData.Attack;
var defenceDataList = characterData.Defence;
var hpDataList = characterData.Hp;
var shieldDataList = characterData.Shield;
if (levelIndex >= attackDataList.Count)
{
DebugUtil.LogError("角色ID:{0} 等级:{1} 无法找到对应的等级配置", cId, fakeLevel);
throw new Exception("角色等级配置错误");
}
var levelAttack = attackDataList[levelIndex];
var levelDefence = defenceDataList[levelIndex];
var levelHp = hpDataList[levelIndex];
var levelShield = shieldDataList[levelIndex];
var skillId = GetCharacterSkillId(characterInfo);
var configData = new CharacterConfigData();
configData.cfgId = cId;
configData.level = fakeLevel;
configData.attack = levelAttack;
var shootCd = 1f / characterData.ShootSpeed;
configData.shootCD = shootCd;
configData.firstShootTime = characterData.FirstShootTime;
configData.maxBulletCount = characterData.ManagazinContain;
configData.reloadTime = characterData.ChangeBulletTime;
configData.defense = levelDefence;
configData.defenseScale = characterData.DefenceStatusPara;
configData.maxHp = levelHp;
configData.maxShield = levelShield;
configData.moveSpeed = characterData.Speed;
configData.retreatSpeed = characterData.RetreatSpeed;
configData.shootDistance = characterData.ShootRange;
// TODO: 角色单位使用攻击距离作为索敌距离
configData.findEnemyRange = characterData.ShootRange;
configData.moraleAttack = (int)characterData.YaZhi;
configData.initMorale = characterData.MaxMorale;
configData.maxMorale = characterData.MaxMorale;
configData.suppressMorale = characterData.SuppressMorale;
configData.retreatMorale = characterData.RetreatMorale;
configData.moraleRecover = (int)characterData.CorrageRecover;
configData.damagePepoleScale = characterData.DamageToHuman;
configData.damageCarsScale = characterData.DamageToCarrier;
configData.criticalRate = characterData.CriticalRatio;
configData.criticalScale = characterData.CriticalDamage;
configData.moveShootType = characterData.MoveShootType;
configData.breakShootType = (int)characterData.ShootMode;
configData.perShootCount = characterData.PerShootCount;
configData.skillId = skillId;
configData.turnSpeed = characterData.TurnSpeed;
configData.job = characterData.Job;
configData.faction = characterData.Fraction;
configData.rarity = characterData.StartStar;
var skinId = (int)characterInfo.SkinID;
var skinConfig = TableManager.Instance.Tables.SkinCfg.Get(skinId, characterData.RoleID);
if (skinConfig == null)
{
DebugUtil.LogError($"{characterData.NameRead} 无有效皮肤配置: {skinId}");
configData.nameId = characterData.NameID;
}
else
{
configData.nameId = skinConfig.NameID;
}
configData.weaponId = characterData.WeaponId;
configData.crossLevel = characterData.MoveCrossLevel;
configData.standLevel = characterData.StandCrossLevel;
configData.boundTags = new List<int>();
configData.boundTags.Add((int)characterData.Fraction);
configData.shiledRecoverDelay = characterData.ShieldRecoverDelay;
configData.shieldRecoverFix = characterData.ShiledRecoverValueFixed;
configData.shiledRecoverPercent = characterData.ShiledRecoverValuePercent;
configData.overflowShield = characterData.OverFlowShiledMax;
configData.hpRecoverDelay = characterData.HPRecoverDelay;
configData.hpRecoverFix = characterData.HPRecoverValueFixed;
configData.hpRecoverPercent = characterData.HPRecoverValuePercent;
configData.attackShiledScale = characterData.AttackShiledScale;
configData.attackHpScale = characterData.AttackHpScale;
configData.eyeBrowsType = characterData.EmojiEyeBowsType;
configData.eyesColor = characterData.EmojiEyesColor;
configData.eyeBrowColor = characterData.EmojiEyeBowsColor;
configData.isAttackIgnoreBlock = characterData.AttackIgoreBlock;
if (characterInfo.BreakCfg == null)
{
configData.breakPassiveSkillId = 0;
DebugUtil.LogError("角色ID:{0} 突破配置为空, 当前突破等级: {1}", cId, characterInfo.BreakLevel);
}
else
{
configData.breakPassiveSkillId = characterInfo.BreakCfg.PassiveSkillID;
}
if (characterInfo.AwakeCfg == null)
{
configData.awakePassiveSkillId = 0;
DebugUtil.LogError("角色ID:{0} 觉醒配置为空, 当前觉醒等级: {1}", cId, characterInfo.AwakeLevel);
}
else
{
configData.awakePassiveSkillId = characterInfo.AwakeCfg.PassiveSkillID;
}
configData.debugShowInfo = new DebugShowInfo();
configData.debugShowInfo.name = characterData.NameRead;
// Assets/Art/UI/Texture/Icon/HeadPic/Icon_HeadPic_A00001.png
configData.debugShowInfo.iconPath = skinConfig == null ? "Null" : skinConfig.PIcHeadPath;
configData.debugShowInfo.iconPath = $"Assets/Art/UI/Texture/Icon/HeadPic/{configData.debugShowInfo.iconPath}.png";
configData.debugShowInfo.configId = "CharacterDefault@" + cId;
configData.debugShowInfo.cacheConfigId = characterInfo.Cfg.RoleID;
return configData;
}
}
}