using System; using System.Collections.Generic; using UnityEngine; namespace GFGGame { public class FightDataManager : SingletonBase { public byte[] FightRoleRes { get; set; } public Texture2D RoleTextuex { get; set; } //角色基础分+部件基础分 // private int _score; // public int score // { // get // { // return _score; // } // set // { // _score = value; // EventAgent.DispatchEvent(ConstMessage.DRESS_UP_SCORE_CHANGED, _score); // } // } private FightRoleData _roleData = new FightRoleData(); public FightRoleData roleData { get { return GetMyFightRoleData(); } } public int GetScore(List itemScoreList) { int score = 0; for (int i = 0; i < itemScoreList.Count; i++) { score += itemScoreList[i]; } return score; } //最终得分 private int _totalScore; public int totalScore { get { return _totalScore; } set { _totalScore = value; } } //战斗对象最终得分 private int _targetTotalScore; public int npcTotalScore { get { return _targetTotalScore; } set { _targetTotalScore = value; } } private bool _autoPlay = false; public bool autoPlay { get { return _autoPlay; } set { _autoPlay = value; if (!_autoPlay) fightSpeed = 1; StorageSProxy.ReqSetClientValue(ConstStorageId.STORAGE_AUTO_PLAY, _autoPlay == true ? 1 : 0).Coroutine(); } } public int maxFightSpeed = 2; private int _fightSpeed = 1; public int fightSpeed { get { return _fightSpeed; } set { _fightSpeed = value; StorageSProxy.ReqSetClientValue(ConstStorageId.STORAGE_FIGHT_AUTO_PLAY_SPEED, _fightSpeed).Coroutine(); } } private int _storyDialogSpeed = 1; public int dialogSpeed { get { return _storyDialogSpeed; } set { _storyDialogSpeed = value; StorageSProxy.ReqSetClientValue(ConstStorageId.STORAGE_DIALOG_AUTO_PLAY_SPEED, _storyDialogSpeed).Coroutine(); } } //根据位置原点和随机范围获取评分位置 public void GetCirclePos(Vector2 pos, int range, out float x, out float y) { int numX = UnityEngine.Random.Range(0, 2); int signX = numX % 2 == 0 ? 1 : -1; float rangeX = UnityEngine.Random.Range(0, range); x = pos.x + signX * (rangeX); int numY = UnityEngine.Random.Range(0, 2); int signY = numY % 2 == 0 ? 1 : -1; float rangeY = UnityEngine.Random.Range(0, range); y = pos.y + signY * (rangeY); } public Texture2D GetPrintscreenNTexture(Camera camera) { RenderTexture rt = new RenderTexture(UnityEngine.Screen.width, UnityEngine.Screen.height, 0);//渲染一张1920*1080的图 camera.targetTexture = rt;//传到主摄像机上 camera.Render();//渲染 RenderTexture.active = rt; Texture2D screenShot = new Texture2D(UnityEngine.Screen.width, UnityEngine.Screen.height, TextureFormat.ARGB32, false); screenShot.ReadPixels(new Rect(0, 0, UnityEngine.Screen.width, UnityEngine.Screen.height), 0, 0);//读像素 screenShot.Apply(); camera.targetTexture = null; RenderTexture.active = null; UnityEngine.Object.Destroy(rt); return screenShot; } /// /// 获取标签总分数 /// /// 服装列表 /// 标签 /// public int GetTagsScore(List itemList, string[] tags) { int score = 0; for (int i = 0; i < itemList.Count; i++) { score += ItemDataManager.GetItemTagScore(itemList[i], tags); } return score; } //获取玩家战斗数据 private FightRoleData GetMyFightRoleData() { _roleData.name = RoleDataManager.roleName; _roleData.headId = RoleDataManager.headId; // _roleData.headBorderId = RoleDataManager.headBorderId; _roleData.baseScore = RoleLevelCfgArray.Instance.GetCfg(RoleDataManager.lvl).baseScore;//角色等级分数 if (InstanceZonesDataManager.FightScene == ConstInstanceZonesType.Arena) { if (ArenaDataManager.Instance.CurFightIndex == 0) { _roleData.tags = new string[1] { ArenaDataManager.Instance.Tag }; } _roleData.scoreType = ArenaDataManager.Instance.DressupList[ArenaDataManager.Instance.CurFightIndex].scoreType; _roleData.cardId = ArenaDataManager.Instance.DressupList[ArenaDataManager.Instance.CurFightIndex].cardId; _roleData.cardScore = ItemDataManager.GetItemAdditionScore(_roleData.cardId, _roleData.scoreType, _roleData.tags); _roleData.itemList = ArenaDataManager.Instance.DressupList[ArenaDataManager.Instance.CurFightIndex].itemList; } else { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); // roleData.fightScene = levelCfg.type; if (!string.IsNullOrEmpty(levelCfg.fightID)) { StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); _roleData.tags = fightCfg.needTagsArr;////本次战斗要求的标签 } _roleData.scoreType = InstanceZonesDataManager.currentScoreType; //本次战斗的主题 _roleData.cardId = InstanceZonesDataManager.currentCardId; ;//卡牌id _roleData.cardScore = _roleData.cardId == 0 ? 0 : CardDataManager.GetCardDataById(_roleData.cardId).scores[_roleData.scoreType];//卡牌对应主题的属性分数 _roleData.itemList = MyDressUpHelper.dressUpObj.itemList; } if (_roleData.cardId > 0) { _roleData.skillLvs = SkillDataManager.Instance.GetSkillLvs(_roleData.cardId); } SetItemScoreList(_roleData); ScoreSystemData.Instance.SetEquipScoresWithPartId(_roleData); return _roleData; } public void SetItemScoreList(FightRoleData _roleData) { _roleData.itemScoreList.Clear(); for (int i = 0; i < _roleData.itemList.Count; i++) { int score = ItemDataManager.GetItemAdditionScore(_roleData.itemList[i], _roleData.scoreType); _roleData.itemScoreList.Add(score); } } //获取副本机器人战斗数据 public FightRobotData GetFightRobotData() { FightRobotData robotData = new FightRobotData(); StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); robotData.res = fightCfg.targetRes; robotData.name = fightCfg.targetName; robotData.scoreType = InstanceZonesDataManager.currentScoreType; //本次战斗的主题 robotData.baseScore = fightCfg.targetBaseScore; robotData.cardId = fightCfg.targetCardId; robotData.cardScore = fightCfg.targetCardScore; robotData.skillLvs = new List(fightCfg.targetSkillLvsArr); robotData.itemScoreList = new List(fightCfg.targetPartsScoreArr); return robotData; } /// /// 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 <= 0.866f && scale > 0.65f) { clickType = ClickType.PREFACT_CLICK; } else if (scale <= 0.216f) { clickType = ClickType.MISS_CLICK; } else { clickType = ClickType.GREAT_CLICK; } return clickType; } /// /// 卡牌列表按竞技战力排序 /// /// /// public List SortCardList(List cardList, List itemList, int scoreType) { double itemSum = 0; for (int i = 0; i < itemList.Count; i++) { itemSum += ItemDataManager.GetItemAdditionScore(itemList[i], scoreType); } List arrayList = new List(cardList); for (int i = arrayList.Count - 1; i >= 0; i--) { List skillLvs = SkillDataManager.Instance.GetSkillLvs(arrayList[i].id); if (skillLvs.Count == 0) { ET.Log.Error("卡牌:" + arrayList[i].id + " 未配置技能"); arrayList.RemoveAt(i); } } int baseScore = RoleLevelCfgArray.Instance.GetCfg(RoleDataManager.lvl).baseScore; arrayList.Sort((CardData a, CardData b) => { double scoreA = GetSkillFightScore(itemSum, baseScore, a.id, a.scores[scoreType], SkillDataManager.Instance.GetSkillLvs(a.id)); double scoreB = GetSkillFightScore(itemSum, baseScore, b.id, b.scores[scoreType], SkillDataManager.Instance.GetSkillLvs(b.id)); if (scoreA < scoreB) { return 1; } else if (scoreA > scoreB) { return -1; } return string.Compare(a.itemCfg.res, b.itemCfg.res); }); return arrayList; } /// /// 获取技能战力 /// /// /// /// /// /// /// public long GetSkillFightScore(double itemScoreSum, int baseScore, int cardId, int cardScore, List skillLvs) { // double itemSum = itemScoreSum; long skillScore = 0; long skillBaseScore = (long)itemScoreSum + cardScore + baseScore; List skillCfgs = PassivitySkillCfgArray.Instance.GetCfgsBycardId(cardId); for (int j = 0; j < skillCfgs.Count; j++) { // ET.Log.Debug("cardId:" + cardId + " skillLvs:" + skillLvs.Count + " skillCfgs:" + skillCfgs.Count + " index:" + j); PassivitySkillLvlCfg skillLvlCfg = PassivitySkillLvlCfgArray.Instance.GetCfgByskilllvlAndskillId(skillLvs[j], skillCfgs[j].skillId); if (skillLvlCfg == null) continue; skillScore += skillBaseScore * skillLvlCfg.fightPowerParam / 10000; } return skillScore; } /// /// 获取快速挑战结果 /// /// /// /// /// /// /// public void GetQuickFightResult(int roundIndex, FightRoleData myRoleData, int targetType, FightRoleData targetRoleData, FightRobotData targetRobotData, out long _score, out long _targetScore) { double score = 0; double targetScore = 0; int cardId = myRoleData.cardId; double mainScore = ScoreSystemData.Instance.GetMainScore(myRoleData); List skillLvs = myRoleData.skillLvs; int targetCardId; double targetMainScore; List targetSkillLvs; List targetRoundTime; List roundTime = ScoreSystemData.Instance.GetRoundTime(myRoleData.cardId, myRoleData.skillLvs); if (targetType == ArenaFightTargetType.PLAYER) { targetCardId = targetRoleData.cardId; targetSkillLvs = targetRoleData.skillLvs; targetMainScore = ScoreSystemData.Instance.GetMainScore(targetRoleData); targetRoundTime = ScoreSystemData.Instance.GetRoundTime(targetRoleData.cardId, targetRoleData.skillLvs); } else { targetCardId = targetRobotData.cardId; targetSkillLvs = targetRobotData.skillLvs; targetMainScore = ScoreSystemData.Instance.GetRobotMainScore(targetRobotData); targetRoundTime = ScoreSystemData.Instance.GetRoundTime(targetRobotData.cardId, targetRobotData.skillLvs); } if (InstanceZonesDataManager.FightScene == ConstInstanceZonesType.Arena) { ArenaDataManager.Instance.roundTime = roundTime; ArenaDataManager.Instance.targetRoundTime = targetRoundTime; if (!ArenaDataManager.Instance.vaildSkills.ContainsKey(roundIndex)) ArenaDataManager.Instance.vaildSkills[roundIndex] = new Dictionary>>(); if (!ArenaDataManager.Instance.targetVaildSkills.ContainsKey(roundIndex)) ArenaDataManager.Instance.targetVaildSkills[roundIndex] = new Dictionary>>(); } int partId = 0; int currentTime = BeginTime.PART_ALL_FIGHT_BEGIN; GetSkillScore(FightRoleType.MINE, roundIndex, currentTime, partId, mainScore, cardId, skillLvs, roundTime, ref score, targetMainScore, targetCardId, targetSkillLvs, targetRoundTime, ref targetScore); GetSkillScore(FightRoleType.TAEGET, roundIndex, currentTime, partId, targetMainScore, targetCardId, targetSkillLvs, targetRoundTime, ref targetScore, mainScore, cardId, skillLvs, roundTime, ref score); for (int i = 0; i < FightScoreCfgArray.Instance.dataArray.Length; i++) { partId++; currentTime = BeginTime.PART_FIGHT_BEGIN; GetSkillScore(FightRoleType.MINE, roundIndex, currentTime, partId, mainScore, cardId, skillLvs, roundTime, ref score, targetMainScore, targetCardId, targetSkillLvs, targetRoundTime, ref targetScore); GetSkillScore(FightRoleType.TAEGET, roundIndex, currentTime, partId, targetMainScore, targetCardId, targetSkillLvs, targetRoundTime, ref targetScore, mainScore, cardId, skillLvs, roundTime, ref score); score += ScoreSystemData.Instance.GetPartScore(myRoleData, partId, ClickType.PREFACT_CLICK, 0); if (targetType == ArenaFightTargetType.PLAYER) { targetScore += ScoreSystemData.Instance.GetPartScore(targetRoleData, partId, ClickType.PREFACT_CLICK, 0); } else { targetScore += ScoreSystemData.Instance.GetRobotPartScore(targetRobotData, partId, ClickType.PREFACT_CLICK, 0); } currentTime = BeginTime.PART_PREFACT_CLICK; GetSkillScore(FightRoleType.MINE, roundIndex, currentTime, partId, mainScore, cardId, skillLvs, roundTime, ref score, targetMainScore, targetCardId, targetSkillLvs, targetRoundTime, ref targetScore); GetSkillScore(FightRoleType.TAEGET, roundIndex, currentTime, partId, targetMainScore, targetCardId, targetSkillLvs, targetRoundTime, ref targetScore, mainScore, cardId, skillLvs, roundTime, ref score); currentTime = BeginTime.PART_FIGHT_END; GetSkillScore(FightRoleType.MINE, roundIndex, currentTime, partId, mainScore, cardId, skillLvs, roundTime, ref score, targetMainScore, targetCardId, targetSkillLvs, targetRoundTime, ref targetScore); GetSkillScore(FightRoleType.TAEGET, roundIndex, currentTime, partId, targetMainScore, targetCardId, targetSkillLvs, targetRoundTime, ref targetScore, mainScore, cardId, skillLvs, roundTime, ref score); } score += ScoreSystemData.Instance.GetAllCircleAddScore(mainScore); targetScore += ScoreSystemData.Instance.GetAllCircleAddScore(targetMainScore); _score = Mathf.CeilToInt((float)score); _targetScore = Mathf.CeilToInt((float)targetScore); } private void GetSkillScore(int roleType, int roundIndex, int currentTime, int partId, double mainScore, int cardId, List skillLvs, List roundTime, ref double score, double targetMainScore, int targetCardId, List targetSkillLvs, List targetRoundTime, ref double targetScore) { List vaildSkills = ScoreSystemData.Instance.GetValidSkills(currentTime, partId, cardId, skillLvs, targetCardId, targetSkillLvs, roundTime, targetRoundTime); ScoreSystemData.Instance.GetPartItemSkillScore(vaildSkills, mainScore, targetMainScore, out int skillScore, out int targetSkillScore, out Dictionary skillScoreDic); score += skillScore; targetScore += targetSkillScore; if (InstanceZonesDataManager.FightScene == ConstInstanceZonesType.Arena) { ArenaDataManager dataManager = ArenaDataManager.Instance; if (roleType == FightRoleType.MINE) { if (!dataManager.vaildSkills[roundIndex].ContainsKey(partId)) dataManager.vaildSkills[roundIndex][partId] = new Dictionary>(); dataManager.vaildSkills[roundIndex][partId][currentTime] = vaildSkills; } else { if (!dataManager.targetVaildSkills[roundIndex].ContainsKey(partId)) dataManager.targetVaildSkills[roundIndex][partId] = new Dictionary>(); dataManager.targetVaildSkills[roundIndex][partId][currentTime] = vaildSkills; } } } } }