private void Analyze(string log) { var logLines = log.Split('\n'); foreach (var logLine in logLines) { _currentOffset += logLine.Length + 1; if (logLine.StartsWith("[Power]")) { _powerCount++; if ((_currentPlayer == Turn.Player && !_playerUsedHeroPower) || _currentPlayer == Turn.Opponent && !_opponentUsedHeroPower) { if (_heroPowerRegex.IsMatch(logLine)) { var id = _heroPowerRegex.Match(logLine).Groups["Id"].Value.Trim(); if (!string.IsNullOrEmpty(id)) { var heroPower = Game.GetCardFromId(id); if (heroPower.Type == "Hero Power") { if (_currentPlayer == Turn.Player) { GameEventHandler.HandlePlayerHeroPower(id, GetTurnNumber()); _playerUsedHeroPower = true; } else { GameEventHandler.HandleOpponentHeroPower(id, GetTurnNumber()); _opponentUsedHeroPower = true; } } } } } } else if (logLine.StartsWith("[Asset]")) { if (logLine.ToLower().Contains("victory_screen_start")) { GameEventHandler.HandleWin(); } else if (logLine.ToLower().Contains("defeat_screen_start")) { GameEventHandler.HandleLoss(); } else if (logLine.Contains("rank_window")) { Game.CurrentGameMode = Game.GameMode.Ranked; Logger.WriteLine(">>> GAME MODE: RANKED"); } } else if (logLine.StartsWith("[Bob] legend rank")) { if (!Game.IsInMenu) { GameEventHandler.HandleGameEnd(false); } } else if (logLine.StartsWith("[Bob] ---RegisterScreenPractice---")) { Game.CurrentGameMode = Game.GameMode.Practice; Logger.WriteLine(">>> GAME MODE: PRACTICE"); } else if (logLine.StartsWith("[Bob] ---RegisterScreenTourneys---")) { Game.CurrentGameMode = Game.GameMode.Casual; Logger.WriteLine(">>> GAME MODE: CASUAL (RANKED)"); } else if (logLine.StartsWith("[Bob] ---RegisterScreenForge---")) { Game.CurrentGameMode = Game.GameMode.Arena; Logger.WriteLine(">>> GAME MODE: ARENA"); } else if (logLine.StartsWith("[Bob] ---RegisterScreenFriendly---")) { Game.CurrentGameMode = Game.GameMode.Friendly; Logger.WriteLine(">>> GAME MODE: FRIENDLY"); } else if (logLine.StartsWith("[Bob] ---RegisterScreenBox---")) { //game ended Game.CurrentGameMode = Game.GameMode.None; Logger.WriteLine(">>> GAME MODE: NONE"); GameEventHandler.HandleGameEnd(true); _lastGameEnd = _currentOffset; _turnCount = 0; _lastOpponentDrawIncrementedTurn = false; _lastPlayerDrawIncrementedTurn = false; ClearLog(); } else if (logLine.StartsWith("[Zone]")) { if (_cardMovementRegex.IsMatch(logLine)) { var match = _cardMovementRegex.Match(logLine); var id = match.Groups["Id"].Value.Trim(); var from = match.Groups["from"].Value.Trim(); var to = match.Groups["to"].Value.Trim(); var zonePos = -1; //var zone = string.Empty; // Only for some log lines, should be valid in every action where we need it if (_opponentPlayRegex.IsMatch(logLine)) { var match2 = _opponentPlayRegex.Match(logLine); zonePos = Int32.Parse(match2.Groups["zonePos"].Value.Trim()); } if (_zoneRegex.IsMatch(logLine)) { //var match3 = _zoneRegex.Match(logLine); //zone = match3.Groups["zone"].Value.Trim(); GameEventHandler.PlayerSetAside(id); } //game start/end if (id.Contains("HERO") || (id.Contains("NAX") && id.Contains("_01"))) { if (!from.Contains("PLAY")) { if (to.Contains("FRIENDLY")) { GameEventHandler.HandleGameStart(_heroIdDict[id]); } else if (to.Contains("OPPOSING")) { string heroName; if (_heroIdDict.TryGetValue(id, out heroName)) { GameEventHandler.SetOpponentHero(heroName); } } } _powerCount = 0; continue; } switch (from) { case "FRIENDLY DECK": if (to == "FRIENDLY HAND") { //player draw if (_powerCount >= PowerCountTreshold) { _turnCount++; GameEventHandler.TurnStart(Turn.Player, GetTurnNumber()); _currentPlayer = Turn.Player; _playerUsedHeroPower = false; _lastPlayerDrawIncrementedTurn = true; } else { _lastPlayerDrawIncrementedTurn = false; } GameEventHandler.HandlePlayerDraw(id, GetTurnNumber()); } else if (to == "FRIENDLY SECRET") { GameEventHandler.HandlePlayerSecretPlayed(id, GetTurnNumber(), true); } else { //player discard from deck GameEventHandler.HandlePlayerDeckDiscard(id, GetTurnNumber()); } break; case "FRIENDLY HAND": if (to == "FRIENDLY DECK") { if (_lastPlayerDrawIncrementedTurn) { _turnCount--; } GameEventHandler.HandlePlayerMulligan(id); } else if (to == "FRIENDLY PLAY") { GameEventHandler.HandlePlayerPlay(id, GetTurnNumber()); } else if (to == "FRIENDLY SECRET") { GameEventHandler.HandlePlayerSecretPlayed(id, GetTurnNumber(), false); } else { //player discard from hand and spells GameEventHandler.HandlePlayerHandDiscard(id, GetTurnNumber()); } break; case "FRIENDLY PLAY": if (to == "FRIENDLY HAND") { GameEventHandler.HandlePlayerBackToHand(id, GetTurnNumber()); } break; case "OPPOSING HAND": if (to == "OPPOSING DECK") { if (_lastOpponentDrawIncrementedTurn) { _turnCount--; } //opponent mulligan GameEventHandler.HandleOpponentMulligan(zonePos); } else if (to == "OPPOSING SECRET") { GameEventHandler.HandleOpponentSecretPlayed(id, zonePos, GetTurnNumber(), false); } else if (to == "OPPOSING PLAY") { GameEventHandler.HandleOpponentPlay(id, zonePos, GetTurnNumber()); } else { GameEventHandler.HandleOpponentHandDiscard(id, zonePos, GetTurnNumber()); } break; case "OPPOSING DECK": if (to == "OPPOSING HAND") { if (_powerCount >= PowerCountTreshold) { _turnCount++; GameEventHandler.TurnStart(Turn.Opponent, GetTurnNumber()); _currentPlayer = Turn.Opponent; _opponentUsedHeroPower = false; _lastOpponentDrawIncrementedTurn = true; } else { _lastOpponentDrawIncrementedTurn = false; } //opponent draw GameEventHandler.HandlOpponentDraw(GetTurnNumber()); } else if (to == "OPPOSING SECRET") { GameEventHandler.HandleOpponentSecretPlayed(id, zonePos, GetTurnNumber(), true); } else { //opponent discard from deck GameEventHandler.HandleOpponentDeckDiscard(id, GetTurnNumber()); } break; case "OPPOSING SECRET": //opponent secret triggered GameEventHandler.HandleOpponentSecretTrigger(id, GetTurnNumber()); break; case "OPPOSING PLAY": if (to == "OPPOSING HAND") //card from play back to hand (sap/brew) { GameEventHandler.HandleOpponentPlayToHand(id, GetTurnNumber()); } break; default: if (to == "OPPOSING HAND") { //coin, thoughtsteal etc GameEventHandler.HandleOpponentGet(GetTurnNumber()); } else if (to == "FRIENDLY HAND") { //coin, thoughtsteal etc GameEventHandler.HandlePlayerGet(id, GetTurnNumber()); } else if (to == "OPPOSING GRAVEYARD" && from == "" && id != "") { //todo: not sure why those two are here //CardMovement(this, new CardMovementArgs(CardMovementType.OpponentPlay, id)); } else if (to == "FRIENDLY GRAVEYARD" && from == "") { // CardMovement(this, new CardMovementArgs(CardMovementType.PlayerPlay, id)); } break; } _powerCount = 0; } } } }