예제 #1
0
 public void ShowInformation()
 {
     if (isLocalPlayer)
     {
         GameObject canvas = GameObject.Find("Canvas");
         if (MyLobbyManager.s_Singleton.isInGame)
         {
             Animator anim = canvas.GetComponent <Animator>();
             anim.SetTrigger("LobbyToGame");
         }
         ArenaInfo local = GameObject.Find("Main User").GetComponent <ArenaInfo>();
         ArenaInfo opp   = GameObject.Find("Enemy").GetComponent <ArenaInfo>();
         for (int i = 0; i < MyLobbyManager.s_Singleton.lobbySlots.Length; ++i)
         {
             MyLobbyPlayer cur = MyLobbyManager.s_Singleton.lobbySlots[i] as MyLobbyPlayer;
             if (cur.isLocalPlayer)
             {
                 local.rank.text     = cur.rank;
                 local.rating.text   = cur.rating;
                 local.nickname.text = MyLobbyManager.s_Singleton.localNick = cur.nickname;
             }
             else
             {
                 FishVSContainer fishVSContainer = FindObjectOfType <FishVSContainer>();
                 fishVSContainer.instantiateFish(cur.fishName);
                 opp.rank.text     = cur.rank;
                 opp.rating.text   = cur.rating;
                 opp.nickname.text = MyLobbyManager.s_Singleton.oppNick = cur.nickname;
             }
         }
     }
 }
예제 #2
0
 public RankingSimulator(
     IRandom random,
     Player player,
     EnemyPlayerDigest enemyPlayerDigest,
     List <Guid> foods,
     RankingSimulatorSheets rankingSimulatorSheets,
     int stageId,
     ArenaInfo arenaInfo,
     ArenaInfo enemyInfo,
     CostumeStatSheet costumeStatSheet
     ) : base(
         random,
         player,
         foods,
         rankingSimulatorSheets
         )
 {
     _enemyPlayer = new EnemyPlayer(enemyPlayerDigest, CharacterSheet, CharacterLevelSheet, EquipmentItemSetEffectSheet)
     {
         Simulator = this
     };
     _enemyPlayer.Stats.EqualizeCurrentHPWithHP();
     _stageId               = stageId;
     _arenaInfo             = arenaInfo;
     _enemyInfo             = enemyInfo;
     WeeklyArenaRewardSheet = rankingSimulatorSheets.WeeklyArenaRewardSheet;
     if (!(costumeStatSheet is null))
     {
         Player.SetCostumeStat(costumeStatSheet);
         _enemyPlayer.SetCostumeStat(costumeStatSheet);
     }
 }
예제 #3
0
        public async Task Query(bool active)
        {
            const string query = @"
            {
                avatarAddress
                arenaRecord {
                    win
                    lose
                    draw
                }
                active
                dailyChallengeCount
                score
            }";

            var arenaInfo   = new ArenaInfo(Fixtures.AvatarStateFX, Fixtures.TableSheetsFX.CharacterSheet, active);
            var queryResult = await ExecuteQueryAsync <ArenaInfoType>(query, source : arenaInfo);

            Assert.Equal(
                new Dictionary <string, object>
            {
                ["avatarAddress"] = "0x983c3Fbfe8243a0e36D55C6C1aE26A7c8Bb6CBd4",
                ["arenaRecord"]   = new Dictionary <string, object>
                {
                    ["win"]  = 0,
                    ["lose"] = 0,
                    ["draw"] = 0,
                },
                ["active"] = active,
                ["dailyChallengeCount"] = 5,
                ["score"] = 1000,
            },
                queryResult.Data
                );
        }
예제 #4
0
    public void onGetArenaRankValue(List <object> list, object obj)
    {
        List <object> listObj = new List <object>();

        RankMediator.ArenaRankList.Clear();
        ArenaInfo arenaInfo;

        for (int i = 0; i < list.Count; ++i)
        {
            Dictionary <string, object> info = list[i] as Dictionary <string, object>;
            arenaInfo         = new ArenaInfo();
            arenaInfo.dbid    = UtilTools.IntParse(info["dbid"].ToString());
            arenaInfo.ranking = UtilTools.IntParse(info["rank"].ToString());
            if (arenaInfo.ranking > 100)
            {
                break;
            }
            arenaInfo.fightValue = UtilTools.IntParse(info["fightValue"].ToString());
            arenaInfo.formation  = UtilTools.IntParse(info["formation"].ToString());
            arenaInfo.camp       = UtilTools.IntParse(info["camp"].ToString());
            arenaInfo.playerName = info["name"].ToString();
            arenaInfo.club       = info["club"].ToString();
            RankMediator.ArenaRankList.Add(arenaInfo.dbid, arenaInfo);
            listObj.Add(arenaInfo);
        }
        RankMediator.arenaPage = 17;
        if (RankMediator.rankMediator != null)
        {
            RankMediator.rankMediator.GetArenaRank(listObj);
            return;
        }
        Facade.SendNotification(NotificationID.Rank_Show, listObj);
    }
예제 #5
0
 /// <summary>
 /// 释放
 /// </summary>
 protected override void OnDestroy()
 {
     arenaInfo    = null;
     rankMediator = null;
     firstOpenUI  = false;
     base.OnDestroy();
 }
예제 #6
0
        public static bool AutoImportArena(ArenaImportingBehaviour behaviour, ArenaInfo info = null)
        {
            var deck = info ?? DeckImporter.FromArena();

            if (deck?.Deck.Cards.Sum(x => x.Count) != 30)
            {
                return(false);
            }
            Log.Info($"Found new complete {deck.Deck.Hero} arena deck!");
            var recentArenaDecks =
                DeckList.Instance.Decks.Where(d => d.IsArenaDeck && d.Cards.Sum(x => x.Count) == 30).OrderByDescending(
                    d => d.LastPlayedNewFirst).Take(15);

            if (recentArenaDecks.Any(d => d.Cards.All(c => deck.Deck.Cards.Any(c2 => c.Id == c2.Id && c.Count == c2.Count))))
            {
                Log.Info("...but we already have that one. Discarding.");
            }
            else if (Core.Game.IgnoredArenaDecks.Contains(deck.Deck.Id))
            {
                Log.Info("...but it was already discarded by the user. No automatic action taken.");
            }
            else if (behaviour == ArenaImportingBehaviour.AutoAsk)
            {
                Core.MainWindow.ShowNewArenaDeckMessageAsync(deck.Deck);
                return(true);
            }
            else if (behaviour == ArenaImportingBehaviour.AutoImportSave)
            {
                Log.Info("...auto saving new arena deck.");
                Core.MainWindow.ImportArenaDeck(deck.Deck);
                return(true);
            }
            return(false);
        }
예제 #7
0
 internal void OnRoundEnd(int round, ArenaInfo arena)
 {
     Debug.LogFormat("ArenaManager.OnRoundEnd :{0} round: {1}", arenaInfo.ArenaId, round);
     if (UIArenacs.Instance != null)
     {
         UIArenacs.Instance.ShowRoundResult(round, arena);
     }
 }
예제 #8
0
    public void GetArenaRank(List <object> listObj)
    {
        arenaInfo = null;
        panel.arenaGrid.AddCustomDataList(listObj);
        string text = string.Format("[00FF00]{0}[-]", currentPage);

        panel.arenaPage.text = text + "/" + arenaPage.ToString();
    }
예제 #9
0
 public static bool TryGetThisWeekStateAndArenaInfo(long blockIndex, Address avatarAddress,
                                                    out WeeklyArenaState weeklyArenaState,
                                                    out ArenaInfo arenaInfo)
 {
     arenaInfo = null;
     return(TryGetThisWeekState(blockIndex, out weeklyArenaState) &&
            weeklyArenaState.TryGetValue(avatarAddress, out arenaInfo));
 }
예제 #10
0
        public bool Update()
        {
            var arenaInfo = _arenaProvider.GetArenaInfo();

            if (arenaInfo == null)
            {
                return(false);
            }
            var numCards = arenaInfo.Deck.Cards.Sum(x => x.Count);

            if (numCards == MaxDeckSize)
            {
                if (_prevSlot == MaxDeckSize)
                {
                    CardPicked(arenaInfo);
                }
                OnCompleteDeck?.Invoke(this, new CompleteDeckEventArgs(arenaInfo));
                if (arenaInfo.Rewards?.Any() ?? false)
                {
                    OnRewards?.Invoke(this, new RewardsEventArgs(arenaInfo));
                }
                _watch = false;
                return(true);
            }
            if (HasChanged(arenaInfo, arenaInfo.CurrentSlot))
            {
                var choices = _arenaProvider.GetDraftChoices();
                if (choices == null || choices.Length == 0)
                {
                    return(false);
                }
                if (arenaInfo.CurrentSlot > _prevSlot)
                {
                    if (ChoicesChanged(choices) || _sameChoices)
                    {
                        _sameChoices = false;
                        OnChoicesChanged?.Invoke(this, new ChoicesChangedEventArgs(choices, arenaInfo.Deck));
                    }
                    else
                    {
                        _sameChoices = true;
                        return(false);
                    }
                }
                if (_prevSlot == 0 && arenaInfo.CurrentSlot == 1)
                {
                    HeroPicked(arenaInfo);
                }
                else if (_prevSlot > 0 && arenaInfo.CurrentSlot > _prevSlot)
                {
                    CardPicked(arenaInfo);
                }
                _prevSlot    = arenaInfo.CurrentSlot;
                _prevInfo    = arenaInfo;
                _prevChoices = choices;
            }
            return(false);
        }
예제 #11
0
        public override UpdateResult Update()
        {
            var arenaInfo = _gameDataProvider.GetArenaInfo();

            if (arenaInfo == null)
            {
                return(UpdateResult.Continue);
            }
            var numCards = arenaInfo.Deck.Cards.Sum(x => x.Count);

            if (numCards == MaxDeckSize)
            {
                if (_prevSlot == MaxDeckSize)
                {
                    OnCardPicked(arenaInfo);
                }
                DeckComplete?.Invoke(new ArenaDeckComlpeteEventArgs(arenaInfo));
                if (arenaInfo.Rewards?.Any() ?? false)
                {
                    RunComplete?.Invoke(new ArenaRunCompleteEventArgs(arenaInfo));
                }
                return(UpdateResult.Break);
            }
            if (HasChanged(arenaInfo, arenaInfo.CurrentSlot))
            {
                var choices = _gameDataProvider.GetDraftChoices();
                if (choices == null || choices.Length == 0)
                {
                    return(UpdateResult.Continue);
                }
                if (arenaInfo.CurrentSlot > _prevSlot)
                {
                    if (ChoicesHaveChanged(choices) || _sameChoices)
                    {
                        _sameChoices = false;
                        ChoicesChanged?.Invoke(new ArenaChoicesChangedEventArgs(choices, arenaInfo.Deck));
                    }
                    else
                    {
                        _sameChoices = true;
                        return(UpdateResult.Continue);
                    }
                }
                if (_prevSlot == 0 && arenaInfo.CurrentSlot == 1)
                {
                    OnHeroPicked(arenaInfo);
                }
                else if (_prevSlot > 0 && arenaInfo.CurrentSlot > _prevSlot)
                {
                    OnCardPicked(arenaInfo);
                }
                _prevSlot    = arenaInfo.CurrentSlot;
                _prevInfo    = arenaInfo;
                _prevChoices = choices;
            }
            return(UpdateResult.Continue);
        }
예제 #12
0
 internal void OnReady(int round, ArenaInfo arenaInfo)
 {
     Debug.LogFormat("ArenaManager.SendRea :{0}", arenaInfo.ArenaId);
     this.Round = round;
     if (UIArenacs.Instance != null)
     {
         UIArenacs.Instance.ShowCountDown();
     }
 }
예제 #13
0
        private void OnHeroPicked(ArenaInfo arenaInfo)
        {
            var hero = _prevChoices.FirstOrDefault(x => x.Id == arenaInfo.Deck.Hero);

            if (hero != null)
            {
                CardPicked?.Invoke(new ArenaCardPickedEventArgs(hero, _prevChoices));
            }
        }
예제 #14
0
        private void CardPicked(ArenaInfo arenaInfo)
        {
            var pick = arenaInfo.Deck.Cards.FirstOrDefault(x => !_prevInfo?.Deck.Cards.Any(c => x.Id == c.Id && x.Count == c.Count) ?? false);

            if (pick != null)
            {
                OnCardPicked?.Invoke(this, new CardPickedEventArgs(new Card(pick.Id, 1, pick.Premium), _prevChoices));
            }
        }
예제 #15
0
 private void Update(ArenaInfo info)
 {
     Deck   = new Deck(DeckType.Arena, info.Deck);
     Slot   = info.CurrentSlot;
     Losses = info.Losses;
     Wins   = info.Wins;
     Season = info.Season;
     Rewards.AddRange(info.Rewards);
 }
예제 #16
0
 public Arena(Map map, ArenaInfo arena, NetConnection <NetSession> red, NetConnection <NetSession> blue)
 {
     this.map         = map;
     this.ArenaInfo   = arena;
     this.Red         = red;
     this.Blue        = blue;
     arena.ArenaId    = map.InstanceId;
     this.ArenaStatus = ArenaStatus.Wait;
     this.RoundStatus = ArenaRoundStatus.None;
 }
예제 #17
0
        public Arena NewArena(ArenaInfo info, NetConnection <NetSession> red, NetConnection <NetSession> blue = null)
        {
            var   instance = InstanceIndexes.Dequeue();
            var   map      = MapManager.Instance.GetInstance(ArenaMapID, instance);
            Arena arena    = new Arena(map, info, red, blue);

            this.Areans[instance] = arena;
            arena.PlayerEnter();
            return(arena);
        }
예제 #18
0
    public void UpdateArenaRankGrid(UIGridItem item)
    {
        if (item == null || item.mScripts == null || item.oData == null)
        {
            return;
        }
        ArenaInfo info         = item.oData as ArenaInfo;
        UILabel   ranking      = item.mScripts[0] as UILabel;
        UITexture head         = item.mScripts[1] as UITexture;
        UILabel   name         = item.mScripts[2] as UILabel;
        UILabel   formation    = item.mScripts[3] as UILabel;
        UILabel   fight        = item.mScripts[4] as UILabel;
        UISprite  select       = item.mScripts[5] as UISprite;
        UITexture clubHead     = item.mScripts[6] as UITexture;
        UILabel   clubName     = item.mScripts[7] as UILabel;
        UILabel   dimaondLabel = item.mScripts[8] as UILabel;
        UILabel   blackLabel   = item.mScripts[9] as UILabel;
        UISprite  rankSprite   = item.mScripts[10] as UISprite;

        item.onClick = OnClickArenaItem;
        LoadSprite.LoaderHead(head, "jueshetouxiang1", false);
        LoadSprite.LoaderHead(clubHead, "jueshetouxiang1", false);
        select.gameObject.SetActive(info.dbid == PlayerMediator.playerInfo.roleId && info.playerName == PlayerMediator.playerInfo.name);
        if (select.gameObject.activeSelf)
        {
            arenaInfo = info;
        }
        clubName.text = info.club;
        rankSprite.gameObject.SetActive(info.ranking <= 3);
        ranking.gameObject.SetActive(info.ranking > 3);
        if (info.ranking <= 3)
        {
            rankSprite.spriteName = info.ranking.ToString();
        }
        else
        {
            ranking.text = info.ranking.ToString();
        }
        name.text      = info.playerName;
        formation.text = info.formation.ToString();
        fight.text     = info.fightValue.ToString();
        ArenaReward reward = ArenaConfig.GetArenaRewardByRank(info.ranking);

        if (reward == null)
        {
            dimaondLabel.text = "0";
            blackLabel.text   = "0";
        }
        else
        {
            dimaondLabel.text = reward.arenaReward.Split(';')[1].ToString();
            blackLabel.text   = reward.arenaReward.Split(';')[0].ToString();
        }
    }
예제 #19
0
        public void Show(ArenaInfo enemyInfo)
        {
            var player = Game.Game.instance.Stage.GetPlayer();
            var sprite = SpriteHelper.GetItemIcon(player.Model.armor?.Id ?? GameConfig.DefaultAvatarArmorId);

            profile.Set(player.Level, States.Instance.CurrentAvatarState.NameWithHash, sprite);
            var enemySprite = SpriteHelper.GetItemIcon(enemyInfo.ArmorId);

            enemyProfile.Set(enemyInfo.Level, enemyInfo.AvatarName, enemySprite);

            base.Show();
        }
예제 #20
0
        public void ArenaInfoGetRewardCount(int minScore, int maxScore, int expected)
        {
            var score      = new Random().Next(minScore, maxScore);
            var serialized = new Dictionary(new Dictionary <IKey, IValue>
            {
                [(Text)"score"]   = score.Serialize(),
                [(Text)"receive"] = false.Serialize(),
            });
            var info = new ArenaInfo(serialized);

            Assert.Equal(expected, info.GetRewardCount());
        }
예제 #21
0
 private void OnGetPVPData(short state, ArenaInfo down = null)
 {
     if (state != 0)
     {
         StateManager.Instance.StateShow(state, 0);
         return;
     }
     if (down != null)
     {
         this.PVPData = down;
         EventDispatcher.Broadcast(EventNames.PVPUpdateUI);
     }
 }
        public void Show(ArenaInfo enemyInfo)
        {
            player = Game.Game.instance.Stage.GetPlayer();
            var sprite = SpriteHelper.GetItemIcon(player.Model.armor? .Id ?? GameConfig.DefaultAvatarArmorId);

            playerProfile.Set(player.Level, States.Instance.CurrentAvatarState.NameWithHash, sprite);
            player.gameObject.SetActive(false);
            var enemySprite = SpriteHelper.GetItemIcon(enemyInfo.ArmorId);

            enemyProfile.Set(enemyInfo.Level, enemyInfo.AvatarName, enemySprite);
            loadingText.text = L10nManager.Localize("UI_MATCHING_OPPONENT");
            Show();
        }
		private async void Watch()
		{
			_running = true;
			_prevSlot = -1;
			_prevInfo = null;
			while(_watch)
			{
				await Task.Delay(_delay);
				if(!_watch)
					break;
				if(Update())
					break;
			}
			_running = false;
		}
예제 #24
0
 /// <summary>
 /// 界面显示
 /// </summary>
 protected override void OnShow(INotification notification)
 {
     if (notification.Body != null)
     {
         arenaInfo = null;
         List <object> listObj = notification.Body as List <object>;
         panel.arenaRank.gameObject.SetActive(true);
         panel.arenaGrid.AddCustomDataList(listObj);
         string text = string.Format("[00FF00]{0}[-]", currentPage);
         panel.arenaPage.text = text + "/" + arenaPage.ToString();
         return;
     }
     LoadSprite.LoaderBGTexture(panel.beijing.material, "qiuchang", false);
     UpdateRankList();
 }
예제 #25
0
 public RankingSimulator(
     IRandom random,
     AvatarState avatarState,
     AvatarState enemyAvatarState,
     List <Guid> foods,
     TableSheets tableSheets,
     int stageId,
     ArenaInfo arenaInfo,
     ArenaInfo enemyInfo) : base(random, avatarState, foods, tableSheets)
 {
     _enemyPlayer = new EnemyPlayer(enemyAvatarState, this);
     _enemyPlayer.Stats.EqualizeCurrentHPWithHP();
     _stageId     = stageId;
     _arenaInfo   = arenaInfo;
     _enemyInfo   = enemyInfo;
     _avatarState = avatarState;
 }
예제 #26
0
 public MockGameData(MatchInfo matchinfo   = null, GameServerInfo serverInfo = null, AccountId accountId                 = null,
                     ArenaInfo arenaInfo   = null, BattleTag battleTag       = null, BrawlInfo brawlInfo                 = null,
                     Collection collection = null, Card[] draftChoices       = null, List <Card> packCards               = null,
                     int packId            = 0, DungeonInfo[] dungeonInfo    = null, bool friendlyChallengeDialogVisible = false)
 {
     _matchinfo    = matchinfo;
     _serverInfo   = serverInfo;
     _accountId    = accountId;
     _arenaInfo    = arenaInfo;
     _battleTag    = battleTag;
     _brawlInfo    = brawlInfo;
     _collection   = collection;
     _draftChoices = draftChoices;
     _packCards    = packCards;
     _packId       = packId;
     _dungeonInfo  = dungeonInfo;
     _friendlyChallengeDialogVisible = friendlyChallengeDialogVisible;
 }
예제 #27
0
        public async Task Query(bool active)
        {
            const string query = @"
            {
                agentAddress
                avatarAddress
                arenaRecord {
                    win
                    lose
                    draw
                }
                level
                combatPoint
                armorId
                active
                dailyChallengeCount
                score
            }";

            var arenaInfo   = new ArenaInfo(Fixtures.AvatarStateFX, Fixtures.TableSheetsFX.CharacterSheet, active);
            var queryResult = await ExecuteQueryAsync <ArenaInfoType>(query, source : arenaInfo);

            Assert.Equal(
                new Dictionary <string, object>
            {
                ["agentAddress"]  = "0xfc2a412ea59122B114B672a5518Bc113955Dd2FE",
                ["avatarAddress"] = "0x983c3Fbfe8243a0e36D55C6C1aE26A7c8Bb6CBd4",
                ["arenaRecord"]   = new Dictionary <string, object>
                {
                    ["win"]  = 0,
                    ["lose"] = 0,
                    ["draw"] = 0,
                },
                ["level"]               = 1,
                ["combatPoint"]         = 1142,
                ["armorId"]             = 10200000,
                ["active"]              = active,
                ["dailyChallengeCount"] = 5,
                ["score"]               = 1000,
            },
                queryResult.Data
                );
        }
예제 #28
0
        private async void Watch()
        {
            _running  = true;
            _prevSlot = -1;
            _prevInfo = null;
            while (_watch)
            {
                await Task.Delay(_delay);

                if (!_watch)
                {
                    break;
                }
                if (Update())
                {
                    break;
                }
            }
            _running = false;
        }
예제 #29
0
 private void LoadNextArena()
 {
     if (arenaIndex < arena.arenaList.Count)
     {
         locationPassed = false;
         TryClearArena();
         ArenaInfo arenaInfo = arena.arenaList[arenaIndex];
         arenaGO = Instantiate(arenaInfo.arenaPrefab);
         playerGO.transform.position = startPosition;
         for (int i = 0; i < arenaInfo.enemiesList.Count; i++)
         {
             CreateEnemy(arenaInfo.enemiesList[i]);
         }
         arenaIndex++;
     }
     else
     {
         UIMenu.GetComponent <RestartPanelController>().dieText.text = "Win";
         UIMenu.SetActive(true);
     }
 }
예제 #30
0
        public static ArenaInfo GetArenaInfo()
        {
            arenaInfo = new ArenaInfo();
            string resp   = Requests.PostResponseHtml("http://atlantida-o.ru/fields.php");
            string respp  = Regex.Unescape(resp);
            string resppp = BotFunc.RemoveAllNewLines(respp);
            Regex  r      = new Regex(@"Арена.*?timeleft.*?>(.*?)мин\..*?bid:1,tab:1");

            if (r.IsMatch(resppp))
            {
                arenaInfo.Minutes = Convert.ToInt32(r.Match(resppp).Groups[1].Value);
                arenaInfo.Enter   = resppp.Contains("Отказаться");
                return(arenaInfo);
            }
            else
            {
                arenaInfo.Enter   = false;
                arenaInfo.Minutes = 0;
                return(arenaInfo);
            }
        }
예제 #31
0
        public IAccountStateDelta ResetChallengeCount(IActionContext ctx, IAccountStateDelta states)
        {
            var gameConfigState = states.GetGameConfigState();
            var index           = Math.Max((int)ctx.BlockIndex / gameConfigState.WeeklyArenaInterval, 0);
            var weeklyAddress   = WeeklyArenaState.DeriveAddress(index);
            var rawWeekly       = (Dictionary)states.GetState(weeklyAddress);
            var resetIndex      = rawWeekly["resetIndex"].ToLong();

            if (ctx.BlockIndex - resetIndex >= gameConfigState.DailyArenaInterval)
            {
                var weekly = new WeeklyArenaState(rawWeekly);
                if (resetIndex >= RankingBattle.UpdateTargetBlockIndex)
                {
                    // Reset count each ArenaInfo.
                    weekly.ResetIndex = ctx.BlockIndex;
                    var listAddress = weeklyAddress.Derive("address_list");
                    if (states.TryGetState(listAddress, out List rawList))
                    {
                        var addressList = rawList.ToList(StateExtensions.ToAddress);
                        foreach (var address in addressList)
                        {
                            var infoAddress = weeklyAddress.Derive(address.ToByteArray());
                            if (states.TryGetState(infoAddress, out Dictionary rawInfo))
                            {
                                var info = new ArenaInfo(rawInfo);
                                info.ResetCount();
                                states = states.SetState(infoAddress, info.Serialize());
                            }
                        }
                    }
                }
                else
                {
                    // Run legacy ResetCount.
                    weekly.ResetCount(ctx.BlockIndex);
                }
                states = states.SetState(weeklyAddress, weekly.Serialize());
            }
            return(states);
        }
예제 #32
0
		public static bool AutoImportArena(ArenaImportingBehaviour behaviour, ArenaInfo info = null)
		{
			var deck = info ?? DeckImporter.FromArena();
			if(deck?.Deck.Cards.Sum(x => x.Count) != 30)
				return false;
			Log.Info($"Found new complete {deck.Deck.Hero} arena deck!");
			var recentArenaDecks =
				DeckList.Instance.Decks.Where(d => d.IsArenaDeck && d.Cards.Sum(x => x.Count) == 30).OrderByDescending(
					d => d.LastPlayedNewFirst).Take(15);
			if(recentArenaDecks.Any(d => d.Cards.All(c => deck.Deck.Cards.Any(c2 => c.Id == c2.Id && c.Count == c2.Count))))
				Log.Info("...but we already have that one. Discarding.");
			else if(Core.Game.IgnoredArenaDecks.Contains(deck.Deck.Id))
				Log.Info("...but it was already discarded by the user. No automatic action taken.");
			else if(behaviour == ArenaImportingBehaviour.AutoAsk)
			{
				Core.MainWindow.ShowNewArenaDeckMessageAsync(deck.Deck);
				return true;
			}
			else if(behaviour == ArenaImportingBehaviour.AutoImportSave)
			{
				Log.Info("...auto saving new arena deck.");
				Core.MainWindow.ImportArenaDeck(deck.Deck);
				return true;
			}
			return false;
		}
		private bool HasChanged(ArenaInfo arenaInfo, int slot) 
			=> _prevInfo == null || _prevInfo.Deck.Hero != arenaInfo.Deck.Hero ||  slot > _prevSlot;
		public CompleteDeckEventArgs(ArenaInfo info)
		{
			Info = info;
		}
		private void HeroPicked(ArenaInfo arenaInfo)
		{
			var hero = _prevChoices.FirstOrDefault(x => x.Id == arenaInfo.Deck.Hero);
			if(hero != null)
				OnCardPicked?.Invoke(this, new CardPickedEventArgs(hero, _prevChoices));
		}
		private void CardPicked(ArenaInfo arenaInfo)
		{
			var pick = arenaInfo.Deck.Cards.FirstOrDefault(x => !_prevInfo?.Deck.Cards.Any(c => x.Id == c.Id && x.Count == c.Count) ?? false);
			if(pick != null)
				OnCardPicked?.Invoke(this, new CardPickedEventArgs(new Card(pick.Id, 1, pick.Premium), _prevChoices));
		}
		public bool Update()
		{
			var arenaInfo = _arenaProvider.GetArenaInfo();
			if(arenaInfo == null)
				return false;
			var numCards = arenaInfo.Deck.Cards.Sum(x => x.Count);
			if(numCards == MaxDeckSize)
			{
				if(_prevSlot == MaxDeckSize)
					CardPicked(arenaInfo);
				OnCompleteDeck?.Invoke(this, new CompleteDeckEventArgs(arenaInfo));
				if(arenaInfo.Rewards?.Any() ?? false)
					OnRewards?.Invoke(this, new RewardsEventArgs(arenaInfo));
				_watch = false;
				return true;
			}
			if(HasChanged(arenaInfo, arenaInfo.CurrentSlot))
			{
				var choices = _arenaProvider.GetDraftChoices();
				if(choices == null || choices.Length == 0)
					return false;
				if(arenaInfo.CurrentSlot > _prevSlot)
				{
					if(ChoicesChanged(choices) || _sameChoices)
					{
						_sameChoices = false;
						OnChoicesChanged?.Invoke(this, new ChoicesChangedEventArgs(choices, arenaInfo.Deck));
					}
					else
					{
						_sameChoices = true;
						return false;
					}
				}
				if(_prevSlot == 0 && arenaInfo.CurrentSlot == 1)
					HeroPicked(arenaInfo);
				else if(_prevSlot > 0 && arenaInfo.CurrentSlot > _prevSlot)
					CardPicked(arenaInfo);
				_prevSlot = arenaInfo.CurrentSlot;
				_prevInfo = arenaInfo;
				_prevChoices = choices;
			}
			return false;
		}