using System; using System.Collections.Generic; using IVDataFormat; using IVServerFormat; using System.Numerics; using Sirenix.Utilities; [Serializable] public class HuntEagleDgData : GameModData, IHasRewards, IAutoProgressable { HuntEagleDgProp Property => property as HuntEagleDgProp; HuntEagleDgPlayProp PlayProperty => playProperty as HuntEagleDgPlayProp; int requestCount = 0; Action, bool> onDoneGetResult; public override string NameKey => "dungeon_title_HuntEagle"; public int OpenStage => (int)Property.openStage; public bool AutoProgress { get; set; } public HuntEagleDgProp.EnemyCreator NormalEnemyCreator => Property.normalEnemyCreator; public int WaveCount => Property.waveCount; public float LimitTime => Property.limitTime; public uint EnterTicketCount { get => PlayProperty.enterTicketCount; set => PlayProperty.enterTicketCount = value; } public IList DefaultRewards { get; private set; } public IList TotalRewards { get { //TODO: DefaultReward + BonusReward return DefaultRewards; } } public HuntEagleDgData(HuntEagleDgProp property, HuntEagleDgPlayProp playProperty) : base(property, playProperty) { Property.rewards.Sort((a, b) => a.lvRange.start.CompareTo(b.lvRange.start)); SetLevel(Level); } public override void SetLevel(uint level) { level = Math.Min(level, MaxLevel); DefaultRewards = GetRewardList(level); PlayProperty.level = level; } public bool IsClear(uint level) => level < Level; public void TryGetReward(Action, bool> onRequestDone) { if (requestCount > 0) return; requestCount = DefaultRewards.Count; onDoneGetResult = onRequestDone; foreach (var reward in TotalRewards) { SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.Property), typeof(nGoodsGet), OnGetRewardSuccess, OnGetRewardFail, reward, true); } if (requestCount == 0) onDoneGetResult?.Invoke(new nGoods[0], true); } private void OnGetRewardSuccess(object result, object request) { if (--requestCount <= 0) { nGoodsGet data = result as nGoodsGet; var totalReward = TotalRewards; DataHandler.AddGoods(totalReward, data.playCurrency, true); onDoneGetResult?.Invoke(totalReward, true); } } private void OnGetRewardFail(SvError error, object request) => onDoneGetResult?.Invoke(new nGoods[0], false); public IList GetRewardList(uint level) { if (Property.rewards.TryBinarySearch( (v) => { if (v.lvRange.InRange(level)) return 0; else return v.lvRange.start.CompareTo(level); }, out var targetIdx)) { var lvRangeReward = Property.rewards[targetIdx]; var result = new List(); for(int i = 0; i < lvRangeReward.defaultRewards.Length; i++) { var reward = lvRangeReward.defaultRewards[i]; var goods = reward.itemProp.ConvertTo(reward.GetCount(level)); if(result.TryFind(goods.IsSameGoods, out var exist)) exist.propertyCount += goods.propertyCount; else result.Add(goods); } //NOTE: this is reward of only once when player clear the dungeon if(!IsClear(level)) { for(int i = 0; i < lvRangeReward.initialClearRewards.Length; i++) { var reward = lvRangeReward.initialClearRewards[i]; var goods = reward.itemProp.ConvertTo(reward.GetCount(level)); if(result.TryFind(goods.IsSameGoods, out var exist)) exist.propertyCount += goods.propertyCount; else result.Add(goods); } } return result.ToArray(); } return new nGoods[0]; } public BigInteger GetRecommendBattlePower(uint level) => DataHandler.CalcBattlePower(0, NormalEnemyCreator.GetHp(level)); }