using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Linq;
|
using UnityEngine;
|
using LitJson;
|
|
|
//!单英雄查看战力 只算自己的上阵属性 不算羁绊 总上阵属性 光环
|
// 战力的计算方式
|
// 先算上阵的单武将战力按公式一一算出各个属性(基础/战斗),再把算出来的各个属性代入到战力公式
|
// 所有武将战力加起来 + 技能战力汇总(公式)就是整个号的战力
|
public class FightPowerManager : Singleton<FightPowerManager>
|
{
|
// 属性变量常量
|
private const string LV_VALUE = "lvValue";
|
private const string EQUIP_VALUE = "equipValue";
|
private const string BOOK_VALUE = "bookValue";
|
private const string BOOK_PER = "bookPer";
|
private const string REALM_VALUE = "realmValue";
|
private const string REALM_PER = "realmPer";
|
private const string GUBAO_VALUE = "gubaoValue";
|
private const string GUBAO_PER = "gubaoPer";
|
private const string HJG_VALUE = "hjgValue";
|
private const string HJG_PER = "hjgPer";
|
private const string HORSE_VALUE = "horseValue";
|
private const string HORSE_PER = "horsePer";
|
private const string BEAUTY_VALUE = "beautyValue";
|
private const string BEAUTY_PER = "beautyPer";
|
private const string FATES_VALUE = "fatesValue";
|
private const string FATES_PER = "fatesPer";
|
private const string LINEUP_HALO_VALUE = "lineupHaloValue";
|
private const string LINEUP_HALO_PER = "lineupHaloPer";
|
private const string INHERIT_PER = "inheritPer";
|
private const string HERO_SELF_VALUE = "heroSelfValue";
|
private const string HERO_SELF_PER = "heroSelfPer";
|
private const string STAR_TALENT_VALUE = "starTalentValue";
|
private const string STAR_TALENT_PER = "starTalentPer";
|
private const string BREAK_LV_VALUE = "breakLVValue";
|
private const string BREAK_LV_PER = "breakLVPer";
|
private const string AWAKE_TALENT_VALUE = "awakeTalentValue";
|
private const string AWAKE_TALENT_PER = "awakeTalentPer";
|
private const string FETTER_VALUE = "fetterValue";
|
private const string FETTER_PER = "fetterPer";
|
private const string HERO_LV_VALUE = "heroLVValue";
|
private const string HERO_LV_PER = "heroLVPer";
|
private const string HERO_CARDPER = "cardPer";
|
|
// 战力变量常量
|
private const string ATK_RATIO = "AtkRatio";
|
private const string MAX_HP_RATIO = "MaxHPRatio";
|
private const string DEF_RATIO = "DefRatio";
|
private const string STUN_RATE_RATIO = "StunRateRatio";
|
private const string SUPER_HIT_RATE_RATIO = "SuperHitRateRatio";
|
private const string COMBO_RATE_RATIO = "ComboRateRatio";
|
private const string MISS_RATE_RATIO = "MissRateRatio";
|
private const string PARRY_RATE_RATIO = "ParryRateRatio";
|
private const string SUCK_HP_PER_RATIO = "SuckHPPerRatio";
|
private const string STUN_RATE_DEF_RATIO = "StunRateDefRatio";
|
private const string SUPER_HIT_RATE_DEF_RATIO = "SuperHitRateDefRatio";
|
private const string COMBO_RATE_DEF_RATIO = "ComboRateDefRatio";
|
private const string MISS_RATE_DEF_RATIO = "MissRateDefRatio";
|
private const string PARRY_RATE_DEF_RATIO = "ParryRateDefRatio";
|
private const string SUCK_HP_PER_DEF_RATIO = "SuckHPPerDefRatio";
|
private const string NORMAL_SKILL_PER_RATIO = "NormalSkillPerRatio";
|
private const string NORMAL_SKILL_PER_DEF_RATIO = "NormalSkillPerDefRatio";
|
private const string ANGER_SKILL_PER_RATIO = "AngerSkillPerRatio";
|
private const string ANGER_SKILL_PER_DEF_RATIO = "AngerSkillPerDefRatio";
|
private const string SUPER_DAM_PER_RATIO = "SuperDamPerRatio";
|
private const string SUPER_DAM_PER_DEF_RATIO = "SuperDamPerDefRatio";
|
private const string SHIELD_PER_RATIO = "ShieldPerRatio";
|
private const string SHIELD_PER_DEF_RATIO = "ShieldPerDefRatio";
|
private const string DOT_PER_RATIO = "DOTPerRatio";
|
private const string DOT_PER_DEF_RATIO = "DOTPerDefRatio";
|
private const string WEI_FINAL_DAM_PER_RATIO = "WeiFinalDamPerRatio";
|
private const string WEI_FINAL_DAM_PER_DEF_RATIO = "WeiFinalDamPerDefRatio";
|
private const string SHU_FINAL_DAM_PER_RATIO = "ShuFinalDamPerRatio";
|
private const string SHU_FINAL_DAM_PER_DEF_RATIO = "ShuFinalDamPerDefRatio";
|
private const string WU_FINAL_DAM_PER_RATIO = "WuFinalDamPerRatio";
|
private const string WU_FINAL_DAM_PER_DEF_RATIO = "WuFinalDamPerDefRatio";
|
private const string QUN_FINAL_DAM_PER_RATIO = "QunFinalDamPerRatio";
|
private const string QUN_FINAL_DAM_PER_DEF_RATIO = "QunFinalDamPerDefRatio";
|
private const string FINAL_DAM_PER_RATIO = "FinalDamPerRatio";
|
private const string FINAL_DAM_PER_DEF_RATIO = "FinalDamPerDefRatio";
|
private const string PHY_DAM_PER_RATIO = "PhyDamPerRatio";
|
private const string PHY_DAM_PER_DEF_RATIO = "PhyDamPerDefRatio";
|
private const string MAG_DAM_PER_RATIO = "MagDamPerRatio";
|
private const string MAG_DAM_PER_DEF_RATIO = "MagDamPerDefRatio";
|
private const string CURE_PER_RATIO = "CurePerRatio";
|
private const string CURE_PER_DEF_RATIO = "CurePerDefRatio";
|
private const string PVP_DAM_PER_RATIO = "PVPDamPerRatio";
|
private const string PVP_DAM_PER_DEF_RATIO = "PVPDamPerDefRatio";
|
private const string PLAYER_LV = "PlayerLV";
|
private const string OFFICIAL_LV = "OfficialLV";
|
private const string SKILL_POWER = "SkillPower";
|
|
|
|
Dictionary<string, double> propertyVariables = new Dictionary<string, double>();
|
Dictionary<string, double> fightPowerVariables = new Dictionary<string, double>(); //总战力中的单武将战力
|
List<PlayerPropertyConfig> pConfig = new List<PlayerPropertyConfig>();
|
public FightPowerManager()
|
{
|
// 数值1:基础三维属性计算公式
|
// 数值2:战斗属性/战斗抗性/特殊属性计算公式
|
// 数值3:属性战力计算公式,计算参数详见 S.属性条目配置
|
pConfig = PlayerPropertyConfig.GetValues();
|
JaceCalculator.Init();
|
}
|
|
#region 初始化战力计算的信息
|
TeamType teamTypeCalc = TeamType.Story; //不同阵容战力不同
|
bool isPreviewTeamPower; //预览阵容(队伍)战力
|
int dropIndexCalc = -1; //掉落装备在阵容的索引,用于预览战力对比
|
|
//计算阵容战力,装备对比等情况需要代入
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="teamType">阵容类型</param>
|
/// <param name="dropindex">掉落装备的索引,-1代表不替换计算</param>
|
/// <param name="ispreview">预览阵容战力</param>
|
public void InitFightPowerParam(TeamType teamType = TeamType.Story, int dropindex = -1, bool ispreview = false)
|
{
|
teamTypeCalc = teamType;
|
isPreviewTeamPower = ispreview;
|
|
dropIndexCalc = dropindex;
|
#if UNITY_EDITOR
|
// Debug.Log("战力:初始化参数 dropIndex:" + dropIndexCalc + " 阵型:" + teamTypeCalc + " ispreview:" + ispreview);
|
#endif
|
}
|
#endregion
|
|
|
|
#region 先计算所有功能的汇总属性
|
|
//功能属性 类型:值
|
public Dictionary<int, int> lvAttrs = new Dictionary<int, int>(); //等级属性
|
public Dictionary<int, int> officialAttrs = new Dictionary<int, int>(); //官职属性
|
|
//分开存储预览和 真实属性
|
public Dictionary<int, int> equipAttrs = new Dictionary<int, int>(); //装备属性
|
// public Dictionary<string, int> lineUpPerDict = new Dictionary<string, int>(); //阵容属性加成
|
public Dictionary<int, int> countryAttrs = new Dictionary<int, int>(); //阵容国家(光环)属性
|
|
float allHeroAddPer = 0; //所有武将加成
|
|
//等级属性
|
void RefreshLVAttrs()
|
{
|
lvAttrs.Clear();
|
var playerLVConfig = PlayerLVConfig.Get(PlayerDatas.Instance.baseData.LV);
|
foreach (var attrType in PlayerPropertyConfig.baseAttrs)
|
{
|
lvAttrs[attrType] = GetPlayerLVValue(playerLVConfig, attrType);
|
}
|
#if UNITY_EDITOR
|
// Debug.Log("战力:等级属性 " + JsonMapper.ToJson(lvAttrs));
|
#endif
|
|
}
|
|
public int GetPlayerLVValue(PlayerLVConfig config, int type)
|
{
|
if (type == 6)
|
{
|
return config.Atk;
|
}
|
else if (type == 7)
|
{
|
return config.Def;
|
}
|
else if (type == 8)
|
{
|
return config.MaxHP;
|
}
|
return 0;
|
}
|
|
|
//官职属性
|
void RefreshOfficialAttrs()
|
{
|
officialAttrs.Clear();
|
var config = RealmConfig.Get(PlayerDatas.Instance.baseData.realmLevel);
|
for (int i = 0; i < config.AddAttrType.Length; i++)
|
{
|
var id = config.AddAttrType[i];
|
officialAttrs[id] = config.AddAttrNum[i];
|
}
|
#if UNITY_EDITOR
|
// Debug.Log("战力:官职属性 " + JsonMapper.ToJson(officialAttrs));
|
#endif
|
|
}
|
|
//装备属性:身上装备汇总
|
void RefrehEquipAttrs()
|
{
|
equipAttrs.Clear(); //身上装备属性重置
|
for (int i = 0; i < EquipModel.TotleEquip; i++)
|
{
|
var equip = EquipModel.Instance.GetEquip(i);
|
if (dropIndexCalc != -1)
|
{
|
var dropEquip = PackManager.Instance.GetItemByIndex(PackType.DropItem, dropIndexCalc);
|
if (dropEquip.config.EquipPlace - 1 == i)
|
{
|
equip = dropEquip; //替换计算总战力
|
}
|
}
|
if (equip == null)
|
{
|
continue;
|
}
|
var baseIDAttrs = EquipModel.Instance.GetEquipBaseAttrs(equip);
|
var baseVauleAttrs = EquipModel.Instance.GetEquipBaseValues(equip);
|
if (baseIDAttrs != null)
|
{
|
for (int j = 0; j < baseIDAttrs.Count; j++)
|
{
|
if (!equipAttrs.ContainsKey(baseIDAttrs[j]))
|
{
|
equipAttrs[baseIDAttrs[j]] = baseVauleAttrs[j];
|
}
|
else
|
{
|
equipAttrs[baseIDAttrs[j]] += baseVauleAttrs[j];
|
}
|
}
|
}
|
|
var fightIDAttrs = EquipModel.Instance.GetEquipFightAttrs(equip);
|
var fightValueAttrs = EquipModel.Instance.GetEquipFightValues(equip);
|
if (fightIDAttrs != null)
|
{
|
for (int j = 0; j < fightIDAttrs.Count; j++)
|
{
|
if (!equipAttrs.ContainsKey(fightIDAttrs[j]))
|
{
|
equipAttrs[fightIDAttrs[j]] = fightValueAttrs[j];
|
}
|
else
|
{
|
equipAttrs[fightIDAttrs[j]] += fightValueAttrs[j];
|
}
|
}
|
}
|
}
|
|
#if UNITY_EDITOR
|
// Debug.Log("战力:装备属性 " + JsonMapper.ToJson(equipAttrs));
|
#endif
|
}
|
|
// 计算队伍中上阵的所有武将的上阵属性 和 光环
|
void RefreshTeamAttrs()
|
{
|
//阵容属性
|
// 阵容:所有武将上阵属性
|
// lineUpPerDict = HeroUIManager.Instance.GetLineupPer(teamTypeCalc, isPreviewTeamPower);
|
allHeroAddPer = HeroUIManager.Instance.GetAllHeroPer() / 10000.0f;
|
#if UNITY_EDITOR
|
// Debug.Log("战力:上阵属性 " + JsonMapper.ToJson(lineUpPerDict));
|
#endif
|
// 阵容:国家(光环)属性
|
countryAttrs = HeroUIManager.Instance.GetCountryAttrs(teamTypeCalc, isPreviewTeamPower);
|
#if UNITY_EDITOR
|
// Debug.Log("战力:国家(光环)属性 " + JsonMapper.ToJson(countryAttrs));
|
#endif
|
}
|
|
#endregion
|
|
//单属性公式分基础三维和战斗属性
|
// 【主公属性】
|
// 等级属性 lvValue
|
// 装备属性 equipValue
|
// 图鉴属性 bookValue 、 bookPer
|
|
// 【阵容属性】 - 该阵容所有武将有效
|
// 初始加成 lineupInitAddPer
|
// 升级加成 lineupLVAddPer
|
// 突破加成 lineupBreakLVAddPer
|
// 吞噬加成 lineupStarAddPer
|
// 阵容光环 lineupHaloValue 、 lineupHaloPer
|
|
// 【武将属性】
|
// 继承比例 inheritPer
|
// 自身属性 heroSelfValue 、 heroSelfPer
|
// 吞噬属性 starTalentValue 、 starTalentPer
|
// 突破属性 breakLVValue 、 breakLVPer
|
// 觉醒属性 awakeTalentValue 、 awakeTalentPer
|
// 羁绊属性 fetterValue 、 fetterPer
|
|
#region 属性公式
|
// 单基础属性计算
|
public double GetPropertyVaule(int attrType, HeroInfo hero, int type)
|
{
|
// propertyVariables.Clear();
|
|
propertyVariables[LV_VALUE] = lvAttrs.ContainsKey(attrType) ? lvAttrs[attrType] : 0;
|
propertyVariables[EQUIP_VALUE] = equipAttrs.ContainsKey(attrType) ? equipAttrs[attrType] : 0;
|
// propertyVariables[BOOK_VALUE] = 0;
|
propertyVariables[REALM_VALUE] = officialAttrs.ContainsKey(attrType) ? officialAttrs[attrType] : 0;
|
propertyVariables[REALM_PER] = GetOfficialPer(attrType) / 10000.0f;
|
// propertyVariables[BOOK_PER] = GetBookPer(attrType) / 10000.0f;
|
propertyVariables[GUBAO_VALUE] = 0;
|
propertyVariables[GUBAO_PER] = 0;
|
propertyVariables[HJG_VALUE] = PhantasmPavilionManager.Instance.GetAttrValue(attrType);
|
propertyVariables[HJG_PER] = PhantasmPavilionManager.Instance.GetAttrPer(attrType) / 10000.0f;
|
propertyVariables[HORSE_VALUE] = HorseManager.Instance.GetAttrValue(attrType);
|
propertyVariables[HORSE_PER] = HorseManager.Instance.GetAttrPer(attrType) / 10000.0f;
|
propertyVariables[BEAUTY_VALUE] = 0;
|
propertyVariables[BEAUTY_PER] = 0;
|
propertyVariables[FATES_VALUE] = 0;
|
propertyVariables[FATES_PER] = 0;
|
|
//全体卡牌加成
|
propertyVariables[HERO_CARDPER] = allHeroAddPer;
|
//!!!单武将战力预览的话需要排除队伍影响战力,只算武将自身的上阵属性
|
// propertyVariables[LINEUP_INIT_ADD_PER] = GetLineUpPer(attrType, LINEUP_INIT_ADD_PER) / 10000.0f;
|
// propertyVariables[LINEUP_LV_ADD_PER] = GetLineUpPer(attrType, LINEUP_LV_ADD_PER) / 10000.0f;
|
// propertyVariables[LINEUP_BREAK_LV_ADD_PER] = GetLineUpPer(attrType, LINEUP_BREAK_LV_ADD_PER) / 10000.0f;
|
// propertyVariables[LINEUP_STAR_ADD_PER] = GetLineUpPer(attrType, LINEUP_STAR_ADD_PER) / 10000.0f;
|
|
//阵容光环 三围百分比加成
|
propertyVariables[LINEUP_HALO_VALUE] = countryAttrs.ContainsKey(attrType) ? countryAttrs[attrType] : 0;
|
propertyVariables[LINEUP_HALO_PER] = GetCountryPer(attrType) / 10000.0f;
|
|
//武将属性
|
propertyVariables[INHERIT_PER] = hero.GetInheritAttrPer(attrType) / 10000.0f;
|
propertyVariables[HERO_SELF_VALUE] = hero.GetSelfAddValue(attrType);
|
propertyVariables[HERO_SELF_PER] = hero.GetSelfAddPer(attrType) / 10000.0f;
|
propertyVariables[STAR_TALENT_VALUE] = hero.GetTalentAttrValue(attrType);
|
propertyVariables[STAR_TALENT_PER] = hero.GetTalentAttrPer(attrType) / 10000.0f;
|
propertyVariables[BREAK_LV_VALUE] = hero.GetBreakAttrValue(attrType);
|
propertyVariables[BREAK_LV_PER] = hero.GetBreakAttrPer(attrType) / 10000.0f;
|
propertyVariables[AWAKE_TALENT_VALUE] = hero.GetAwakeAttrValue(attrType);
|
propertyVariables[AWAKE_TALENT_PER] = hero.GetAwakeAttrPer(attrType) / 10000.0f;
|
propertyVariables[FETTER_VALUE] = hero.GetFetterAttrValue(attrType);
|
propertyVariables[FETTER_PER] = hero.GetFetterAttrPer(attrType) / 10000.0f;
|
propertyVariables[HERO_LV_VALUE] = hero.GetHeroLVValue(attrType);
|
propertyVariables[HERO_LV_PER] = hero.GetHeroLVPer(attrType) / 10000.0f;
|
#if UNITY_EDITOR
|
//排除值为0的属性输出
|
// var tmpPropertyVariables = propertyVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value);
|
// if (!tmpPropertyVariables.IsNullOrEmpty())
|
// propertyStrForDebug += $"属性ID {attrType} - {JsonMapper.ToJson(tmpPropertyVariables)}";
|
#endif
|
if (type == 0)
|
return FightPowerFormula.GetBaseAttr(propertyVariables);
|
else
|
return FightPowerFormula.GetFightAttr(propertyVariables);
|
}
|
|
|
|
|
// int GetLineUpPer(int attrType, string key)
|
// {
|
// if (!PlayerPropertyConfig.baseAttrs.Contains(attrType))
|
// {
|
// return 0;
|
// }
|
|
// return lineUpPerDict[key];
|
// }
|
|
// int GetBookPer(int attrType)
|
// {
|
// if (!PlayerPropertyConfig.baseAttrs.Contains(attrType))
|
// {
|
// return 0;
|
// }
|
// return HeroUIManager.Instance.allHeroBookPer;
|
// }
|
|
int GetOfficialPer(int attrType)
|
{
|
if (PlayerPropertyConfig.baseAttr2perDict.ContainsKey(attrType))
|
{
|
var pertype = PlayerPropertyConfig.baseAttr2perDict[attrType];
|
return officialAttrs.ContainsKey(pertype) ? officialAttrs[pertype] : 0;
|
}
|
|
return 0;
|
}
|
|
int GetCountryPer(int attrType)
|
{
|
if (PlayerPropertyConfig.baseAttr2perDict.ContainsKey(attrType))
|
{
|
var pertype = PlayerPropertyConfig.baseAttr2perDict[attrType];
|
return countryAttrs.ContainsKey(pertype) ? countryAttrs[pertype] : 0;
|
}
|
|
return 0;
|
}
|
|
|
|
#endregion
|
|
|
#region 计算战力
|
//如果服务端战力计算有压力,可改成关键点结算(如同步排行榜跨服等),表现由客户端自己计算
|
//装备战力为最终总战力的结果比(提升整个角色总战力)
|
|
//计算总战力中的武将战力,几个武将加起来就是总战力,其他功能属性计算应该涵盖在英雄里
|
public long CalculatePower()
|
{
|
#if UNITY_EDITOR
|
// Debug.Log("战力:开始计算");
|
#endif
|
// --- 先计算所有功能的汇总属性 ---
|
RefreshLVAttrs();
|
RefreshOfficialAttrs();
|
RefrehEquipAttrs();
|
RefreshTeamAttrs();
|
|
// --- 算单武将功能属性战力 后相加---
|
long fightPower = 0;
|
var team = TeamManager.Instance.GetTeam(teamTypeCalc);
|
if (team == null)
|
{
|
return fightPower;
|
}
|
TeamHero[] teamHeroes = isPreviewTeamPower ? team.tempHeroes : team.serverHeroes;
|
foreach (var hero in teamHeroes)
|
{
|
if (hero == null)
|
{
|
continue;
|
}
|
HeroInfo heroInfo = HeroManager.Instance.GetHero(hero.guid);
|
if (heroInfo == null)
|
{
|
continue;
|
}
|
|
fightPower += CalculateTeamHeroPower(heroInfo);
|
|
}
|
|
// #if UNITY_EDITOR
|
// Debug.Log("战力:计算完毕 " + fightPower);
|
// #endif
|
return fightPower;
|
}
|
|
#if UNITY_EDITOR
|
string propertyStrForDebug = "";
|
#endif
|
|
//计算阵容中武将战力
|
public long CalculateTeamHeroPower(HeroInfo hero)
|
{
|
|
fightPowerVariables.Clear();
|
hero.RefreshFetterAttrsWhenCalcPower(teamTypeCalc); //羁绊属性要实时算
|
|
#if UNITY_EDITOR
|
propertyStrForDebug = "";
|
#endif
|
foreach (var config in pConfig)
|
{
|
if (config.showType < 1 || config.showType > 4)
|
{
|
continue;
|
}
|
if (config.showType == 1)
|
{
|
fightPowerVariables[config.Parameter] = Math.Round(GetPropertyVaule(config.ID, hero, 0), 3);
|
}
|
else
|
{
|
fightPowerVariables[config.Parameter] = Math.Round(GetPropertyVaule(config.ID, hero, 1), 3);
|
}
|
}
|
|
#if UNITY_EDITOR
|
// Debug.Log($"战力:武将ID {hero.heroId} 属性信息 {propertyStrForDebug}");
|
#endif
|
|
//属性系数根据官职等级的加成
|
var fightPowerRatioConfig = FightPowerRatioConfig.Get(PlayerDatas.Instance.baseData.realmLevel);
|
|
fightPowerVariables[ATK_RATIO] = fightPowerRatioConfig.AtkRatio;
|
fightPowerVariables[MAX_HP_RATIO] = fightPowerRatioConfig.MaxHPRatio;
|
fightPowerVariables[DEF_RATIO] = fightPowerRatioConfig.DefRatio;
|
fightPowerVariables[STUN_RATE_RATIO] = fightPowerRatioConfig.StunRateRatio;
|
fightPowerVariables[SUPER_HIT_RATE_RATIO] = fightPowerRatioConfig.SuperHitRateRatio;
|
fightPowerVariables[COMBO_RATE_RATIO] = fightPowerRatioConfig.ComboRateRatio;
|
fightPowerVariables[MISS_RATE_RATIO] = fightPowerRatioConfig.MissRateRatio;
|
fightPowerVariables[PARRY_RATE_RATIO] = fightPowerRatioConfig.ParryRateRatio;
|
fightPowerVariables[SUCK_HP_PER_RATIO] = fightPowerRatioConfig.SuckHPPerRatio;
|
fightPowerVariables[STUN_RATE_DEF_RATIO] = fightPowerRatioConfig.StunRateDefRatio;
|
fightPowerVariables[SUPER_HIT_RATE_DEF_RATIO] = fightPowerRatioConfig.SuperHitRateDefRatio;
|
fightPowerVariables[COMBO_RATE_DEF_RATIO] = fightPowerRatioConfig.ComboRateDefRatio;
|
fightPowerVariables[MISS_RATE_DEF_RATIO] = fightPowerRatioConfig.MissRateDefRatio;
|
fightPowerVariables[PARRY_RATE_DEF_RATIO] = fightPowerRatioConfig.ParryRateDefRatio;
|
fightPowerVariables[SUCK_HP_PER_DEF_RATIO] = fightPowerRatioConfig.SuckHPPerDefRatio;
|
fightPowerVariables[NORMAL_SKILL_PER_RATIO] = fightPowerRatioConfig.NormalSkillPerRatio;
|
fightPowerVariables[NORMAL_SKILL_PER_DEF_RATIO] = fightPowerRatioConfig.NormalSkillPerDefRatio;
|
fightPowerVariables[ANGER_SKILL_PER_RATIO] = fightPowerRatioConfig.AngerSkillPerRatio;
|
fightPowerVariables[ANGER_SKILL_PER_DEF_RATIO] = fightPowerRatioConfig.AngerSkillPerDefRatio;
|
fightPowerVariables[SUPER_DAM_PER_RATIO] = fightPowerRatioConfig.SuperDamPerRatio;
|
fightPowerVariables[SUPER_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.SuperDamPerDefRatio;
|
fightPowerVariables[SHIELD_PER_RATIO] = fightPowerRatioConfig.ShieldPerRatio;
|
fightPowerVariables[SHIELD_PER_DEF_RATIO] = fightPowerRatioConfig.ShieldPerDefRatio;
|
fightPowerVariables[DOT_PER_RATIO] = fightPowerRatioConfig.DOTPerRatio;
|
fightPowerVariables[DOT_PER_DEF_RATIO] = fightPowerRatioConfig.DOTPerDefRatio;
|
fightPowerVariables[WEI_FINAL_DAM_PER_RATIO] = fightPowerRatioConfig.WeiFinalDamPerRatio;
|
fightPowerVariables[WEI_FINAL_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.WeiFinalDamPerDefRatio;
|
fightPowerVariables[SHU_FINAL_DAM_PER_RATIO] = fightPowerRatioConfig.ShuFinalDamPerRatio;
|
fightPowerVariables[SHU_FINAL_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.ShuFinalDamPerDefRatio;
|
fightPowerVariables[WU_FINAL_DAM_PER_RATIO] = fightPowerRatioConfig.WuFinalDamPerRatio;
|
fightPowerVariables[WU_FINAL_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.WuFinalDamPerDefRatio;
|
fightPowerVariables[QUN_FINAL_DAM_PER_RATIO] = fightPowerRatioConfig.QunFinalDamPerRatio;
|
fightPowerVariables[QUN_FINAL_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.QunFinalDamPerDefRatio;
|
fightPowerVariables[FINAL_DAM_PER_RATIO] = fightPowerRatioConfig.FinalDamPerRatio;
|
fightPowerVariables[FINAL_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.FinalDamPerDefRatio;
|
fightPowerVariables[PHY_DAM_PER_RATIO] = fightPowerRatioConfig.PhyDamPerRatio;
|
fightPowerVariables[PHY_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.PhyDamPerDefRatio;
|
fightPowerVariables[MAG_DAM_PER_RATIO] = fightPowerRatioConfig.MagDamPerRatio;
|
fightPowerVariables[MAG_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.MagDamPerDefRatio;
|
fightPowerVariables[CURE_PER_RATIO] = fightPowerRatioConfig.CurePerRatio;
|
fightPowerVariables[CURE_PER_DEF_RATIO] = fightPowerRatioConfig.CurePerDefRatio;
|
fightPowerVariables[PVP_DAM_PER_RATIO] = fightPowerRatioConfig.PVPDamPerRatio;
|
fightPowerVariables[PVP_DAM_PER_DEF_RATIO] = fightPowerRatioConfig.PVPDamPerDefRatio;
|
|
long fightPower = (long)FightPowerFormula.GetFightPower(fightPowerVariables);
|
#if UNITY_EDITOR
|
//排除值为0的属性输出
|
// var tmpFightPowerVariables = fightPowerVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value);
|
// if (!tmpFightPowerVariables.IsNullOrEmpty())
|
// Debug.Log($"战力:武将ID {hero.heroId} 属性战力 {fightPower} 属性战力参数 {JsonMapper.ToJson(tmpFightPowerVariables)}");
|
#endif
|
|
//加上技能战力
|
fightPowerVariables.Clear();
|
fightPowerVariables[PLAYER_LV] = PlayerDatas.Instance.baseData.LV;
|
fightPowerVariables[OFFICIAL_LV] = PlayerDatas.Instance.baseData.realmLevel;
|
fightPowerVariables[SKILL_POWER] = hero.GetSkillsFightPower();
|
|
long skillPower = (long)FightPowerFormula.GetSkillsFightPower(fightPowerVariables);
|
|
#if UNITY_EDITOR
|
// Debug.Log($"战力:武将ID {hero.heroId} 技能战力 {skillPower} 技能参数 {JsonMapper.ToJson(fightPowerVariables)}");
|
|
// Debug.Log($"战力:武将ID {hero.heroId} 总战力 {fightPower + skillPower}");
|
#endif
|
|
return fightPower + skillPower;
|
}
|
|
|
|
/// <summary>
|
/// 和身上装备对比差
|
/// </summary>
|
/// <param name="item">地板装备</param>
|
/// <returns></returns>
|
public long GetFightPowerChange(ItemModel item)
|
{
|
InitFightPowerParam();
|
var fightPower = CalculatePower();
|
|
InitFightPowerParam(dropindex: item.gridIndex);
|
var tmpFightPower = CalculatePower();
|
return tmpFightPower - fightPower;
|
}
|
|
|
|
// 单英雄查看战力
|
// 1. 上阵英雄显示,在主线阵容下的战力
|
// 2. 非上阵或其他上阵阵容:上阵不足6个人的,按增加的方式的计算;人数满的情况下按替换6号位计算
|
public long GetHeroFightPower(HeroInfo heroInfo)
|
{
|
bool ispreview = false;
|
var team = TeamManager.Instance.GetTeam(TeamType.Story);
|
if (!team.HasHero(heroInfo.itemHero.guid))
|
{
|
//替换上阵位置
|
ispreview = true;
|
var index = team.GetEmptyPosition();
|
if (index < 0)
|
{
|
team.AddHero(heroInfo, 5, false);
|
}
|
else
|
{
|
team.AddHero(heroInfo, index, false);
|
}
|
}
|
|
InitFightPowerParam(ispreview: ispreview);
|
RefreshLVAttrs();
|
RefreshOfficialAttrs();
|
RefrehEquipAttrs();
|
RefreshTeamAttrs();
|
|
var fightPower = CalculateTeamHeroPower(heroInfo);
|
|
//计算完恢复队伍
|
if (ispreview)
|
team.RestoreTeam();
|
return fightPower;
|
}
|
|
|
//查看阵容战力
|
public long GetTeamFightPower(TeamType team, bool isPreview)
|
{
|
InitFightPowerParam(team, -1, isPreview);
|
return CalculatePower();
|
}
|
#endregion
|
|
|
public Dictionary<int, long> GetHeroTotalAttr(HeroInfo hero)
|
{
|
|
Dictionary<int, long> tmpAttrs = new Dictionary<int, long>();
|
hero.RefreshFetterAttrsWhenCalcPower(TeamType.Story); //羁绊属性要实时算
|
|
#if UNITY_EDITOR
|
propertyStrForDebug = "";
|
#endif
|
|
foreach (var config in pConfig)
|
{
|
if (config.showType < 1 || config.showType > 4)
|
{
|
continue;
|
}
|
if (config.showType == 1)
|
{
|
tmpAttrs[config.ID] = (long)GetPropertyVaule(config.ID, hero, 0);
|
}
|
else
|
{
|
tmpAttrs[config.ID] = (long)GetPropertyVaule(config.ID, hero, 1);
|
}
|
}
|
#if UNITY_EDITOR
|
// Debug.Log($"战力:武将ID {hero.heroId} 属性信息 {propertyStrForDebug}");
|
#endif
|
return tmpAttrs;
|
}
|
}
|