// *********************************************************************** // Assembly : Unity // Author : Kimch // Created : 2017-10-24 // // Last Modified By : Kimch // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System; using UnityEngine; namespace G { public class Mission : IComparable { #region Enum public enum Status : byte { None = 2, Complete = 1, Reward = 3, } public enum Type { Daily = 1, Achievement = 2, } #endregion #region Field public readonly ItemMission item; private CodeStage.AntiCheat.ObscuredTypes.ObscuredInt _curValue; private CodeStage.AntiCheat.ObscuredTypes.ObscuredBool _rewarded; private Item.ItemInfo[] _rewardInfos; #endregion #region Properties /// /// /// public int id => item.id; /// /// /// public string name { get { return KLocalization.GetLocalString(item.nameId); } } /// /// /// public string description { get { #if UNITY_EDITOR try { #endif if (item.descriptionId > 0) { var descriptionFormat = KLocalization.GetLocalString(item.descriptionId); if (eventArg1 > 0) return string.Format(descriptionFormat, maxValue, eventArg1); else return string.Format(descriptionFormat, item.eventTarget); } return ""; #if UNITY_EDITOR } catch (Exception ex) { Debug.LogException(ex); return $"任务 {item.id} 描述异常 {ex.Message}"; } #endif } } /// /// /// public string missionText { get { #if UNITY_EDITOR try { #endif if (item.descriptionId > 0) { var descriptionFormat = KLocalization.GetLocalString(item.descriptionId); if (eventArg1 > 0) return string.Format(descriptionFormat, maxValue, eventArg1) + $"({curValue}/{maxValue})"; else return string.Format(descriptionFormat, maxValue) + $"({curValue}/{maxValue})"; } return ""; #if UNITY_EDITOR } catch (Exception ex) { Debug.LogException(ex); return item.id + " " + ex.Message; } #endif } } /// /// 主线 /// public string missionText2 { get { #if UNITY_EDITOR try { #endif if (item.descriptionId > 0) { var descriptionFormat = KLocalization.GetLocalString(item.descriptionId); if (eventArg1 > 0) return string.Format(descriptionFormat, maxValue, eventArg1) + $"({curValue}/{maxValue})"; else return string.Format(descriptionFormat, maxValue) + $"({curValue}/{maxValue})"; } return ""; #if UNITY_EDITOR } catch (Exception ex) { Debug.LogException(ex); return item.id + " " + ex.Message; } #endif } } /// /// 名字加数量 /// public string rewardText { get { if (rewards != null && rewards.Length > 0) { var reward = rewards[0]; return $"奖励:{reward.propItem.name}x{reward.count}"; } return default; } } /// /// 数量 /// public string rewardText2 { get { if (rewards != null && rewards.Length > 0) { var reward = rewards[0]; return $"x{reward.count}"; } return default; } } /// /// /// public Item.ItemInfo[] rewards => _rewardInfos; /// /// /// public int eventId => item.eventId; /// /// 参数1 /// public int eventArg1 => item.eventArgs != null && item.eventArgs.Length > 0 ? item.eventArgs[0] : 0; /// /// 参数2 /// public int eventArg2 => item.eventArgs != null && item.eventArgs.Length > 1 ? item.eventArgs[1] : 0; /// /// /// /// /// public bool CheckEventArg1(int arg) { return item.eventArgs == null || item.eventArgs.Length == 0 || item.eventArgs[0] == arg; } /// /// /// /// /// public bool OverEventArg1(int arg) { return item.eventArgs == null || item.eventArgs.Length == 0 || item.eventArgs[0] <= arg; } /// /// /// /// /// /// public bool CheckEventArg2(int arg1, int arg2) { return item.eventArgs == null || item.eventArgs.Length == 0 || (item.eventArgs[0] == arg1 && (item.eventArgs.Length < 2 || item.eventArgs[1] == arg2)); } /// /// /// /// /// /// public bool OverEventArg2(int arg1, int arg2) { return item.eventArgs == null || item.eventArgs.Length == 0 || (item.eventArgs[0] <= arg1 && (item.eventArgs.Length < 2 || item.eventArgs[1] <= arg2)); } /// /// 前置任务 /// public Mission prevMission { get { return MissionProxy.Instance.GetMission(item.prev); } } /// /// 下个任务 /// public Mission nextMission { get; set; } /// /// /// public Mission[] nextMissions { get; } /// /// 必要条件 /// public Mission requirementMission { get { return MissionProxy.Instance.GetMission(item.requirement); } } /// /// 主任务 /// public Mission mainMission { get { return item.id > 0 ? MissionProxy.Instance.GetMission(item.requirement) : default; } } /// /// 最大值 /// public int maxValue { get => item.eventTarget; } /// /// 当前值 /// public int curValue { get => _curValue; set { if (_curValue < maxValue && value > _curValue) { _curValue = value; if (_curValue >= maxValue) { MissionProxy.Instance.OnMissionCompleted(this); if (this.item.type == 6) { RewardProxy.Instance.GetRewards(rewards); } } } } } /// /// /// public bool isCompleted { get { return _curValue >= maxValue; } } /// /// 可以领取状态 /// public bool isRewarding { get { return !_rewarded && isCompleted; } } /// /// 已经领取 /// public bool isRewarded { get { return _rewarded; } set { _rewarded = true; } } /// /// /// public bool isValid { get { return !this.isCompleted && (item.requirement == 0 || requirementMission.isCompleted); } } /// /// 排序 /// public int sortingOrder { get { if (isRewarded) { return 3; } if (isCompleted) { return 1; } else { return 2; } } } /// /// /// public float progress { get { return curValue / Mathf.Max(1f, maxValue); } } #endregion #region Method public Mission(ItemMission item) { this.item = item; _rewardInfos = Item.ItemInfo.FromArray(item.rewards); } public void Set(int data) { GlobalUtils.SplitNumber824(data, out int status, out int value); _curValue = value; _rewarded = (status == 3); } public int Get() { return GlobalUtils.CombineNumber824(isRewarded ? 3 : 0, _curValue); } public void Reset() { _curValue = 0; _rewarded = false; } public int CompareTo(Mission other) { var result = this.sortingOrder.CompareTo(other.sortingOrder); return result != 0 ? result : this.id.CompareTo(other.id); } #endregion } }