using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using LitJson; //!单英雄查看战力 只算自己的上阵属性 不算羁绊 总上阵属性 光环 // 战力的计算方式 // 先算上阵的单武将战力按公式一一算出各个属性(基础/战斗),再把算出来的各个属性代入到战力公式 // 所有武将战力加起来 + 技能战力汇总(公式)就是整个号的战力 public class FightPowerManager : Singleton { // 属性变量常量 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 propertyVariables = new Dictionary(); Dictionary fightPowerVariables = new Dictionary(); //总战力中的单武将战力 List pConfig = new List(); public FightPowerManager() { // 数值1:基础三维属性计算公式 // 数值2:战斗属性/战斗抗性/特殊属性计算公式 // 数值3:属性战力计算公式,计算参数详见 S.属性条目配置 pConfig = PlayerPropertyConfig.GetValues(); JaceCalculator.Init(); } #region 初始化战力计算的信息 TeamType teamTypeCalc = TeamType.Story; //不同阵容战力不同 bool isPreviewTeamPower; //预览阵容(队伍)战力 int dropIndexCalc = -1; //掉落装备在阵容的索引,用于预览战力对比 //计算阵容战力,装备对比等情况需要代入 /// /// /// /// 阵容类型 /// 掉落装备的索引,-1代表不替换计算 /// 预览阵容战力 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 lvAttrs = new Dictionary(); //等级属性 public Dictionary officialAttrs = new Dictionary(); //官职属性 //分开存储预览和 真实属性 public Dictionary equipAttrs = new Dictionary(); //装备属性 // public Dictionary lineUpPerDict = new Dictionary(); //阵容属性加成 public Dictionary countryAttrs = new Dictionary(); //阵容国家(光环)属性 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; } /// /// 和身上装备对比差 /// /// 地板装备 /// 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 GetHeroTotalAttr(HeroInfo hero) { Dictionary tmpAttrs = new Dictionary(); 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; } }