using ET; using System; using System.Collections.Generic; using UnityEngine; namespace GFGGame { public class ClickType { public const int MISS_CLICK = 0; public const int GREAT_CLICK = 1; public const int PREFACT_CLICK = 2; } public class BeginTime { public const int PART_SCORE_1 = 1;//作用第一回合 public const int PART_SCORE_2 = 2;//作用第二回合 public const int PART_SCORE_3 = 3;//作用第三回合 public const int PART_SCORE_4 = 4;//作用第四回合 public const int PART_SCORE_5 = 5;//作用第五回合 public const int PART_SCORE_6 = 6;//作用第六回合 public const int PART_ALL_FIGHT_BEGIN = 7;//对战开始 public const int PART_PREFACT_CLICK = 8;//每次优秀点击 public const int PART_FIGHT_BEGIN = 9;//每回合开始 public const int PART_FIGHT_END = 10;//每回合结束 } public class ScoreSystemData : SingletonBase { /// /// 将穿戴部件分组 /// public void SetEquipScoresWithPartId(FightData roleData) { roleData.pardScoreListDic.Clear(); roleData.pardListDic.Clear(); for (int i = 0; i < roleData.itemList.Count; i++) { FightScoreCfg[] typeCfgs = FightScoreCfgArray.Instance.dataArray; for (int j = 0; j < typeCfgs.Length; j++) { FightScoreCfg cfg = typeCfgs[j]; if (roleData.pardScoreListDic.ContainsKey(cfg.id) == false) { roleData.pardScoreListDic.Add(cfg.id, new List()); } if (roleData.pardListDic.ContainsKey(cfg.id) == false) { roleData.pardListDic.Add(cfg.id, new List()); } bool isCheckFinish = false; for (int k = 0; k < cfg.subTypesArr.Length; k++) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(roleData.itemList[i]); if (itemCfg.subType == cfg.subTypesArr[k]) { roleData.pardListDic[cfg.id].Add(roleData.itemList[i]); roleData.pardScoreListDic[cfg.id].Add(roleData.itemScoreList[i]); isCheckFinish = true; break; } } if (isCheckFinish) break; } } } /// /// 返回总主属性分 /// /// public double GetMainScore(FightData roleData) { //(部件属性分数+标签分数+人物基础分+卡牌属性分数)*4 // int partScore = 0; // double tagScore = 0; // int tagCount = 0; double baseScore = 0; for (int i = 0; i < FightScoreCfgArray.Instance.dataArray.Length; i++) { baseScore += GetPartBaseScore(roleData, i + 1); } return (baseScore + roleData.baseScore + roleData.cardScore) * ConstScoreSystem.MAIN_SCORE; } public double GetRobotMainScore(FightData robotData) { //(部件属性分数+标签分数+人物基础分+卡牌属性分数)*4 double partScore = 0; for (int i = 0; i < FightScoreCfgArray.Instance.dataArray.Length; i++) { partScore += GetRobotPartBaseScore(robotData, i + 1); } return (partScore + robotData.baseScore + robotData.cardScore) * ConstScoreSystem.MAIN_SCORE; } /// /// 部件评分 /// /// 部件id /// 点击状态0:miss,1:优秀,2:完美 /// 总主属性 /// 评分部位 /// 是否展示卡牌效果 /// public int GetPartScore(FightData roleData, int partId, int clickType, double skillScore) { //部件评分=部件基础分*部件系数 //点击评分=(部件基础分+(人物基础分+卡牌属性分数)*点击系数)*2.22 (新点击公式,防止点击优秀却因为未穿衣服结果是0分) //卡牌评分=总属性*技能配表百分比 double partBaseScore = GetPartBaseScore(roleData, partId); double partScore = partBaseScore * ConstScoreSystem.PART_SCORE; int roleScore = roleData.baseScore; int cardScore = roleData.cardScore; double clickCoefficient = GetPartItemClickScore(clickType); double clickScore = (partBaseScore + (roleScore + cardScore) * clickCoefficient) * ConstScoreSystem.CLICK_SCORE; int score = (int)Math.Ceiling(partScore + clickScore + skillScore); return Math.Max(0, score); } public int GetRobotPartScore(FightData robotData, int partId, int clickType, double skillScore) { //部件评分=部件基础分*部件系数 //点击评分=(部件基础分+(人物基础分+卡牌属性分数)*点击系数)*2.22 (新点击公式,防止点击优秀却因为未穿衣服结果是0分) //卡牌评分=总属性*技能配表百分比 double partBaseScore = GetRobotPartBaseScore(robotData, partId); double partScore = partBaseScore * ConstScoreSystem.PART_SCORE; int roleScore = robotData.baseScore; int cardScore = robotData.cardScore; double clickCoefficient = GetPartItemClickScore(clickType); double clickScore = (partBaseScore + (cardScore + roleScore) * clickCoefficient) * ConstScoreSystem.CLICK_SCORE; int score = (int)Math.Ceiling(partScore + clickScore + skillScore); return Math.Max(0, score); } /// /// 部件基础评分 /// /// 评分部位 /// private double GetPartBaseScore(FightData roleData, int partId) { double partScore = 0; double tagScore = 0; int tagCount = 0; if (!roleData.pardListDic.ContainsKey(partId) || roleData.pardListDic[partId].Count == 0) return partScore; List partList = roleData.pardListDic[partId]; for (int i = 0; i < partList.Count; i++) { partScore += roleData.pardScoreListDic[partId][i]; tagScore += ItemDataManager.GetItemTagScore(partList[i], roleData.tags); if (ItemDataManager.CheckItemTagsRight(partList[i], roleData.tags)) tagCount++; } if (InstanceZonesDataManager.FightScene == ConstInstanceZonesType.Arena) { tagCount = Math.Min(ArenaTagCfgArray.Instance.dataArray.Length, tagCount); double addition = 0; if (tagCount > 0) { addition = ArenaTagCfgArray.Instance.GetCfg(tagCount).addition / 10000; } return (partScore + tagScore) * (1 + addition); } else { return partScore + tagScore; } } private double GetRobotPartBaseScore(FightData robotData, int partId) { double partBaseScore = robotData.itemScoreList[partId - 1]; if (InstanceZonesDataManager.FightScene == ConstInstanceZonesType.Arena) { partBaseScore = partBaseScore * (1 + robotData.tagAddition); } return partBaseScore; } private double GetPartItemClickScore(int clickType) { //点击评分=(部件基础分+(人物基础分+卡牌属性分数)*点击系数)*2.22 double clickCoefficient = 0; switch (clickType) { case ClickType.MISS_CLICK: clickCoefficient = ConstScoreSystem.MISS_SCORE; break; case ClickType.GREAT_CLICK: clickCoefficient = ConstScoreSystem.GREAT_SCORE; break; case ClickType.PREFACT_CLICK: clickCoefficient = ConstScoreSystem.PERFECT_SCORE; break; } return clickCoefficient; } /// /// 获取卡牌技能持续回合数 /// /// public List GetRoundTime(int cardId, List skillLvs) { List roundTimes = new List(); List targetSkillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(cardId); for (int i = 0; i < targetSkillCfgs.Count; i++) { int skillLv = skillLvs[i]; PassivitySkillLvlCfg skillLvlCfg = PassivitySkillLvlCfgArray.Instance.GetCfgByskilllvlAndskillId(skillLv, targetSkillCfgs[i].skillId); if (skillLvlCfg.beginTime == BeginTime.PART_ALL_FIGHT_BEGIN && UnityEngine.Random.Range(0, 10000) < skillLvlCfg.probability) { roundTimes.Add(skillLvlCfg.roundTime); } else { roundTimes.Add(0); } } return roundTimes; } /// /// 获取有效技能配置,过滤掉:被对方失效的、不符合作用时机、未满足触发概率的技能 /// /// public List GetValidSkills(int currentTime, int partId, int cardId, List skillLvs, int targetCardId, List targetSkillLvs, List roundTimes, List targetRoundTimes) { List skillCfgs = new List(); List targetSkillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(targetCardId); List nullifySkillIndex = new List(); for (int i = 0; i < targetSkillCfgs.Count; i++) { PassivitySkillLvlCfg targetSkillLvlCfg = PassivitySkillLvlCfgArray.Instance.GetCfgByskilllvlAndskillId(targetSkillLvs[i], targetSkillCfgs[i].skillId); if (CheckIsRightTime(targetSkillLvlCfg, currentTime, partId)) { bool isProbability = targetSkillLvlCfg.nullifySkillIndex > 0 && UnityEngine.Random.Range(0, 10000) < targetSkillLvlCfg.probability; if (targetSkillLvlCfg.beginTime == BeginTime.PART_ALL_FIGHT_BEGIN && targetRoundTimes != null && partId < targetRoundTimes[i]) isProbability = true; if (isProbability) nullifySkillIndex.Add(targetSkillLvlCfg.nullifySkillIndex); } } List mySkillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(cardId); for (int i = 0; i < mySkillCfgs.Count; i++) { PassivitySkillLvlCfg mySkillLvlCfg = PassivitySkillLvlCfgArray.Instance.GetCfgByskilllvlAndskillId(skillLvs[i], mySkillCfgs[i].skillId); if (nullifySkillIndex.IndexOf(i + 1) >= 0) continue;//技能被对手失效 if (CheckIsRightTime(mySkillLvlCfg, currentTime, partId)) { bool isProbability = UnityEngine.Random.Range(0, 10000) < mySkillLvlCfg.probability; if (mySkillLvlCfg.beginTime == BeginTime.PART_ALL_FIGHT_BEGIN && roundTimes != null && partId < roundTimes[i]) isProbability = true; if (isProbability) skillCfgs.Add(mySkillLvlCfg); } } return skillCfgs; } private bool CheckIsRightTime(PassivitySkillLvlCfg skillLvlCfg, int currentTime, int partId) { if (skillLvlCfg.beginTime == BeginTime.PART_ALL_FIGHT_BEGIN && currentTime == BeginTime.PART_FIGHT_BEGIN || skillLvlCfg.beginTime == BeginTime.PART_PREFACT_CLICK && currentTime == BeginTime.PART_PREFACT_CLICK || skillLvlCfg.beginTime == BeginTime.PART_FIGHT_BEGIN && currentTime == BeginTime.PART_FIGHT_BEGIN || skillLvlCfg.beginTime == BeginTime.PART_FIGHT_END && currentTime == BeginTime.PART_FIGHT_END || skillLvlCfg.beginTime <= BeginTime.PART_SCORE_6 && currentTime == BeginTime.PART_FIGHT_BEGIN && partId == skillLvlCfg.beginTime) { return true; } return false; } /// /// 本轮技能分数 /// /// 有效技能列表 /// 总主属性 /// public void GetPartItemSkillScore(List validSkills, double mainScore, double targetMainScore, out int skillScore, out int targetScore, out Dictionary skillScoreDic) { double _skillScore = 0; double _targetSkillScore = 0; skillScoreDic = new Dictionary(); for (int i = 0; i < validSkills.Count; i++) { if (validSkills[i].target == 1)//作用自身 { double score = mainScore * validSkills[i].ratio / 10000; _skillScore += score; skillScoreDic.Add(validSkills[i].skillId, (int)Math.Ceiling(score)); } else if (validSkills[i].target == 2)//作用对方 { double score = targetMainScore * validSkills[i].ratio / 10000; _targetSkillScore += score; skillScoreDic.Add(validSkills[i].skillId, (int)Math.Ceiling(score)); } } skillScore = (int)Math.Ceiling(_skillScore); targetScore = (int)Math.Ceiling(_targetSkillScore); } /// /// 是否展示卡牌效果 /// /// 卡牌id /// 被触发的有效技能列表 /// public bool IsShowCard(int cardId, List validSkills) { if (cardId <= 0) return false;//未选卡 if (validSkills.Count == 0) return false;//本轮没有技能被触发不显示卡牌 List skillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(cardId); for (int i = 0; i < skillCfgs.Count; i++) { if (skillCfgs[i].mainSkill == 1) { return true; } } return false; } /// /// 登峰造极额外加分 /// /// /// public int GetAllCircleAddScore(double mainScore) { //主属性20%的加分 return (int)Math.Ceiling(mainScore * ConstScoreSystem.ALL_PERFECT_SCORE); } /// /// 根据卡牌Id获取 战斗选卡 界面显示配置 /// /// /// public PassivitySkillCfg GetShowSkillCfg(int cardId) { List skillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(cardId); if (skillCfgs.Count <= 0) { Debug.LogWarning(cardId + " 这张卡片没有配置技能"); return null; } for (int i = 0; i < skillCfgs.Count; i++) { if (skillCfgs[i].showSkill == 1) { // int skillLv = SkillDataManager.Instance.GetSkillLv(cardId, skillCfgs[i].skillId); return skillCfgs[i]; } } return null; } /// /// 根据卡牌Id获取评分主技能显示配置 /// /// /// public PassivitySkillCfg GetMainSkillCfg(int cardId) { // Dictionary> cfgs = SkillDataManager.Instance.dicPassivitySkill[cardId]; List skillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(cardId); if (skillCfgs.Count <= 0) { Debug.LogWarning(cardId + " 这张卡片没有配置技能"); return null; } // foreach (int key in cfgs.Keys) // { for (int i = 0; i < skillCfgs.Count; i++) { if (skillCfgs[i].mainSkill == 1) { // int skillLV = SkillDataManager.Instance.GetSkillLv(cardId, skillCfgs[i].skillId); // PassivitySkillLvlCfgArray skillLvCfg = PassivitySkillLvlCfgArray.Instance.GetCfg(skillLV, skillCfgs[i].skillId); // return cfgs[key][skillLV - 1]; return skillCfgs[i]; } } return null; } } }