//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Monday, October 09, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using TableConfig; using System; using System.Text.RegularExpressions; namespace Snxxz.UI { public class Treasure { public int id { get; private set; } int m_Level; public int level { get { return m_Level; } set { m_Level = value; } } int m_Stage; public int stage { get { return m_Stage; } private set { m_Stage = value; } } int m_Exp; public int exp { get { return m_Exp; } private set { m_Exp = value; } } bool m_HasClickChallenge = false; public bool hasClickChallenge { get { return m_HasClickChallenge; } set { m_HasClickChallenge = value; } } TreasureState m_State = TreasureState.Locked; public TreasureState state { get { return m_State; } set { m_State = value; } } #region 旧数据 int m_Progress = 0; public int progress { get { return m_Progress; } set { m_Progress = value; } } public bool isChallengeDungeonAble { get { if (state != TreasureState.Collecting) { return false; } var config = ConfigManager.Instance.GetTemplate(id); return progress >= config.RequirementTotal;// && config.LastSuccID > 0; } } public int unLockSkill { get { var job = PlayerDatas.Instance.baseData.Job; var stage = treasureStages.Find((x) => { return x.unlockType == TreasureStageUnlock.Skill; }); return stage != null ? stage.GetSkill(job) : 0; } } public int unLockFunc { get; private set; } public int unLockPrivilege { get; private set; } Dictionary> jobToPotentials = new Dictionary>(); public List potentials { get { if (jobToPotentials.ContainsKey(PlayerDatas.Instance.baseData.Job)) { return jobToPotentials[PlayerDatas.Instance.baseData.Job]; } else { return null; } } } public List achievements = new List(); public Dictionary achievementGroups = new Dictionary(); public Item[] needItems { get; private set; } public Redpoint skillLevelUpRedpoint { get; private set; } public Redpoint achievementRedpoint { get; private set; } public Treasure(int _id) { this.id = _id; } public Treasure(int _id, int[] _potentialIds, Redpoint _skillLevelUpRedpoint, Redpoint _achievementPoint) { this.id = _id; this.skillLevelUpRedpoint = _skillLevelUpRedpoint; this.achievementRedpoint = _achievementPoint; var config = ConfigManager.Instance.GetTemplate(this.id); List _expAchievements; if (SuccessConfig.TryGetTreasureExpAchievements(_id, out _expAchievements)) { achievements.AddRange(_expAchievements); } foreach (var achievement in achievements) { var achievementConfig = ConfigManager.Instance.GetTemplate(achievement); AchievementGroup group; if (achievementGroups.ContainsKey(achievementConfig.Group)) { group = achievementGroups[achievementConfig.Group]; } else { achievementGroups[achievementConfig.Group] = group = new AchievementGroup(achievementConfig.Group); } group.AddAchievement(achievement); } foreach (var group in achievementGroups.Values) { group.Sort(); } for (int i = 0; i < _potentialIds.Length; i++) { var skillId = _potentialIds[i]; var skillConfig = ConfigManager.Instance.GetTemplate(skillId); if (skillConfig == null) { continue; } for (int j = 0; j < GeneralConfig.Instance.openJobs.Length; j++) { var job = GeneralConfig.Instance.openJobs[j]; List tempPotentials; if (jobToPotentials.ContainsKey(job)) { tempPotentials = jobToPotentials[job]; } else { jobToPotentials[job] = tempPotentials = new List(); } if (skillConfig.UseType == 0 || skillConfig.UseType == 1 << job) { tempPotentials.Add(new TreasurePotential(skillId, 0)); } } } if (!string.IsNullOrEmpty(config.NeedItem)) { try { var stringSet = config.NeedItem.Split('|'); needItems = new Item[stringSet.Length]; for (int i = 0; i < needItems.Length; i++) { var itemStrings = stringSet[i].Split('_'); needItems[i] = new Item(int.Parse(itemStrings[0]), int.Parse(itemStrings[1])); } } catch (Exception ex) { Debug.Log(ex.StackTrace); } } else { needItems = null; } } public TreasurePotential GetPotential(int _potentialId) { if (potentials == null) { return null; } else { for (int i = 0; i < potentials.Count; i++) { var potential = potentials[i]; if (potential.id == _potentialId) { return potential; } } return null; } } public void UpdatePotentialLevel(int _potentialId, int _level) { for (int i = 0; i < potentials.Count; i++) { var potential = potentials[i]; if (potential.id == _potentialId) { potential.level = _level; break; } } } public AchievementGroup FindAchievementGroup(int _achievementId) { foreach (var key in achievementGroups.Keys) { var achievementGroup = achievementGroups[key]; if (achievementGroup.Contain(_achievementId)) { return achievementGroup; } } return null; } private int AchievementCompare(int _lhs, int _rhs) { var configA = ConfigManager.Instance.GetTemplate(_lhs); var configB = ConfigManager.Instance.GetTemplate(_rhs); return configA.ReOrder < configB.ReOrder ? -1 : 1; } #endregion public TreasureSpecialData specialData { get; private set; } public List treasureStages = new List(); public void UpdateTreasureStage(TreasureUpConfig _cfg) { TreasureStage _stage; if (_cfg.UnLockFuncID != 0) { _stage = new TreasureStage(_cfg.UnLockFuncID); unLockFunc = _stage.func; } else if (_cfg.Privilege != 0) { _stage = new TreasureStage(_cfg.Privilege, TreasureStageUnlock.Privilege); specialData = _stage.specialData; unLockPrivilege = _stage.privilege; } else if (_cfg.UnLockSkill != null && _cfg.UnLockSkill.Length > 1) { _stage = new TreasureStage(_cfg.UnLockSkill); } else if (!_cfg.AddAttr.Equals(string.Empty)) { _stage = new TreasureStage(_cfg.AddAttr); } else { _stage = new TreasureStage(); } _stage.exp = _cfg.NeedExp; _stage.stage = _cfg.LV; _stage.limitLevel = _cfg.LVLimit; treasureStages.Add(_stage); } public void UpdateTreasureLevelExp(int _lv, int _exp, bool _hasClickChallenge) { stage = _lv; exp = _exp; hasClickChallenge = _hasClickChallenge; if ((this is HumanTreasure) && IsMaxStage()) { (this as HumanTreasure).humanState = HumanTreasureState.Potential; } } public bool IsMaxStage() { return treasureStages.FindIndex((x) => { return x.stage >= stage + 1; }) == -1; } public bool IsUnlockStage(TreasureStageUnlock _type) { var _stage = treasureStages.Find((x) => { return x.unlockType == _type; }); if (_stage == null) { return false; } return stage >= _stage.stage; } public int GetStageIndex(int _stage) { if (treasureStages[0].unlockType == TreasureStageUnlock.None) { return Mathf.Max(_stage - 1, 0); } return _stage; } public int StageCount { get { return treasureStages.Count; } } } public class HumanTreasure : Treasure { HumanTreasureState m_State = HumanTreasureState.Locked; public HumanTreasureState humanState { get { return m_State; } set { m_State = value; if (value == HumanTreasureState.CastSoul) { if (IsMaxStage()) { m_State = HumanTreasureState.Potential; } } ModelCenter.Instance.GetModel().HumanTreasureStateChange(base.id); } } public HumanTreasure(int _id) : base(_id) { } public HumanTreasure(int _id, int[] _potentialIds, Redpoint _skillLevelUpRedpoint, Redpoint _achievementPoint , Redpoint _castSoulPoint) : base(_id, _potentialIds, _skillLevelUpRedpoint, _achievementPoint) { castSoulRedpoint = _castSoulPoint; } public Redpoint castSoulRedpoint { get; private set; } } public class AchievementGroup { AchievementModel model { get { return ModelCenter.Instance.GetModel(); } } public int group { get; private set; } List achievements = new List(); public AchievementGroup(int _category) { group = _category; } public void AddAchievement(int _achievement) { if (!achievements.Contains(_achievement)) { achievements.Add(_achievement); } } public void Sort() { achievements.Sort(AchievementCompare); } public bool Contain(int _achievementId) { return achievements.Contains(_achievementId); } public bool IsAwardable() { var doingAchievement = GetDoingAchievement(); if (doingAchievement > 0) { Achievement achievement; if (model.TryGetAchievement(doingAchievement, out achievement) && !achievement.completed) { return Achievement.IsReach(doingAchievement, achievement.progress); } } return false; } public bool IsCompleted() { var achievementId = GetDoingAchievement(); Achievement doingAchievement; if (model.TryGetAchievement(achievementId, out doingAchievement) && doingAchievement.completed) { return true; } for (int i = 0; i < achievements.Count; i++) { var id = achievements[i]; Achievement achievement; if (model.TryGetAchievement(id, out achievement) && !achievement.completed) { return false; } } return true; } public int GetDoingAchievement() { var achievementId = 0; for (int i = 0; i < achievements.Count; i++) { var id = achievements[i]; Achievement achievement; var config = ConfigManager.Instance.GetTemplate(id); if (config == null || PlayerDatas.Instance.baseData.LV < config.Condition3) { continue; } if (model.TryGetAchievement(id, out achievement) && !achievement.completed) { return id; } achievementId = id; } return achievementId; } public int GetLastAchievement() { if (achievements.Count == 0) { return 0; } else { var achievementId = GetDoingAchievement(); Achievement doingAchievement; if (model.TryGetAchievement(achievementId, out doingAchievement) && doingAchievement.completed) { return achievementId; } return achievements[achievements.Count - 1]; } } private int AchievementCompare(int _lhs, int _rhs) { var configA = ConfigManager.Instance.GetTemplate(_lhs); var configB = ConfigManager.Instance.GetTemplate(_rhs); return configA.ReOrder.CompareTo(configB.ReOrder); } public static int Compare(AchievementGroup _lhs, AchievementGroup _rhs) { var awardableA = _lhs.IsAwardable(); var awardableB = _rhs.IsAwardable(); if (awardableA != awardableB) { return awardableA ? -1 : 1; } else { var completedA = _lhs.IsCompleted(); var completedB = _rhs.IsCompleted(); if (completedA != completedB) { return completedA.CompareTo(completedB); } else if (completedA && completedB) { return _lhs.group < _rhs.group ? -1 : 1; } else { var idA = _lhs.GetDoingAchievement(); var idB = _rhs.GetDoingAchievement(); var configA = ConfigManager.Instance.GetTemplate(idA); var configB = ConfigManager.Instance.GetTemplate(idB); if (configA == null) { return 1; } else if (configB == null) { return -1; } else if (configA == null && configB == null) { return 0; } else { return configA.ReOrder < configB.ReOrder ? -1 : 1; } } } } } public class TreasurePotential { public int id { get; private set; } public int level { get; set; } public TreasurePotential(int _id, int _level) { this.id = _id; this.level = _level; } } public struct PotentialBook { public int itemId; public int needCount; public int successRate; public int levelUpId; public PotentialBook(int _itemId, int _needCount, int _successRate,int _levelUpId) { this.itemId = _itemId; this.needCount = _needCount; this.successRate = _successRate; this.levelUpId = _levelUpId; } } public struct VIPKillNPCTreasure { public int level; public long currentExp; } public class TreasureStage { public int stage { get; set; } public TreasureStageUnlock unlockType { get; private set; } public Dictionary propertyDict { get; private set; } public Dictionary skillDict { get; private set; } public int func { get; private set; } public int privilege { get; private set; } public int exp { get; set; } public TreasureSpecialData specialData { get; private set; } public int stateSfxId { get; private set; } public const int selectedSfxId = 5144; public string sfxGotState { get; private set; } public string sfxUnGotState { get; private set; } public int limitLevel { get; set; } public TreasureStage() { unlockType = TreasureStageUnlock.None; } public TreasureStage(int _value, TreasureStageUnlock _type = TreasureStageUnlock.Func) { unlockType = _type; func = _type == TreasureStageUnlock.Func ? _value : 0; privilege = _type == TreasureStageUnlock.Privilege ? _value : 0; stateSfxId = 5141; sfxGotState = "Effect_FaBao_Icon_JiNeng_01"; sfxUnGotState = "Effect_FaBao_Icon_JiNeng_02"; //stateSfxId = _type == TreasureStageUnlock.Func ? 5140 : 5143; //sfxGotState = _type == TreasureStageUnlock.Func ? "Effect_FaBao_Icon_GongNeng_01" : "Effect_FaBao_Icon_TeQuan_02"; //sfxUnGotState = _type == TreasureStageUnlock.Func ? "Effect_FaBao_Icon_GongNeng" : "Effect_FaBao_Icon_TeQuan"; if (_type == TreasureStageUnlock.Privilege) { SetSpecial(); } } public TreasureStage(string _property) { unlockType = TreasureStageUnlock.Property; propertyDict = ConfigParse.GetDic(_property); stateSfxId = propertyDict.ContainsKey(6) ? 5142 : 5139; sfxGotState = propertyDict.ContainsKey(6) ? "Effect_FaBao_Icon_ShengMing" : "Effect_FaBao_Icon_GongJi"; sfxUnGotState = propertyDict.ContainsKey(6) ? "Effect_FaBao_Icon_ShengMing" : "Effect_FaBao_Icon_GongJi"; } public TreasureStage(int[] _skills) { unlockType = TreasureStageUnlock.Skill; stateSfxId = 5141; sfxGotState = "Effect_FaBao_Icon_JiNeng_01"; sfxUnGotState = "Effect_FaBao_Icon_JiNeng_02"; skillDict = new Dictionary(); for (int i = 0; i < _skills.Length; i++) { skillDict.Add(i + 1, _skills[i]); } } public void SetSpecial() { var _priviligeCfg = ConfigManager.Instance.GetTemplate(privilege); specialData = new TreasureSpecialData((TreasurePrivilege)_priviligeCfg.PrivilegeID); } public int GetSkill(int _job) { if (skillDict.ContainsKey(_job)) { return skillDict[_job]; } return 0; } public int GetFightPower() { switch (unlockType) { case TreasureStageUnlock.Property: return UIHelper.GetFightPower(propertyDict); case TreasureStageUnlock.Skill: var _job = PlayerDatas.Instance.baseData.Job; var _skillCfg = ConfigManager.Instance.GetTemplate(GetSkill(_job)); if (_skillCfg != null) { return _skillCfg.FightPower; } break; case TreasureStageUnlock.Privilege: return specialData.GetFightPower(); } return 0; } } public enum TreasureStageUnlock { None, Property, Skill, Func, Privilege, } public enum TreasurePrivilege { Property = 1, DemonJarAtk = 2, StrengthenAdd = 3, RuneBreakExpAdd = 4, MountAtk = 5, PetHp = 6, Boss = 7, Wing = 8, Suit = 9, Wash = 10, Sign = 11, } public enum TreasurePrivilegeState { Doing = 0, Reward = 1, Complete = 2 } public class TreasureSpecialData { public TreasurePrivilege type { get; private set; } public int progress { get; private set; } public int totalProgress { get; private set; } public int effectValue { get; private set; } public List items { get; private set; } public Dictionary propertyDict { get; private set; } public Redpoint privilegeRedpoint { get; private set; } private TreasurePrivilegeState m_State = TreasurePrivilegeState.Doing; public TreasurePrivilegeState state { get { return m_State; } set { m_State = value; } } public int presentFinishCount { get; set; } public int presentGetCount { get; set; } public bool itemGet { get; set; } public TreasureSpecialData(TreasurePrivilege _type) { type = _type; var config = ConfigManager.Instance.GetTemplate((int)_type); progress = Mathf.Max(1, config.singleValue); totalProgress = config.maxValue; var _effectValue = 0; int.TryParse(config.EffectValue, out _effectValue); effectValue = _effectValue; if (!string.IsNullOrEmpty(config.attr)) { var propertyJson = LitJson.JsonMapper.ToObject(config.attr); propertyDict = new Dictionary(); foreach (var _key in propertyJson.Keys) { var _property = int.Parse(_key); var _value = int.Parse(propertyJson[_key].ToJson()); propertyDict.Add(_property, _value); } } if (!string.IsNullOrEmpty(config.itemAward)) { var itemArray = LitJson.JsonMapper.ToObject(config.itemAward); if (itemArray != null && itemArray.Length > 0) { items = new List(); for (int i = 0; i < itemArray.Length; i++) { var _array = itemArray[i]; items.Add(new AwardItem() { isBind = _array[2], item = new Item() { id = _array[0], count = _array[1], }, }); } } } if (type == TreasurePrivilege.PetHp) { var petCount = ConfigManager.Instance.GetAllValues().Count; totalProgress = petCount; } else if (type == TreasurePrivilege.MountAtk) { var mountConfigs = ConfigManager.Instance.GetAllValues(); var maxlv = 0; for (int i = 0; i < mountConfigs.Count; i++) { maxlv += mountConfigs[i].MaxLV; } totalProgress = maxlv; } else if (type == TreasurePrivilege.StrengthenAdd) { var configs = ConfigManager.Instance.GetAllValues(); totalProgress = configs[configs.Count - 1].countNeed; } switch (_type) { case TreasurePrivilege.DemonJarAtk: case TreasurePrivilege.StrengthenAdd: case TreasurePrivilege.MountAtk: case TreasurePrivilege.PetHp: case TreasurePrivilege.Boss: case TreasurePrivilege.Wash: privilegeRedpoint = new Redpoint(TreasureModel.TREASURE_SOUL_ID, TreasureModel.TREASURE_SOUL_ID * 100 + (int)type); break; } } public int GetPrivilegeValue(int _index = 0) { switch (type) { case TreasurePrivilege.RuneBreakExpAdd: return effectValue; case TreasurePrivilege.DemonJarAtk: case TreasurePrivilege.Suit: return effectValue; case TreasurePrivilege.Wing: case TreasurePrivilege.StrengthenAdd: return effectValue; } return 0; } public void UpdateState() { switch (type) { case TreasurePrivilege.Property: case TreasurePrivilege.RuneBreakExpAdd: case TreasurePrivilege.Wing: case TreasurePrivilege.Suit: state = TreasurePrivilegeState.Complete; break; case TreasurePrivilege.Boss: case TreasurePrivilege.DemonJarAtk: case TreasurePrivilege.PetHp: case TreasurePrivilege.MountAtk: privilegeRedpoint.state = RedPointState.None; if (presentFinishCount >= totalProgress && (presentGetCount / progress) >= (totalProgress / progress)) { state = TreasurePrivilegeState.Complete; } else if (presentGetCount > 0 && presentFinishCount / progress < presentGetCount / progress) { state = TreasurePrivilegeState.Reward; privilegeRedpoint.state = RedPointState.Simple; } else { state = TreasurePrivilegeState.Doing; } break; case TreasurePrivilege.Wash: privilegeRedpoint.state = itemGet ? RedPointState.None : RedPointState.Simple; state = itemGet ? TreasurePrivilegeState.Doing : TreasurePrivilegeState.Reward; break; case TreasurePrivilege.StrengthenAdd: privilegeRedpoint.state = RedPointState.None; var strengthen = ModelCenter.Instance.GetModel(); var playerpack = ModelCenter.Instance.GetModel(); presentGetCount = 0; foreach (var value in strengthen._EqInfo.Values) { ItemModel itemModel = playerpack.GetItemModelByIndex(PackType.rptEquip, value.EquipIndex); if (itemModel != null) { presentGetCount += value.EquipPartStarLV; } } var configs = ConfigManager.Instance.GetAllValues(); bool contains = configs.FindIndex((x) => { return x.countNeed > presentFinishCount && presentGetCount >= x.countNeed; }) != -1; if (presentFinishCount >= totalProgress && presentGetCount >= totalProgress) { state = TreasurePrivilegeState.Complete; } else if (contains) { state = TreasurePrivilegeState.Reward; privilegeRedpoint.state = RedPointState.Simple; } else { state = TreasurePrivilegeState.Doing; } break; } } public string ProgressDisplay() { switch (type) { case TreasurePrivilege.DemonJarAtk: case TreasurePrivilege.PetHp: case TreasurePrivilege.MountAtk: case TreasurePrivilege.Boss: if (state == TreasurePrivilegeState.Complete) { return UIHelper.GetTextColorByItemColor(TextColType.Green, totalProgress.ToString(), true); } else if (state == TreasurePrivilegeState.Doing) { return StringUtility.Contact(UIHelper.GetTextColorByItemColor(TextColType.Red, presentGetCount.ToString(), true), "/", (presentFinishCount / progress + 1) * progress); } else if (state == TreasurePrivilegeState.Reward) { var _completeCount = (presentFinishCount / progress + 1) * progress; return StringUtility.Contact(UIHelper.GetTextColorByItemColor(TextColType.Green, presentGetCount.ToString(), true), "/", _completeCount); } break; case TreasurePrivilege.StrengthenAdd: var configs = ConfigManager.Instance.GetAllValues(); var next = configs.Count - 1; for (int i = 0; i < configs.Count; i++) { if (configs[i].countNeed > presentFinishCount) { next = i; break; } } if (state == TreasurePrivilegeState.Complete) { return totalProgress.ToString(); } else if (state == TreasurePrivilegeState.Doing || state == TreasurePrivilegeState.Reward) { var colortype = presentGetCount >= configs[next].countNeed ? TextColType.Green : TextColType.Red; return StringUtility.Contact(UIHelper.GetTextColorByItemColor(colortype, presentGetCount.ToString(), true), "/", configs[next].countNeed); } break; } return string.Empty; } public void GetReward() { switch (type) { case TreasurePrivilege.MountAtk: case TreasurePrivilege.DemonJarAtk: case TreasurePrivilege.PetHp: case TreasurePrivilege.Boss: case TreasurePrivilege.Wash: var _pak = new CA504_tagCMPlayerGetReward(); _pak.RewardType = (int)GotServerRewardType.Def_RewardType_TreasureSoul; _pak.DataEx = (uint)type; _pak.DataExStrLen = 0; _pak.DataExStr = string.Empty; GameNetSystem.Instance.SendInfo(_pak); break; case TreasurePrivilege.StrengthenAdd: var configs = ConfigManager.Instance.GetAllValues(); var present = 0; for (int i = 0; i < configs.Count; i++) { if (presentGetCount >= configs[i].countNeed) { present = i; } } CA503_tagCMActiveAllEquipAttr pak = new CA503_tagCMActiveAllEquipAttr(); pak.Type = 0; pak.Cnt = (uint)configs[present].countNeed; GameNetSystem.Instance.SendInfo(pak); break; } } public int GetFightPower() { var _fightPower = 0; if (propertyDict != null) { _fightPower += UIHelper.GetFightPower(propertyDict); } return _fightPower; } } }