Exemplo n.º 1
0
        private void DataGridKeyPoints_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
        {
            var selected = ((DataGrid)sender).SelectedItem as TurnViewItem;

            if (selected == null || selected.KeyPoint == null)
            {
                return;
            }
            _currentGameState = selected.KeyPoint;
            Update();
        }
Exemplo n.º 2
0
        private void TreeViewKeyPoints_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e)
        {
            var selected = ((TreeView)sender).SelectedItem as ReplayKeyPoint;

            if (selected == null)
            {
                return;
            }
            _currentGameState = selected;
            Update();
        }
 public void Load(List <ReplayKeyPoint> replay)
 {
     if (replay == null || replay.Count == 0)
     {
         return;
     }
     Replay              = replay;
     _currentGameState   = Replay[0];
     _playerController   = PlayerEntity.GetTag(GAME_TAG.CONTROLLER);
     _opponentController = OpponentEntity.GetTag(GAME_TAG.CONTROLLER);
     _treeViewTurnItems  = new List <TreeViewItem>();
     foreach (var kp in Replay)
     {
         var tvItem = _treeViewTurnItems.FirstOrDefault(x => (string)x.Header == "Turn " + kp.Turn);
         if (tvItem == null)
         {
             tvItem = new TreeViewItem {
                 Header = "Turn " + kp.Turn, IsExpanded = true
             };
             _treeViewTurnItems.Add(tvItem);
         }
         var entity = kp.Data.FirstOrDefault(x => x.Id == kp.Id);
         if (entity == null || string.IsNullOrEmpty(entity.CardId))
         {
             continue;
         }
         if (kp.Type == KeyPointType.Summon && entity.GetTag(GAME_TAG.CARDTYPE) == (int)TAG_CARDTYPE.ENCHANTMENT)
         {
             continue;
         }
         tvItem.Items.Add(kp);
     }
     foreach (var tvi in _treeViewTurnItems)
     {
         TreeViewKeyPoints.Items.Add(tvi);
     }
     DataContext = this;
 }
Exemplo n.º 4
0
        public void Load(List <ReplayKeyPoint> replay)
        {
            if (replay == null || replay.Count == 0)
            {
                return;
            }
            var selectedKeypoint = DataGridKeyPoints.SelectedItem as TurnViewItem;

            DataGridKeyPoints.Items.Clear();
            Replay            = replay;
            _currentGameState = Replay.FirstOrDefault(r => r.Data.Any(x => x.HasTag(GAME_TAG.PLAYER_ID)));
            if (_currentGameState == null)
            {
                Logger.WriteLine("Error loading replay. No player entity found.");
                return;
            }
            _playerController   = PlayerEntity.GetTag(GAME_TAG.CONTROLLER);
            _opponentController = OpponentEntity.GetTag(GAME_TAG.CONTROLLER);
            var          currentTurn = -1;
            TurnViewItem tvi         = null;

            foreach (var kp in Replay)
            {
                var entity = kp.Data.FirstOrDefault(x => x.Id == kp.Id);
                if (entity == null || (string.IsNullOrEmpty(entity.CardId) && kp.Type != KeyPointType.Victory && kp.Type != KeyPointType.Defeat))
                {
                    continue;
                }
                if (kp.Type == KeyPointType.Summon && entity.GetTag(GAME_TAG.CARDTYPE) == (int)TAG_CARDTYPE.ENCHANTMENT)
                {
                    continue;
                }
                var turn = (kp.Turn + 1) / 2;
                if (turn == 1)
                {
                    if (!kp.Data.Any(x => x.HasTag(GAME_TAG.PLAYER_ID) && x.GetTag(GAME_TAG.RESOURCES) == 1))
                    {
                        turn = 0;
                    }
                }
                if (turn > currentTurn)
                {
                    currentTurn = turn;
                    if (tvi != null && tvi.IsTurnRow && tvi.Turn.HasValue && !_collapsedTurns.Contains(tvi.Turn.Value))
                    {
                        DataGridKeyPoints.Items.Remove(tvi);                         //remove empty turns
                    }
                    tvi = new TurnViewItem {
                        Turn = turn, IsCollapsed = _collapsedTurns.Contains(turn), ShowAll = _showAllTurns.Contains(turn)
                    };
                    DataGridKeyPoints.Items.Add(tvi);
                }
                if (!_showAllTurns.Contains(turn))
                {
                    switch (kp.Type)
                    {
                    case KeyPointType.Attack:
                        if (!Config.Instance.ReplayViewerShowAttack)
                        {
                            continue;
                        }
                        break;

                    case KeyPointType.Death:
                        if (!Config.Instance.ReplayViewerShowDeath)
                        {
                            continue;
                        }
                        break;

                    case KeyPointType.Mulligan:
                    case KeyPointType.DeckDiscard:
                    case KeyPointType.HandDiscard:
                        if (!Config.Instance.ReplayViewerShowDiscard)
                        {
                            continue;
                        }
                        break;

                    case KeyPointType.Draw:
                    case KeyPointType.Obtain:
                    case KeyPointType.PlayToDeck:
                    case KeyPointType.PlayToHand:
                        if (!Config.Instance.ReplayViewerShowDraw)
                        {
                            continue;
                        }
                        break;

                    case KeyPointType.HeroPower:
                        if (!Config.Instance.ReplayViewerShowHeroPower)
                        {
                            continue;
                        }
                        break;

                    case KeyPointType.SecretStolen:
                    case KeyPointType.SecretTriggered:
                        if (!Config.Instance.ReplayViewerShowSecret)
                        {
                            continue;
                        }
                        break;

                    case KeyPointType.Play:
                    case KeyPointType.PlaySpell:
                    case KeyPointType.SecretPlayed:
                        if (!Config.Instance.ReplayViewerShowPlay)
                        {
                            continue;
                        }
                        break;

                    case KeyPointType.Summon:
                        if (!Config.Instance.ReplayViewerShowSummon)
                        {
                            continue;
                        }
                        break;
                    }
                }
                if (_collapsedTurns.Contains(turn))
                {
                    continue;
                }
                tvi = new TurnViewItem();
                if (kp.Player == ActivePlayer.Player)
                {
                    tvi.PlayerAction         = kp.Type.ToString();
                    tvi.AdditionalInfoPlayer = kp.GetAdditionalInfo();
                }
                else
                {
                    tvi.OpponentAction         = kp.Type.ToString();
                    tvi.AdditionalInfoOpponent = kp.GetAdditionalInfo();
                }
                tvi.KeyPoint = kp;
                DataGridKeyPoints.Items.Add(tvi);
            }
            if (selectedKeypoint != null)
            {
                var newSelection = selectedKeypoint.Turn.HasValue
                                                           ? DataGridKeyPoints.Items.Cast <TurnViewItem>()
                                   .FirstOrDefault(x => x.Turn.HasValue && x.Turn.Value == selectedKeypoint.Turn.Value)
                                                           : DataGridKeyPoints.Items.Cast <TurnViewItem>().FirstOrDefault(x => x.KeyPoint == selectedKeypoint.KeyPoint);
                if (newSelection != null)
                {
                    DataGridKeyPoints.SelectedItem = newSelection;
                    DataGridKeyPoints.ScrollIntoView(newSelection);
                    var         index = DataGridKeyPoints.Items.IndexOf(newSelection);
                    DataGridRow dgrow = (DataGridRow)DataGridKeyPoints.ItemContainerGenerator.ContainerFromItem(DataGridKeyPoints.Items[index]);
                    dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
                }
            }
            DataContext = this;
        }
 public void ProposeKeyPoint(KeyPointType type, int id, ActivePlayer player)
 {
     if (ProposedKeyPoint != null)
         ReplayMaker.Generate(ProposedKeyPoint.Type, ProposedKeyPoint.Id, ProposedKeyPoint.Player, _game);
     ProposedKeyPoint = new ReplayKeyPoint(null, type, id, player);
 }
		private void TagChange(string rawTag, int id, string rawValue, bool isRecursive = false)
		{
			if(_lastId != id)
			{
				Game.SecondToLastUsedId = _lastId;
				if(_proposedKeyPoint != null)
				{
					ReplayMaker.Generate(_proposedKeyPoint.Type, _proposedKeyPoint.Id, _proposedKeyPoint.Player);
					_proposedKeyPoint = null;
				}
			}
			_lastId = id;
			if(!Game.Entities.ContainsKey(id))
				Game.Entities.Add(id, new Entity(id));
			GAME_TAG tag;
			if(!Enum.TryParse(rawTag, out tag))
			{
				int tmp;
				if(int.TryParse(rawTag, out tmp) && Enum.IsDefined(typeof(GAME_TAG), tmp))
					tag = (GAME_TAG)tmp;
			}
			var value = ParseTagValue(tag, rawValue);
			var prevZone = Game.Entities[id].GetTag(GAME_TAG.ZONE);
			Game.Entities[id].SetTag(tag, value);

			if(tag == GAME_TAG.CONTROLLER && _waitForController != null && Game.PlayerId == -1)
			{
				var p1 = Game.Entities.FirstOrDefault(e => e.Value.GetTag(GAME_TAG.PLAYER_ID) == 1).Value;
				var p2 = Game.Entities.FirstOrDefault(e => e.Value.GetTag(GAME_TAG.PLAYER_ID) == 2).Value;
				if(_currentEntityHasCardId)
				{
					if(p1 != null)
						p1.IsPlayer = value == 1;
					if(p2 != null)
						p2.IsPlayer = value != 1;
					Game.PlayerId = value;
					Game.OpponentId = value == 1 ? 2 : 1;
				}
				else
				{
					if(p1 != null)
						p1.IsPlayer = value != 1;
					if(p2 != null)
						p2.IsPlayer = value == 1;
					Game.PlayerId = value == 1 ? 2 : 1;
					Game.OpponentId = value;
				}
			}
			var controller = Game.Entities[id].GetTag(GAME_TAG.CONTROLLER);
			var player = Game.Entities[id].HasTag(GAME_TAG.CONTROLLER) ? (controller == Game.PlayerId ? "FRIENDLY" : "OPPOSING") : "";
			var cardId = Game.Entities[id].CardId;
			if(tag == GAME_TAG.ZONE)
			{
				//Logger.WriteLine("--------" + player + " " + Game.Entities[id].CardId + " " + (TAG_ZONE)prevZone + " -> " +
				//                 (TAG_ZONE)value);

				if(((TAG_ZONE)value == TAG_ZONE.HAND || ((TAG_ZONE)value == TAG_ZONE.PLAY) && Game.IsMulliganDone) && _waitForController == null)
				{
					if(!Game.IsMulliganDone)
						prevZone = (int)TAG_ZONE.DECK;
					if(controller == 0)
					{
						Game.Entities[id].SetTag(GAME_TAG.ZONE, prevZone);
						_waitForController = new {Tag = rawTag, Id = id, Value = rawValue};
						//Logger.WriteLine("CURRENTLY NO CONTROLLER SET FOR CARD, WAITING...");
						return;
					}
				}
				switch((TAG_ZONE)prevZone)
				{
					case TAG_ZONE.DECK:
						switch((TAG_ZONE)value)
						{
							case TAG_ZONE.HAND:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerDraw(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.Draw, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentDraw(GetTurnNumber());
									ProposeKeyPoint(KeyPointType.Draw, id, ActivePlayer.Opponent);
								}
								break;
							case TAG_ZONE.REMOVEDFROMGAME:
							case TAG_ZONE.GRAVEYARD:
							case TAG_ZONE.SETASIDE:
							case TAG_ZONE.PLAY:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerDeckDiscard(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.DeckDiscard, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentDeckDiscard(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.DeckDiscard, id, ActivePlayer.Opponent);
								}
								break;
							case TAG_ZONE.SECRET:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerSecretPlayed(cardId, GetTurnNumber(), true);
									ProposeKeyPoint(KeyPointType.SecretPlayed, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentSecretPlayed(cardId, -1, GetTurnNumber(), true, id);
									ProposeKeyPoint(KeyPointType.SecretPlayed, id, ActivePlayer.Player);
								}
								break;
						}
						break;
					case TAG_ZONE.HAND:
						switch((TAG_ZONE)value)
						{
							case TAG_ZONE.PLAY:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerPlay(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.Play, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentPlay(cardId, Game.Entities[id].GetTag(GAME_TAG.ZONE_POSITION), GetTurnNumber());
									ProposeKeyPoint(KeyPointType.Play, id, ActivePlayer.Opponent);
								}
								break;
							case TAG_ZONE.REMOVEDFROMGAME:
							case TAG_ZONE.GRAVEYARD:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerHandDiscard(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.HandDiscard, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentHandDiscard(cardId, Game.Entities[id].GetTag(GAME_TAG.ZONE_POSITION), GetTurnNumber());
									ProposeKeyPoint(KeyPointType.HandDiscard, id, ActivePlayer.Opponent);
								}
								break;
							case TAG_ZONE.SECRET:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerSecretPlayed(cardId, GetTurnNumber(), false);
									ProposeKeyPoint(KeyPointType.SecretPlayed, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentSecretPlayed(cardId, Game.Entities[id].GetTag(GAME_TAG.ZONE_POSITION), GetTurnNumber(), false, id);
									ProposeKeyPoint(KeyPointType.SecretPlayed, id, ActivePlayer.Opponent);
								}
								break;
							case TAG_ZONE.DECK:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerMulligan(cardId);
									ProposeKeyPoint(KeyPointType.Mulligan, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentMulligan(Game.Entities[id].GetTag(GAME_TAG.ZONE_POSITION));
									ProposeKeyPoint(KeyPointType.Mulligan, id, ActivePlayer.Opponent);
								}
								break;
						}
						break;
					case TAG_ZONE.PLAY:
						switch((TAG_ZONE)value)
						{
							case TAG_ZONE.HAND:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerBackToHand(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.PlayToHand, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentPlayToHand(cardId, GetTurnNumber(), id);
									ProposeKeyPoint(KeyPointType.PlayToHand, id, ActivePlayer.Opponent);
								}
								break;
							case TAG_ZONE.DECK:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerPlayToDeck(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.PlayToDeck, id, ActivePlayer.Player);
								}
								else if (controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentPlayToDeck(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.PlayToDeck, id, ActivePlayer.Opponent);
								}
								break;
							case TAG_ZONE.GRAVEYARD:
								if(Game.Entities[id].HasTag(GAME_TAG.HEALTH))
								{
									if(controller == Game.PlayerId)
										ProposeKeyPoint(KeyPointType.Death, id, ActivePlayer.Player);
									else if(controller == Game.OpponentId)
										ProposeKeyPoint(KeyPointType.Death, id, ActivePlayer.Opponent);
								}
								break;
						}
						break;
					case TAG_ZONE.SECRET:
						switch((TAG_ZONE)value)
						{
							case TAG_ZONE.SECRET:
							case TAG_ZONE.GRAVEYARD:
								if(controller == Game.PlayerId)
									ProposeKeyPoint(KeyPointType.SecretTriggered, id, ActivePlayer.Player);
								if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentSecretTrigger(cardId, GetTurnNumber(), id);
									ProposeKeyPoint(KeyPointType.SecretTriggered, id, ActivePlayer.Opponent);
								}
								break;
						}
						break;
					case TAG_ZONE.GRAVEYARD:
					case TAG_ZONE.SETASIDE:
					case TAG_ZONE.CREATED:
					case TAG_ZONE.INVALID:
					case TAG_ZONE.REMOVEDFROMGAME:
						switch((TAG_ZONE)value)
						{
							case TAG_ZONE.PLAY:
								if(controller == Game.PlayerId)
									ProposeKeyPoint(KeyPointType.Summon, id, ActivePlayer.Player);
								if(controller == Game.OpponentId)
									ProposeKeyPoint(KeyPointType.Summon, id, ActivePlayer.Opponent);
								break;
							case TAG_ZONE.HAND:
								if(controller == Game.PlayerId)
								{
									_gameHandler.HandlePlayerGet(cardId, GetTurnNumber());
									ProposeKeyPoint(KeyPointType.Obtain, id, ActivePlayer.Player);
								}
								else if(controller == Game.OpponentId)
								{
									_gameHandler.HandleOpponentGet(GetTurnNumber(), id);
									ProposeKeyPoint(KeyPointType.Obtain, id, ActivePlayer.Opponent);
								}
								break;
						}
						break;
				}
			}
			else if(tag == GAME_TAG.PLAYSTATE)
			{
				if(value == (int)TAG_PLAYSTATE.QUIT)
					_gameHandler.HandleConcede();
				if(!_gameEnded)
				{
					if(Game.Entities[id].IsPlayer)
					{
						if(value == (int)TAG_PLAYSTATE.WON)
						{
							GameEndKeyPoint(true, id);
							_gameHandler.HandleWin();
							_gameHandler.HandleGameEnd();
							_gameEnded = true;
						}
						else if(value == (int)TAG_PLAYSTATE.LOST)
						{
							GameEndKeyPoint(false, id);
							_gameHandler.HandleLoss();
							_gameHandler.HandleGameEnd();
							_gameEnded = true;
						}
						else if(value == (int)TAG_PLAYSTATE.TIED)
						{
							GameEndKeyPoint(false, id);
							_gameHandler.HandleTied();
							_gameHandler.HandleGameEnd();
						}
					}
				}
			}
			else if(tag == GAME_TAG.CURRENT_PLAYER && value == 1)
			{
				var activePlayer = Game.Entities[id].IsPlayer ? ActivePlayer.Player : ActivePlayer.Opponent;
				_gameHandler.TurnStart(activePlayer, GetTurnNumber());
				if(activePlayer == ActivePlayer.Player)
					_playerUsedHeroPower = false;
				else
					_opponentUsedHeroPower = false;
			}
			else if(tag == GAME_TAG.NUM_ATTACKS_THIS_TURN && value > 0)
			{
				if(controller == Game.PlayerId)
					ProposeKeyPoint(KeyPointType.Attack, id, ActivePlayer.Player);
				else if(controller == Game.OpponentId)
					ProposeKeyPoint(KeyPointType.Attack, id, ActivePlayer.Opponent);
			}
			else if(tag == GAME_TAG.ZONE_POSITION)
			{
				var zone = Game.Entities[id].GetTag(GAME_TAG.ZONE);
				if(zone == (int)TAG_ZONE.HAND)
				{
					if(controller == Game.PlayerId)
						ReplayMaker.Generate(KeyPointType.HandPos, id, ActivePlayer.Player);
					else if(controller == Game.OpponentId)
						ReplayMaker.Generate(KeyPointType.HandPos, id, ActivePlayer.Opponent);
				}
				else if(zone == (int)TAG_ZONE.PLAY)
				{
					if(controller == Game.PlayerId)
						ReplayMaker.Generate(KeyPointType.BoardPos, id, ActivePlayer.Player);
					else if(controller == Game.OpponentId)
						ReplayMaker.Generate(KeyPointType.BoardPos, id, ActivePlayer.Opponent);
				}
			}
			else if(tag == GAME_TAG.CARD_TARGET && value > 0)
			{
				if(controller == Game.PlayerId)
					ProposeKeyPoint(KeyPointType.PlaySpell, id, ActivePlayer.Player);
				else if(controller == Game.OpponentId)
					ProposeKeyPoint(KeyPointType.PlaySpell, id, ActivePlayer.Opponent);
			}
			else if(tag == GAME_TAG.EQUIPPED_WEAPON && value == 0)
			{
				if(controller == Game.PlayerId)
					ProposeKeyPoint(KeyPointType.WeaponDestroyed, id, ActivePlayer.Player);
				else if(controller == Game.OpponentId)
					ProposeKeyPoint(KeyPointType.WeaponDestroyed, id, ActivePlayer.Opponent);
			}
			else if(tag == GAME_TAG.EXHAUSTED && value > 0)
			{
				if(Game.Entities[id].GetTag(GAME_TAG.CARDTYPE) == (int)TAG_CARDTYPE.HERO_POWER)
				{
					if(controller == Game.PlayerId)
						ProposeKeyPoint(KeyPointType.HeroPower, id, ActivePlayer.Player);
					else if(controller == Game.OpponentId)
						ProposeKeyPoint(KeyPointType.HeroPower, id, ActivePlayer.Opponent);
				}
			}
			else if(tag == GAME_TAG.CONTROLLER && Game.Entities[id].IsInZone(TAG_ZONE.SECRET))
			{
				if(value == Game.PlayerId)
				{
					_gameHandler.HandleOpponentSecretTrigger(cardId, GetTurnNumber(), id);
					ProposeKeyPoint(KeyPointType.SecretStolen, id, ActivePlayer.Player);
				}
				else if(value == Game.OpponentId)
					ProposeKeyPoint(KeyPointType.SecretStolen, id, ActivePlayer.Player);
			}
			else if(tag == GAME_TAG.FATIGUE)
			{
				if(controller == Game.PlayerId)
					_gameHandler.HandlePlayerFatigue(Convert.ToInt32(rawValue));
				else if(controller == Game.OpponentId)
					_gameHandler.HandleOpponentFatigue(Convert.ToInt32(rawValue));
			}
			if(_waitForController != null)
			{
				if(!isRecursive)
				{
					TagChange((string)_waitForController.Tag, (int)_waitForController.Id, (string)_waitForController.Value, true);
					_waitForController = null;
				}
			}
		}
		private void ProposeKeyPoint(KeyPointType type, int id, ActivePlayer player)
		{
			if(_proposedKeyPoint != null)
				ReplayMaker.Generate(_proposedKeyPoint.Type, _proposedKeyPoint.Id, _proposedKeyPoint.Player);
			_proposedKeyPoint = new ReplayKeyPoint(null, type, id, player);
		}
		private void GameEndKeyPoint(bool victory, int id)
		{
			if(_proposedKeyPoint != null)
			{
				ReplayMaker.Generate(_proposedKeyPoint.Type, _proposedKeyPoint.Id, _proposedKeyPoint.Player);
				_proposedKeyPoint = null;
			}
			ReplayMaker.Generate(victory ? KeyPointType.Victory : KeyPointType.Defeat, id, ActivePlayer.Player);
		}
		private void DataGridKeyPoints_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
		{
			var selected = ((DataGrid)sender).SelectedItem as TurnViewItem;
			if(selected == null || selected.KeyPoint == null)
				return;
			_currentGameState = selected.KeyPoint;
			Update();
		}
		public void Load(List<ReplayKeyPoint> replay)
		{
			if(replay == null || replay.Count == 0)
				return;
			var selectedKeypoint = DataGridKeyPoints.SelectedItem as TurnViewItem;
			DataGridKeyPoints.Items.Clear();
			Replay = replay;
			_currentGameState = Replay.FirstOrDefault(r => r.Data.Any(x => x.HasTag(GAME_TAG.PLAYER_ID)));
			if(_currentGameState == null)
			{
				Logger.WriteLine("Error loading replay. No player entity found.");
				return;
			}
			_playerController = PlayerEntity.GetTag(GAME_TAG.CONTROLLER);
			_opponentController = OpponentEntity.GetTag(GAME_TAG.CONTROLLER);
			var currentTurn = -1;
			TurnViewItem tvi = null;
			foreach(var kp in Replay)
			{
				var entity = kp.Data.FirstOrDefault(x => x.Id == kp.Id);
				if(entity == null || (string.IsNullOrEmpty(entity.CardId) && kp.Type != KeyPointType.Victory && kp.Type != KeyPointType.Defeat))
					continue;
				if(kp.Type == KeyPointType.Summon && entity.GetTag(GAME_TAG.CARDTYPE) == (int)TAG_CARDTYPE.ENCHANTMENT)
					continue;
				var turn = (kp.Turn + 1) / 2;
				if(turn == 1)
				{
					if(!kp.Data.Any(x => x.HasTag(GAME_TAG.PLAYER_ID) && x.GetTag(GAME_TAG.RESOURCES) == 1))
						turn = 0;
				}
				if(turn > currentTurn)
				{
					currentTurn = turn;
					if(tvi != null && tvi.IsTurnRow && tvi.Turn.HasValue && !_collapsedTurns.Contains(tvi.Turn.Value))
						DataGridKeyPoints.Items.Remove(tvi); //remove empty turns
					tvi = new TurnViewItem {Turn = turn, IsCollapsed = _collapsedTurns.Contains(turn), ShowAll = _showAllTurns.Contains(turn)};
					DataGridKeyPoints.Items.Add(tvi);
				}
				if(!_showAllTurns.Contains(turn))
				{
					switch(kp.Type)
					{
						case KeyPointType.Attack:
							if(!Config.Instance.ReplayViewerShowAttack)
								continue;
							break;
						case KeyPointType.Death:
							if(!Config.Instance.ReplayViewerShowDeath)
								continue;
							break;
						case KeyPointType.Mulligan:
						case KeyPointType.DeckDiscard:
						case KeyPointType.HandDiscard:
							if(!Config.Instance.ReplayViewerShowDiscard)
								continue;
							break;
						case KeyPointType.Draw:
						case KeyPointType.Obtain:
						case KeyPointType.PlayToDeck:
						case KeyPointType.PlayToHand:
							if(!Config.Instance.ReplayViewerShowDraw)
								continue;
							break;
						case KeyPointType.HeroPower:
							if(!Config.Instance.ReplayViewerShowHeroPower)
								continue;
							break;
						case KeyPointType.SecretStolen:
						case KeyPointType.SecretTriggered:
							if(!Config.Instance.ReplayViewerShowSecret)
								continue;
							break;
						case KeyPointType.Play:
						case KeyPointType.PlaySpell:
						case KeyPointType.SecretPlayed:
							if(!Config.Instance.ReplayViewerShowPlay)
								continue;
							break;
						case KeyPointType.Summon:
							if(!Config.Instance.ReplayViewerShowSummon)
								continue;
							break;
					}
				}
				if(_collapsedTurns.Contains(turn))
					continue;
				tvi = new TurnViewItem();
				if(kp.Player == ActivePlayer.Player)
				{
					tvi.PlayerAction = kp.Type.ToString();
					tvi.AdditionalInfoPlayer = kp.GetAdditionalInfo();
				}
				else
				{
					tvi.OpponentAction = kp.Type.ToString();
					tvi.AdditionalInfoOpponent = kp.GetAdditionalInfo();
				}
				tvi.KeyPoint = kp;
				DataGridKeyPoints.Items.Add(tvi);
			}
			if(selectedKeypoint != null)
			{
				var newSelection = selectedKeypoint.Turn.HasValue
					                   ? DataGridKeyPoints.Items.Cast<TurnViewItem>()
					                                      .FirstOrDefault(x => x.Turn.HasValue && x.Turn.Value == selectedKeypoint.Turn.Value)
					                   : DataGridKeyPoints.Items.Cast<TurnViewItem>().FirstOrDefault(x => x.KeyPoint == selectedKeypoint.KeyPoint);
				if(newSelection != null)
				{
					DataGridKeyPoints.SelectedItem = newSelection;
					DataGridKeyPoints.ScrollIntoView(newSelection);
					var index = DataGridKeyPoints.Items.IndexOf(newSelection);
					DataGridRow dgrow = (DataGridRow)DataGridKeyPoints.ItemContainerGenerator.ContainerFromItem(DataGridKeyPoints.Items[index]);
					dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
				}
			}
			DataContext = this;
		}
 public void LoadNoUI(List<ReplayKeyPoint> replay)
 {
     if (replay == null || replay.Count == 0)
         return;
     Replay = replay;
     _currentGameState = Replay.FirstOrDefault(r => r.Data.Any(x => x.HasTag(PLAYER_ID)));
     if (_currentGameState == null)
     {
         Log.Error("No player entity found.");
         return;
     }
     _playerController = PlayerEntity.GetTag(CONTROLLER);
     _opponentController = OpponentEntity.GetTag(CONTROLLER);
 }