using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using LitJson; //!单英雄查看战力 只算自己的上阵属性 不算羁绊 总上阵属性 光环 // 战力的计算方式 // 先算上阵的单武将战力按公式一一算出各个属性(基础/战斗),再把算出来的各个属性代入到战力公式 // 所有武将战力加起来 + 技能战力汇总(公式)就是整个号的战力 public class FightPowerManager : Singleton { public FightPowerManager() { // 数值1:基础三维属性计算公式 // 数值2:战斗属性/战斗抗性/特殊属性计算公式 // 数值3:属性战力计算公式,计算参数详见 S.属性条目配置 JaceCalculator.Init(); } public long lastFightPower = 0; //上一次的服务端战力,用于重置是否重新计算武将百分比 羁绊等,没有变化则减少计算 public long lastMinggeSkillPower = 0; #region 初始化战力计算的信息 int teamTypeCalc = 1; //不同阵容战力不同 bool isPreviewTeamPower; //预览阵容(队伍)战力 int dropIndexCalc = -1; //掉落装备在阵容的索引,用于预览战力对比 int minggePresetID; //命格预设ID int minggeDropIndex; //掉落命格在背包的索引 ,用于预览战力对比 //计算阵容战力,装备对比等情况需要代入 /// /// /// /// 阵容类型:方案ID下的队伍 /// 掉落装备的索引,-1代表不替换计算 /// 预览阵容战力 public void InitFightPowerParam(int teamType = 0, int dropindex = -1, bool ispreview = false, int _minggePresetID = 0, int _minggeDropIndex = -1) { #if !UNITY_EDITOR openLog = false; #endif if (teamType == 0) { // 没有设置默认使用主阵容 teamType = TeamManager.Instance.GetMainTeamID(); } if (_minggePresetID == 0) { // 没有设置默认当前流派下命格方案 _minggePresetID = FuncPresetManager.Instance.GetFuncPresetID((int)FuncPresetType.Mingge); } teamTypeCalc = teamType; minggePresetID = _minggePresetID; isPreviewTeamPower = ispreview; dropIndexCalc = dropindex; minggeDropIndex = _minggeDropIndex; #if UNITY_EDITOR if (openLog) { FightPowerDebug("战力:初始化参数 dropIndex:" + dropIndexCalc + " 阵型:" + teamTypeCalc + " ispreview:" + ispreview + " minggePresetID:" + _minggePresetID + " minggeDropIndex:" + _minggeDropIndex); } #endif } #endregion #region 先计算所有功能的汇总属性 //功能属性 类型:值 public Dictionary lvAttrs = new Dictionary(); //等级属性 public Dictionary officialAttrs = new Dictionary(); //官职属性 //分开存储预览和 真实属性 public Dictionary equipAttrs = new Dictionary(); //装备属性 // public Dictionary lineUpPerDict = new Dictionary(); //阵容属性加成 public Dictionary countryAttrs = new Dictionary(); //阵容国家(光环)属性 public Dictionary minggeAttrs = new Dictionary(); //命格属性 double 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 if (openLog) { FightPowerDebug("战力:等级属性 " + JsonMapper.ToJson(lvAttrs)); FightPowerDebug("战力:红颜属性 " + JsonMapper.ToJson(BeautyMMManager.Instance.allMMTalentAttr)); FightPowerDebug("战力:古宝属性 " + JsonMapper.ToJson(GubaoManager.Instance.gubaoAllAttrDict)); } #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 if (openLog) { FightPowerDebug("战力:官职属性 " + JsonMapper.ToJson(officialAttrs)); } #endif } //装备属性:身上装备汇总 void RefrehEquipAttrs() { equipAttrs.Clear(); //身上装备属性重置 ItemModel dropEquip = null; if (dropIndexCalc != -1) { dropEquip = PackManager.Instance.GetItemByIndex(PackType.DropItem, dropIndexCalc); } for (int i = 0; i < EquipModel.TotleEquip; i++) { var equip = EquipModel.Instance.GetEquip(i); if (dropIndexCalc != -1) { if (dropEquip != null && 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 if (openLog) { FightPowerDebug("战力:装备属性 " + JsonMapper.ToJson(equipAttrs)); } #endif } // 计算队伍中上阵的所有武将的上阵属性 和 光环 void RefreshTeamAttrs() { //阵容属性 // 阵容:所有武将上阵属性 // lineUpPerDict = HeroUIManager.Instance.GetLineupPer(teamTypeCalc, isPreviewTeamPower); allHeroAddPer = HeroUIManager.Instance.GetAllHeroPer() / 10000.0; // 阵容:国家(光环)属性 countryAttrs = HeroUIManager.Instance.GetCountryAttrs(teamTypeCalc, isPreviewTeamPower); #if UNITY_EDITOR if (openLog) { FightPowerDebug("战力:国家(光环)属性 " + JsonMapper.ToJson(countryAttrs)); FightPowerDebug("战力:武将所有加成 " + allHeroAddPer); } #endif } //类似装备需要实时替换对比;功能处查看重算一次显示 void RefrehMinggeAttrs() { minggeAttrs.Clear(); //身上命格属性重置 ItemModel dropEquip = null; int packIndex = -1; if (minggeDropIndex != -1) { dropEquip = PackManager.Instance.GetItemByIndex(PackType.MinggeDrop, minggeDropIndex); packIndex = MinggeManager.Instance.GetPackIndex(minggePresetID, dropEquip.config.EquipPlace); } var starIndex = (minggePresetID - 1) * MinggeManager.TotleEquip; for (int i = starIndex; i < starIndex + MinggeManager.TotleEquip; i++) { var equip = PackManager.Instance.GetItemByIndex(PackType.Mingge, i); if (minggeDropIndex != -1) { if (dropEquip != null && packIndex == i) { equip = dropEquip; //替换计算总战力 } } if (equip == null) { continue; } var fightIDAttrs = EquipModel.Instance.GetEquipFightAttrs(equip); var fightValueAttrs = EquipModel.Instance.GetEquipFightValues(equip); if (fightIDAttrs != null) { for (int j = 0; j < fightIDAttrs.Count; j++) { if (!minggeAttrs.ContainsKey(fightIDAttrs[j])) { minggeAttrs[fightIDAttrs[j]] = fightValueAttrs[j]; } else { minggeAttrs[fightIDAttrs[j]] += fightValueAttrs[j]; } } } } #if UNITY_EDITOR if (openLog) { FightPowerDebug("战力:命格属性 " + JsonMapper.ToJson(minggeAttrs)); } #endif } public int GetAttrPer(int attrID, Dictionary attrDic) { if (attrID == 6 || attrID == 7 || attrID == 8) { var pertype = attrID + 10; attrDic.TryGetValue(pertype, out long value); return (int)(value); } return 0; } #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) { // propertyVariables.Clear(); lvAttrs.TryGetValue(attrType, out var lvValue); equipAttrs.TryGetValue(attrType, out var equipValue); officialAttrs.TryGetValue(attrType, out var realmValue); var realmPer = GetAttrPer(attrType, officialAttrs) / 10000.0; var gubaoValue = GubaoManager.Instance.GetAttrValue(attrType); var gubaoPer = GubaoManager.Instance.GetAttrPer(attrType) / 10000.0; var hjgValue = PhantasmPavilionManager.Instance.GetAttrValue(attrType); var hjgPer = PhantasmPavilionManager.Instance.GetAttrPer(attrType) / 10000.0; var horseValue = HorseManager.Instance.GetAttrValue(attrType); var horsePer = HorseManager.Instance.GetAttrPer(attrType) / 10000.0; var beautyValue = BeautyMMManager.Instance.GetAttrValue(attrType); var beautyPer = BeautyMMManager.Instance.GetAttrPer(attrType) / 10000.0; var fatesValue = HeroFatesManager.Instance.GetAttrValue(attrType); var fatesPer = HeroFatesManager.Instance.GetAttrPer(attrType) / 10000.0; var dingjungeValue = 0; //默认不需要加,爬塔特殊用,配合公式 var dingjungePer = 0; //默认不需要加,爬塔特殊用,配合公式 minggeAttrs.TryGetValue(attrType, out var minggeValue); var minggePer = GetAttrPer(attrType, minggeAttrs) / 10000.0; //全体卡牌加成 double cardPer = 0; if (attrType == 6 || attrType == 7 || attrType == 8) { cardPer = allHeroAddPer; } //阵容光环 三围百分比加成 var lineupHaloPer = GetCountryPer(attrType) / 10000.0; //武将属性 var inheritPer = hero.GetInheritAttrPer(attrType) / 10000.0; var heroSelfValue = hero.GetSelfAddValue(attrType); var starTalentPer = hero.GetTalentAttrPer(attrType) / 10000.0; var breakLVPer = hero.GetBreakAttrPer(attrType) / 10000.0; var awakeTalentPer = hero.GetAwakeAttrPer(attrType) / 10000.0; var fetterPer = hero.GetFetterAttrPer(attrType) / 10000.0; var heroLVValue = hero.GetHeroLVValue(attrType); double value = (lvValue+equipValue+realmValue+gubaoValue+hjgValue+horseValue+beautyValue+fatesValue+dingjungeValue+minggeValue)*(1+lineupHaloPer+realmPer+gubaoPer+hjgPer+horsePer+beautyPer+fatesPer+cardPer+minggePer)*(inheritPer+fetterPer+starTalentPer+breakLVPer+awakeTalentPer)*(1+dingjungePer)+heroSelfValue+heroLVValue; //保留2位小数 value = Math.Round(value, 2); #if UNITY_EDITOR //排除值为0的属性输出 // var tmpPropertyVariables = propertyVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value); // if (!tmpPropertyVariables.IsNullOrEmpty()) // { // FightPowerDebug($"战力:武将ID {hero.heroId} 属性ID {attrType} 值 {value} - {JsonMapper.ToJson(tmpPropertyVariables)}"); // } #endif return value; } public double GetFighttPropertyVaule(int attrType, HeroInfo hero) { lvAttrs.TryGetValue(attrType, out var lvValue); equipAttrs.TryGetValue(attrType, out var equipValue); officialAttrs.TryGetValue(attrType, out var realmValue); var gubaoValue = GubaoManager.Instance.GetAttrValue(attrType); var hjgValue = PhantasmPavilionManager.Instance.GetAttrValue(attrType); var horseValue = HorseManager.Instance.GetAttrValue(attrType); var beautyValue = BeautyMMManager.Instance.GetAttrValue(attrType); var fatesValue = HeroFatesManager.Instance.GetAttrValue(attrType); var dingjungeValue = 0; //默认不需要加,爬塔特殊用,配合公式 minggeAttrs.TryGetValue(attrType, out var minggeValue); //阵容光环 三围百分比加成 countryAttrs.TryGetValue(attrType, out var lineupHaloValue); //武将属性 var heroSelfValue = hero.GetSelfAddValue(attrType); var starTalentValue = hero.GetTalentAttrValue(attrType); var breakLVValue = hero.GetBreakAttrValue(attrType); var awakeTalentValue = hero.GetAwakeAttrValue(attrType); var fetterValue = hero.GetFetterAttrValue(attrType); double value = (lvValue + equipValue + realmValue + gubaoValue + hjgValue + horseValue + beautyValue + fatesValue + dingjungeValue + minggeValue) + (heroSelfValue + lineupHaloValue + starTalentValue + breakLVValue + awakeTalentValue) + fetterValue; //保留2位小数 value = Math.Round(value, 2); #if UNITY_EDITOR //排除值为0的属性输出 // var tmpPropertyVariables = propertyVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value); // if (!tmpPropertyVariables.IsNullOrEmpty()) // { // FightPowerDebug($"战力:武将ID {hero.heroId} 属性ID {attrType} 值 {value} - {JsonMapper.ToJson(tmpPropertyVariables)}"); // } #endif return value; } // 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; // } //PlayerPropertyConfig.baseAttr2perDict 频繁调用字典效率差 int GetCountryPer(int attrType) { if (attrType == 6 || attrType == 7 || attrType == 8) { var pertype = attrType + 10; countryAttrs.TryGetValue(pertype, out var value); return value; } return 0; } #endregion #region 计算战力 //如果服务端战力计算有压力,可改成关键点结算(如同步排行榜跨服等),表现由客户端自己计算 //装备战力为最终总战力的结果比(提升整个角色总战力) //计算总战力中的武将战力,几个武将加起来就是总战力,其他功能属性计算应该涵盖在英雄里 // calcType 计算战力缘由 0 武将 1 装备 2命格,用于节省部分开销 public long CalculatePower(int calcType) { #if UNITY_EDITOR if (openLog) { FightPowerDebug("战力:开始计算"); } #endif // --- 先计算所有功能的汇总属性 --- RefreshLVAttrs(); RefreshOfficialAttrs(); RefrehEquipAttrs(); RefrehMinggeAttrs(); bool diffFP = lastFightPower != PlayerDatas.Instance.baseData.FightPower; //战力是否有变化 if (diffFP || calcType == 0) { lastFightPower = PlayerDatas.Instance.baseData.FightPower; 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 (diffFP || calcType == 2) { lastMinggeSkillPower = GetMinggeSkillPower(); } fightPower += lastMinggeSkillPower; #if UNITY_EDITOR if (openLog) { FightPowerDebug("命格技能战力 " + lastMinggeSkillPower); FightPowerDebug("战力:计算完毕 " + fightPower); } #endif return fightPower; } //计算阵容中武将战力 public long CalculateTeamHeroPower(HeroInfo hero) { hero.RefreshFetterAttrsWhenCalcPower(teamTypeCalc); //羁绊属性要实时算 var Atk = GetPropertyVaule(6, hero); var Def = GetPropertyVaule(7, hero); var MaxHP = GetPropertyVaule(8, hero); var AtkSpeed = GetFighttPropertyVaule(11, hero); var StunRate = GetFighttPropertyVaule(21, hero); var StunRateDef = GetFighttPropertyVaule(22, hero); var SuperHitRate = GetFighttPropertyVaule(23, hero); var SuperHitRateDef = GetFighttPropertyVaule(24, hero); var ComboRate = GetFighttPropertyVaule(25, hero); var ComboRateDef = GetFighttPropertyVaule(26, hero); var MissRate = GetFighttPropertyVaule(27, hero); var MissRateDef = GetFighttPropertyVaule(28, hero); var ParryRate = GetFighttPropertyVaule(29, hero); var ParryRateDef = GetFighttPropertyVaule(30, hero); var SuckHPPer = GetFighttPropertyVaule(31, hero); var SuckHPPerDef = GetFighttPropertyVaule(32, hero); var FinalDamPer = GetFighttPropertyVaule(35, hero); var FinalDamPerDef = GetFighttPropertyVaule(36, hero); var PhyDamPer = GetFighttPropertyVaule(37, hero); var PhyDamPerDef = GetFighttPropertyVaule(38, hero); var MagDamPer = GetFighttPropertyVaule(39, hero); var MagDamPerDef = GetFighttPropertyVaule(40, hero); var NormalSkillPer = GetFighttPropertyVaule(41, hero); var NormalSkillPerDef = GetFighttPropertyVaule(42, hero); var AngerSkillPer = GetFighttPropertyVaule(43, hero); var AngerSkillPerDef = GetFighttPropertyVaule(44, hero); var SuperDamPer = GetFighttPropertyVaule(45, hero); var SuperDamPerDef = GetFighttPropertyVaule(46, hero); var CurePer = GetFighttPropertyVaule(51, hero); var CurePerDef = GetFighttPropertyVaule(52, hero); var ShieldPer = GetFighttPropertyVaule(53, hero); var ShieldPerDef = GetFighttPropertyVaule(54, hero); var DOTPer = GetFighttPropertyVaule(55, hero); var DOTPerDef = GetFighttPropertyVaule(56, hero); var WeiFinalDamPer = GetFighttPropertyVaule(57, hero); var WeiFinalDamPerDef = GetFighttPropertyVaule(58, hero); var ShuFinalDamPer = GetFighttPropertyVaule(59, hero); var ShuFinalDamPerDef = GetFighttPropertyVaule(60, hero); var WuFinalDamPer = GetFighttPropertyVaule(61, hero); var WuFinalDamPerDef = GetFighttPropertyVaule(62, hero); var QunFinalDamPer = GetFighttPropertyVaule(63, hero); var QunFinalDamPerDef = GetFighttPropertyVaule(64, hero); var PVPDamPer = GetFighttPropertyVaule(71, hero); var PVPDamPerDef = GetFighttPropertyVaule(72, hero); var Guanchuan = GetFighttPropertyVaule(77, hero); var GuanchuanDef = GetFighttPropertyVaule(78, hero); var Zhaojia = GetFighttPropertyVaule(79, hero); var ZhaojiaDef = GetFighttPropertyVaule(80, hero); //属性系数根据官职等级的加成 var fightPowerRatioConfig = FightPowerRatioConfig.Get(PlayerDatas.Instance.baseData.realmLevel); var AtkSpeedRatio = fightPowerRatioConfig.AtkSpeedRatio; var AtkRatio = fightPowerRatioConfig.AtkRatio; var DefRatio = fightPowerRatioConfig.DefRatio; var MaxHPRatio = fightPowerRatioConfig.MaxHPRatio; var StunRateRatio = fightPowerRatioConfig.StunRateRatio; var SuperHitRateRatio = fightPowerRatioConfig.SuperHitRateRatio; var ComboRateRatio = fightPowerRatioConfig.ComboRateRatio; var MissRateRatio = fightPowerRatioConfig.MissRateRatio; var ParryRateRatio = fightPowerRatioConfig.ParryRateRatio; var SuckHPPerRatio = fightPowerRatioConfig.SuckHPPerRatio; var StunRateDefRatio = fightPowerRatioConfig.StunRateDefRatio; var SuperHitRateDefRatio = fightPowerRatioConfig.SuperHitRateDefRatio; var ComboRateDefRatio = fightPowerRatioConfig.ComboRateDefRatio; var MissRateDefRatio = fightPowerRatioConfig.MissRateDefRatio; var ParryRateDefRatio = fightPowerRatioConfig.ParryRateDefRatio; var SuckHPPerDefRatio = fightPowerRatioConfig.SuckHPPerDefRatio; var NormalSkillPerRatio = fightPowerRatioConfig.NormalSkillPerRatio; var NormalSkillPerDefRatio = fightPowerRatioConfig.NormalSkillPerDefRatio; var AngerSkillPerRatio = fightPowerRatioConfig.AngerSkillPerRatio; var AngerSkillPerDefRatio = fightPowerRatioConfig.AngerSkillPerDefRatio; var SuperDamPerRatio = fightPowerRatioConfig.SuperDamPerRatio; var SuperDamPerDefRatio = fightPowerRatioConfig.SuperDamPerDefRatio; var ShieldPerRatio = fightPowerRatioConfig.ShieldPerRatio; var ShieldPerDefRatio = fightPowerRatioConfig.ShieldPerDefRatio; var DOTPerRatio = fightPowerRatioConfig.DOTPerRatio; var DOTPerDefRatio = fightPowerRatioConfig.DOTPerDefRatio; var WeiFinalDamPerRatio = fightPowerRatioConfig.WeiFinalDamPerRatio; var WeiFinalDamPerDefRatio = fightPowerRatioConfig.WeiFinalDamPerDefRatio; var ShuFinalDamPerRatio = fightPowerRatioConfig.ShuFinalDamPerRatio; var ShuFinalDamPerDefRatio = fightPowerRatioConfig.ShuFinalDamPerDefRatio; var WuFinalDamPerRatio = fightPowerRatioConfig.WuFinalDamPerRatio; var WuFinalDamPerDefRatio = fightPowerRatioConfig.WuFinalDamPerDefRatio; var QunFinalDamPerRatio = fightPowerRatioConfig.QunFinalDamPerRatio; var QunFinalDamPerDefRatio = fightPowerRatioConfig.QunFinalDamPerDefRatio; var FinalDamPerRatio = fightPowerRatioConfig.FinalDamPerRatio; var FinalDamPerDefRatio = fightPowerRatioConfig.FinalDamPerDefRatio; var PhyDamPerRatio = fightPowerRatioConfig.PhyDamPerRatio; var PhyDamPerDefRatio = fightPowerRatioConfig.PhyDamPerDefRatio; var MagDamPerRatio = fightPowerRatioConfig.MagDamPerRatio; var MagDamPerDefRatio = fightPowerRatioConfig.MagDamPerDefRatio; var CurePerRatio = fightPowerRatioConfig.CurePerRatio; var CurePerDefRatio = fightPowerRatioConfig.CurePerDefRatio; var PVPDamPerRatio = fightPowerRatioConfig.PVPDamPerRatio; var PVPDamPerDefRatio = fightPowerRatioConfig.PVPDamPerDefRatio; var GuanchuanRatio = fightPowerRatioConfig.GuanchuanRatio; var GuanchuanDefRatio = fightPowerRatioConfig.GuanchuanDefRatio; var ZhaojiaRatio = fightPowerRatioConfig.ZhaojiaRatio; var ZhaojiaDefRatio = fightPowerRatioConfig.ZhaojiaDefRatio; long fightPower = (long)(Atk*AtkRatio+MaxHP*MaxHPRatio+Def*DefRatio+AtkSpeed*AtkSpeedRatio+(StunRate*StunRateRatio+SuperHitRate*SuperHitRateRatio+ComboRate*ComboRateRatio+MissRate*MissRateRatio+ParryRate*ParryRateRatio+SuckHPPer*SuckHPPerRatio+StunRateDef*StunRateDefRatio+SuperHitRateDef*SuperHitRateDefRatio+ComboRateDef*ComboRateDefRatio+MissRateDef*MissRateDefRatio+ParryRateDef*ParryRateDefRatio+SuckHPPerDef*SuckHPPerDefRatio+FinalDamPer*FinalDamPerRatio+FinalDamPerDef*FinalDamPerDefRatio+PhyDamPer*PhyDamPerRatio+PhyDamPerDef*PhyDamPerDefRatio+MagDamPer*MagDamPerRatio+MagDamPerDef*MagDamPerDefRatio+NormalSkillPer*NormalSkillPerRatio+NormalSkillPerDef*NormalSkillPerDefRatio+AngerSkillPer*AngerSkillPerRatio+AngerSkillPerDef*AngerSkillPerDefRatio+SuperDamPer*SuperDamPerRatio+SuperDamPerDef*SuperDamPerDefRatio+CurePer*CurePerRatio+CurePerDef*CurePerDefRatio+ShieldPer*ShieldPerRatio+ShieldPerDef*ShieldPerDefRatio+DOTPer*DOTPerRatio+DOTPerDef*DOTPerDefRatio+WeiFinalDamPer*WeiFinalDamPerRatio+WeiFinalDamPerDef*WeiFinalDamPerDefRatio+ShuFinalDamPer*ShuFinalDamPerRatio+ShuFinalDamPerDef*ShuFinalDamPerDefRatio+WuFinalDamPer*WuFinalDamPerRatio+WuFinalDamPerDef*WuFinalDamPerDefRatio+QunFinalDamPer*QunFinalDamPerRatio+QunFinalDamPerDef*QunFinalDamPerDefRatio+PVPDamPer*PVPDamPerRatio+PVPDamPerDef*PVPDamPerDefRatio+Guanchuan*GuanchuanRatio+GuanchuanDef*GuanchuanDefRatio+Zhaojia*ZhaojiaRatio+ZhaojiaDef*ZhaojiaDefRatio)/100.0-55000); // #if UNITY_EDITOR // //排除值为0的属性输出 // var tmpFightPowerVariables = fightPowerVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value); // if (!tmpFightPowerVariables.IsNullOrEmpty()) // FightPowerDebug($"战力:武将ID {hero.heroId} 属性战力 {fightPower} 属性战力参数 {JsonMapper.ToJson(tmpFightPowerVariables)}"); // #endif //加上技能战力 var SkillPower = hero.GetSkillsFightPower(); var OfficialLV = PlayerDatas.Instance.baseData.realmLevel; long skillPower = SkillPower*OfficialLV;; #if UNITY_EDITOR if (openLog) { FightPowerDebug($"战力:武将ID {hero.heroId} 总战力 {fightPower + skillPower}"); } #endif return fightPower + skillPower; } //命格技能战力:按个数获取对应等级的技能战力 long GetMinggeSkillPower() { //当前方案技能信息 var dict = MinggeManager.Instance.GetMinggeSkillCountDictByPresetID(minggePresetID); ItemModel dropEquip = null; if (minggeDropIndex != -1) { dropEquip = PackManager.Instance.GetItemByIndex(PackType.MinggeDrop, minggeDropIndex); //带技能的命格 需判断是否技能个数变化 if (MinggeManager.Instance.minggeSkillEquipPlaceList.Contains(dropEquip.config.EquipPlace)) { var packIndex = MinggeManager.Instance.GetPackIndex(minggePresetID, dropEquip.config.EquipPlace); //要对比的装备 var equip = PackManager.Instance.GetItemByIndex(PackType.Mingge, packIndex); var _skillTypeID = EquipModel.Instance.GetEquipSkillID(dropEquip); if (equip == null) { if (dict.ContainsKey(_skillTypeID)) { dict[_skillTypeID] += 1; } } else { var oldSkillTypeID = EquipModel.Instance.GetEquipSkillID(equip); if (oldSkillTypeID != _skillTypeID) { if (dict.ContainsKey(_skillTypeID)) { dict[_skillTypeID] += 1; } else { dict[_skillTypeID] = 1; } if (dict.ContainsKey(oldSkillTypeID)) { dict[oldSkillTypeID] -= 1; } } } } } long skillPower = 0; foreach (var item in dict) { if (item.Value == 0) { continue; } var skill = SkillConfig.Get(item.Key + item.Value - 1); if (skill == null) { Debug.LogError("skill is null" + (item.Key + item.Value - 1)); continue; } var SkillPower = skill.FightPower; var OfficialLV = PlayerDatas.Instance.baseData.realmLevel; skillPower += SkillPower*OfficialLV;; } #if UNITY_EDITOR if (openLog) { FightPowerDebug($"命格技能战力 {skillPower}"); } #endif return skillPower; } /// /// 和身上装备对比差 /// /// 地板装备 /// public long GetFightPowerChange(ItemModel item) { InitFightPowerParam(); var fightPower = CalculatePower(1); InitFightPowerParam(dropindex: item.gridIndex); var tmpFightPower = CalculatePower(1); EquipRecordManager.Instance.showFightPower = tmpFightPower - fightPower; // 同时记录装备日志战力 return EquipRecordManager.Instance.showFightPower; } /// /// 命格装备对比 /// /// minggePresetID 指要对比的哪套方案下的命格,玩家可以点击切换对比,自动默认会遍历所有激活方案 public long GetFightPowerMinggeChange(ItemModel item, int minggePresetID) { InitFightPowerParam(_minggePresetID: minggePresetID); var fightPower = CalculatePower(2); InitFightPowerParam(_minggePresetID: minggePresetID, _minggeDropIndex: item.gridIndex); var tmpFightPower = CalculatePower(2); return tmpFightPower - fightPower; } // 单英雄查看战力 // 1. 上阵英雄显示,在主线阵容下的战力 // 2. 非上阵或其他上阵阵容:上阵不足6个人的,按增加的方式的计算;人数满的情况下按替换6号位计算 public long GetHeroFightPower(HeroInfo heroInfo) { bool ispreview = false; var team = TeamManager.Instance.GetTeam(TeamManager.Instance.GetMainTeamID()); 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(); RefrehMinggeAttrs(); RefrehEquipAttrs(); RefreshTeamAttrs(); var fightPower = CalculateTeamHeroPower(heroInfo); fightPower += GetMinggeSkillPower(); //计算完恢复队伍 if (ispreview) team.RestoreTeam(); return fightPower; } //查看阵容战力 public long GetTeamFightPower(int team, bool isPreview) { InitFightPowerParam(team, ispreview:isPreview); return CalculatePower(0); } #endregion public Dictionary GetHeroTotalAttr(HeroInfo hero) { Dictionary tmpAttrs = new Dictionary(); hero.RefreshFetterAttrsWhenCalcPower(TeamManager.Instance.GetMainTeamID()); //羁绊属性要实时算 var pConfig = PlayerPropertyConfig.GetValues(); foreach (var config in pConfig) { if (config.showType < 1 || config.showType > 4) { continue; } //约定死 只有3维才是基础属性 if (config.showType == 1 && config.ID != 11) { tmpAttrs[config.ID] = (long)GetPropertyVaule(config.ID, hero); } else { tmpAttrs[config.ID] = (long)GetFighttPropertyVaule(config.ID, hero); } } return tmpAttrs; } bool openLog = false; void FightPowerDebug(string msg) { #if UNITY_EDITOR if (!openLog) return; Debug.Log(msg); #endif } }