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 RoleType { public const int MINE = 0; public const int ENEMY = 1; public const int ROBOT = 2; } public class ScoreSystemData : SingletonBase { private const float _prefectScale = 0.866f;//完美缩放比 private Dictionary> equipDicWithPartId = new Dictionary>(); /// /// 将穿戴部件分组 /// public void SetEquipDicWithType() { equipDicWithPartId.Clear(); var equipDatas = MyDressUpHelper.dressUpObj.itemList; for (int i = 0; i < equipDatas.Count; i++) { FightScoreCfg[] typeCfgs = FightScoreCfgArray.Instance.dataArray; for (int j = 0; j < typeCfgs.Length; j++) { FightScoreCfg cfg = typeCfgs[j]; if (equipDicWithPartId.ContainsKey(cfg.id) == false) { equipDicWithPartId.Add(cfg.id, new List()); } bool isCheckFinish = false; for (int k = 0; k < cfg.subTypesArr.Length; k++) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(equipDatas[i]); if (itemCfg.subType == cfg.subTypesArr[k]) { equipDicWithPartId[cfg.id].Add(equipDatas[i]); isCheckFinish = true; break; } } if (isCheckFinish) break; } } } /// /// 返回总主属性分 /// /// public double GetMainScore() { //(部件属性分数+标签分数+人物基础分+卡牌属性分数)*4 var equipDatas = MyDressUpHelper.dressUpObj.itemList; int partScore = 0; double tagScore = 0; // StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); // StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); for (int i = 0; i < equipDatas.Count; i++) { partScore += ItemDataManager.GetItemAdditionScore(equipDatas[i], InstanceZonesDataManager.currentScoreType); tagScore = ItemDataManager.GetItemTagScore(equipDatas[i], InstanceZonesDataManager.currentFightTags); } int roleScore = RoleLevelCfgArray.Instance.GetCfg(GameGlobal.myNumericComponent.GetAsInt(NumericType.Lvl)).baseScore; int cardScore = ItemDataManager.GetItemAdditionScore(InstanceZonesDataManager.currentCardId, InstanceZonesDataManager.currentScoreType); return (partScore + tagScore + roleScore + cardScore) * ConstScoreSystem.MAIN_SCORE; } public double GetTargetMainScore() { //(部件属性分数+标签分数+人物基础分+卡牌属性分数)*4 int partScore = 0; StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); for (int i = 0; i < FightScoreCfgArray.Instance.dataArray.Length; i++) { partScore += fightCfg.targetPartsScoreArr[i]; } int roleScore = fightCfg.targetBaseScore; int cardScore = fightCfg.targetCardScore; return (partScore + roleScore + cardScore) * ConstScoreSystem.MAIN_SCORE; } /// /// 部件评分 /// /// 部件id /// 点击状态0:miss,1:优秀,2:完美 /// 总主属性 /// 评分部位 /// 是否展示卡牌效果 /// public int GetPartScore(int partId, int roleType, int clickType, double skillScore) { //部件评分=部件基础分*部件系数 //点击评分=(部件基础分+(人物基础分+卡牌属性分数)*点击系数)*2.22 (新点击公式,防止点击优秀却因为未穿衣服结果是0分) //卡牌评分=总属性*技能配表百分比 double partScore = GetPartScore(partId, roleType); double clickScore = ScoreSystemData.Instance.GetPartItemClickScore(partId, clickType, roleType); int score = (int)Math.Ceiling(partScore + clickScore + skillScore); return Math.Max(0, score); // return (int)Math.Round((partScore + skillScore)); } private double GetPartScore(int partId, int roleType) { double partScore = 0; if (roleType == RoleType.MINE) { partScore = GetPartBaseScore(partId) * ConstScoreSystem.PART_SCORE; } else { partScore = GetTargetPartBaseScore(partId) * ConstScoreSystem.PART_SCORE; } return partScore; } /// /// 部件基础评分 /// /// 评分部位 /// private double GetPartBaseScore(int partId) { double partScore = 0; double tagScore = 0; if (!equipDicWithPartId.ContainsKey(partId)) return partScore; for (int i = 0; i < equipDicWithPartId[partId].Count; i++) { partScore += ItemDataManager.GetItemAdditionScore(equipDicWithPartId[partId][i], InstanceZonesDataManager.currentScoreType); tagScore += ItemDataManager.GetItemTagScore(equipDicWithPartId[partId][i], InstanceZonesDataManager.currentFightTags); } return partScore + tagScore; } private double GetTargetPartBaseScore(int partId) { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); if (fightCfg.targetPartsScoreArr.Length < FightScoreCfgArray.Instance.dataArray.Length) { ET.Log.Debug("战斗id:" + fightCfg.id + " targetPartsScore 数量不足"); return 0; } return fightCfg.targetPartsScoreArr[partId - 1]; } private double GetPartItemClickScore(int partId, int clickState, int roleType) { //点击评分=(部件基础分+(人物基础分+卡牌属性分数)*点击系数)*2.22 double clickCoefficient = 0; switch (clickState) { 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; } double clickScore = 0; if (roleType == RoleType.MINE) { int roleScore = RoleLevelCfgArray.Instance.GetCfg(GameGlobal.myNumericComponent.GetAsInt(NumericType.Lvl)).baseScore; int cardScore = ItemDataManager.GetItemAdditionScore(InstanceZonesDataManager.currentCardId, InstanceZonesDataManager.currentScoreType); clickScore = (GetPartBaseScore(partId) + (cardScore + roleScore) * clickCoefficient) * ConstScoreSystem.CLICK_SCORE; } else { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); int roleScore = fightCfg.targetBaseScore; int cardScore = fightCfg.targetCardScore; clickScore = (GetTargetPartBaseScore(partId) + (cardScore + roleScore) * clickCoefficient) * ConstScoreSystem.CLICK_SCORE; } return clickScore; } /// /// 获取卡牌技能持续回合数 /// /// public List GetRoundTime(int roleType) { List roundTimes = new List(); if (roleType == RoleType.MINE) { List mySkillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(InstanceZonesDataManager.currentCardId); for (int i = 0; i < mySkillCfgs.Count; i++) { int skillLv = SkillDataManager.Instance.GetSkillLv(InstanceZonesDataManager.currentLevelCfgId, mySkillCfgs[i].skillId); PassivitySkillLvlCfg skillLvlCfg = PassivitySkillLvlCfgArray.Instance.GetCfgByskilllvlAndskillId(skillLv, mySkillCfgs[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); } } } else { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); List targetSkillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(fightCfg.targetCardId); for (int i = 0; i < targetSkillCfgs.Count; i++) { int skillLv = fightCfg.targetSkillLvsArr[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 roleType, List roundTimes, List targetRoundTimes) { List skillCfgs = new List(); StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); int cardId = 0; int targetCardId; if (roleType == RoleType.MINE) { cardId = InstanceZonesDataManager.currentCardId; targetCardId = fightCfg.targetCardId; } else { targetCardId = InstanceZonesDataManager.currentCardId; cardId = fightCfg.targetCardId; } List mySkillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(cardId); List targetSkillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(targetCardId); List nullifySkillIndex = new List(); for (int i = 0; i < targetSkillCfgs.Count; i++) { PassivitySkillCfg skillCfg = targetSkillCfgs[i]; int targetSkillLv = 0; if (roleType == RoleType.MINE) { targetSkillLv = fightCfg.targetSkillLvsArr[i]; } else { targetSkillLv = SkillDataManager.Instance.GetSkillLv(targetCardId, skillCfg.skillId); } PassivitySkillLvlCfg targetSkillLvlCfg = PassivitySkillLvlCfgArray.Instance.GetCfgByskilllvlAndskillId(targetSkillLv, skillCfg.skillId); if (targetSkillLvlCfg.beginTime == BeginTime.PART_ALL_FIGHT_BEGIN && currentTime == BeginTime.PART_FIGHT_BEGIN || targetSkillLvlCfg.beginTime == BeginTime.PART_PREFACT_CLICK && currentTime == BeginTime.PART_PREFACT_CLICK || targetSkillLvlCfg.beginTime == BeginTime.PART_FIGHT_BEGIN && currentTime == BeginTime.PART_FIGHT_BEGIN || targetSkillLvlCfg.beginTime == BeginTime.PART_FIGHT_END && currentTime == BeginTime.PART_FIGHT_END || targetSkillLvlCfg.beginTime <= BeginTime.PART_SCORE_6 && currentTime == BeginTime.PART_FIGHT_BEGIN && partId == targetSkillLvlCfg.beginTime) { 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); } } for (int i = 0; i < mySkillCfgs.Count; i++) { PassivitySkillCfg skillCfg = mySkillCfgs[i]; int mySkillLv = 0; if (roleType == RoleType.MINE) { mySkillLv = SkillDataManager.Instance.GetSkillLv(cardId, skillCfg.skillId); } else { mySkillLv = fightCfg.targetSkillLvsArr[i]; } PassivitySkillLvlCfg mySkillLvlCfg = PassivitySkillLvlCfgArray.Instance.GetCfgByskilllvlAndskillId(mySkillLv, skillCfg.skillId); if (nullifySkillIndex.IndexOf(i + 1) >= 0) continue;//技能被对手失效 if (mySkillLvlCfg.beginTime == BeginTime.PART_ALL_FIGHT_BEGIN && currentTime == BeginTime.PART_FIGHT_BEGIN || mySkillLvlCfg.beginTime == BeginTime.PART_PREFACT_CLICK && currentTime == BeginTime.PART_PREFACT_CLICK || mySkillLvlCfg.beginTime == BeginTime.PART_FIGHT_BEGIN && currentTime == BeginTime.PART_FIGHT_BEGIN || mySkillLvlCfg.beginTime == BeginTime.PART_FIGHT_END && currentTime == BeginTime.PART_FIGHT_END || mySkillLvlCfg.beginTime <= BeginTime.PART_SCORE_6 && currentTime == BeginTime.PART_FIGHT_BEGIN && partId == mySkillLvlCfg.beginTime) { 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; } /// /// 本轮技能分数 /// /// 有效技能列表 /// 总主属性 /// 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; } /// /// 0失败1优秀2完美 /// /// /// public int GetClickType(float scale) { // float scaleX = _ui.m_comClick.m_comResult.m_imgCircle.scale.x; int clickType = ClickType.MISS_CLICK; if (FightDataManager.Instance.autoPlay == true) { return ClickType.PREFACT_CLICK; } if (scale <= _prefectScale && scale > 0.65f) { clickType = ClickType.PREFACT_CLICK; } else if (scale <= 0.216f) { clickType = ClickType.MISS_CLICK; } else { clickType = ClickType.GREAT_CLICK; } return clickType; } } }