/// <summary> /// Check if data is correct; if not correct, delete it and download the correct data; then start the main loop /// </summary> /// <param name="downloaded"></param> /// <returns></returns> public bool VerifyData(bool downloaded) { Console.WriteLine("Verifying Data"); ControlUtils.CreateTextBox(sp, "Verifying Data"); string hash = ""; bool hashesMatch = true; for (int i = 1; i <= numOfSets; i++) { hashTable[i - 1].TryGetValue(Properties.Settings.Default.Language, out string correctHash); if (File.Exists(mainDirName + "set" + i.ToString() + "-" + Properties.Settings.Default.Language + ".json")) { hash = StringUtils.CalculateMD5(mainDirName + "set" + i.ToString() + "-" + Properties.Settings.Default.Language + ".json"); } if (hash != correctHash) { hashesMatch = false; } } if (hashesMatch) { Console.WriteLine("Deleting Temp Data"); ControlUtils.CreateTextBox(sp, "Deleting Temp Data"); if (Directory.Exists(tempDirName)) { FileUtils.DeleteFromDir(tempDirName); Directory.Delete(tempDirName); } Console.WriteLine("Succesfully verified Data"); ControlUtils.CreateTextBox(sp, "Succesfully verified Data"); System.Threading.Tasks.Task.Delay(100).ContinueWith(t => Main()); return(true); } if (!downloaded) { if (!hashesMatch) { Console.WriteLine("Hashes don't match"); ControlUtils.CreateTextBox(sp, "Hashes don't match"); Directory.CreateDirectory(mainDirName); Console.WriteLine("Created folder " + mainDirName); ControlUtils.CreateTextBox(sp, "Created folder " + mainDirName); Directory.CreateDirectory(tempDirName); Console.WriteLine("Created folder " + tempDirName); ControlUtils.CreateTextBox(sp, "Created folder " + tempDirName); Console.WriteLine("Deleting content of " + mainDirName); ControlUtils.CreateTextBox(sp, "Deleting content of " + mainDirName); FileUtils.DeleteFromDir(mainDirName); ControlUtils.CreateTextBox(sp, "Downloading DataDragon"); FileUtils.DownloadToDir(tempDirName, WindowTitle); //Unzip File Console.WriteLine("Unziping DataDragon"); ControlUtils.CreateTextBox(sp, "Unziping DataDragon"); Directory.CreateDirectory(mainDirName + "/full"); Directory.CreateDirectory(mainDirName + "/cards"); for (int i = 1; i <= numOfSets; i++) { ZipFile.ExtractToDirectory(tempDirName + "/datadragon-set" + i.ToString() + "-" + Properties.Settings.Default.Language + ".zip", tempDirName + "/datadragon-set" + i.ToString() + "-" + Properties.Settings.Default.Language + ""); DirectoryInfo dir = new DirectoryInfo(tempDirName + "/datadragon-set" + i.ToString() + "-" + Properties.Settings.Default.Language + "/" + Properties.Settings.Default.Language + "/img/cards"); foreach (FileInfo file in dir.EnumerateFiles("*-alt*.png")) { file.Delete(); } Console.WriteLine("Moving full images to " + mainDirName + "full/"); ControlUtils.CreateTextBox(sp, "Moving full images to " + mainDirName + "full/"); foreach (FileInfo file in dir.EnumerateFiles("*-full.png")) { string[] filename = { mainDirName + "/full/", file.Name, "_" }; file.MoveTo(string.Join("", filename)); } Console.WriteLine("Moving cards to " + mainDirName + "cards/"); ControlUtils.CreateTextBox(sp, "Moving cards to " + mainDirName + "cards/"); foreach (FileInfo file in dir.EnumerateFiles()) { string[] filename = { mainDirName + "/cards/", file.Name, "_" }; file.MoveTo(string.Join("", filename)); } } DirectoryInfo mainDirCards = new DirectoryInfo(mainDirName + "/cards"); Console.WriteLine("Resizing card images"); ControlUtils.CreateTextBox(sp, "Resizing card images"); foreach (FileInfo file in mainDirCards.EnumerateFiles("*.png_")) { Bitmap image; Bitmap img = new Bitmap(file.FullName); image = ImageUtils.ResizeImage(img, 340, 512); image.Save(file.FullName.TrimEnd('_'), ImageFormat.Png); img.Dispose(); file.Delete(); } mainDirCards = new DirectoryInfo(mainDirName + "/full"); Console.WriteLine("Cropping full images and applying gradient"); ControlUtils.CreateTextBox(sp, "Cropping full images and applying gradient"); foreach (FileInfo file in mainDirCards.EnumerateFiles("*.png_")) { Bitmap image; Bitmap img = new Bitmap(file.FullName); if (img.Width == 1024) { image = ImageUtils.ResizeImage(img, 250, 250); image = ImageUtils.CropImage(image, 25, 110, 200, 30); image = ImageUtils.AddGradient(image, file.FullName); image.Save(file.FullName.TrimEnd('_'), ImageFormat.Png); } else { image = ImageUtils.ResizeImage(img, 200, 100); image = ImageUtils.CropImage(image, 0, 30, 200, 30); image = ImageUtils.AddGradient(image, file.FullName); image.Save(file.FullName.TrimEnd('_'), ImageFormat.Png); } img.Dispose(); file.Delete(); } for (int i = 1; i <= numOfSets; i++) { FileInfo dataSetFile = new FileInfo(tempDirName + "/datadragon-set" + i.ToString() + "-" + Properties.Settings.Default.Language + "/" + Properties.Settings.Default.Language + "/data/set" + i.ToString() + "-" + Properties.Settings.Default.Language + ".json"); dataSetFile.MoveTo(mainDirName + "/set" + i.ToString() + "-" + Properties.Settings.Default.Language + ".json"); } bool verified = VerifyData(true); if (!verified) { Console.WriteLine("Could not verify data"); Environment.Exit(1337); } } } return(hashesMatch); }
public void Main() { ControlUtils.ClearControls(sp, cardDrawPercentage1, cardDrawPercentage2, cardDrawPercentage3, cardsInHandText); if (Properties.Settings.Default.AutoMinimize) { ControlUtils.MinimizeWindow(this, true); isMinimized = true; } while (true) { while (!inMatch || !gameIsRunning) { try { JObject responseString = JsonConvert.DeserializeObject <JObject>(Utils.HttpReq($"http://localhost:{Properties.Settings.Default.Port}/positional-rectangles")); gameIsRunning = true; if (responseString["GameState"].ToString() == "InProgress") { inMatch = true; Console.WriteLine("Starting timer"); ControlUtils.ChangeMainWindowTitle(WindowTitle, "YARDT"); aTimer.IsEnabled = true; if (Properties.Settings.Default.AutoMinimize) { ControlUtils.MinimizeWindow(this, false); isMinimized = false; } if (!gotDeck) { gotDeck = true; string resString = Utils.HttpReq($"http://localhost:{Properties.Settings.Default.Port}/static-decklist"); if (resString == "failure") { JObject expeditionState = JsonConvert.DeserializeObject <JObject>(Utils.HttpReq($"http://localhost:{Properties.Settings.Default.Port}/expeditions-state")); deck = DeckFromExpedition(expeditionState); } else { deck = JsonConvert.DeserializeObject <JObject>(resString); } manaCostOrder.Clear(); foreach (JToken card in deck["CardsInDeck"]) { JProperty cardProperty = card.ToObject <JProperty>(); manaCostOrder.Add(cardProperty.Name); cardsLeftInDeck += (int)cardProperty.Value; } sortedManaCost = false; Console.WriteLine("Got deck"); } } else { if (printMenu) { Console.WriteLine("In menu, waiting for game to start"); ControlUtils.ChangeMainWindowTitle(WindowTitle, "Waiting for match to start"); printMenu = false; } if (inMatch || aTimer.IsEnabled) { Console.WriteLine("Not currently in game, stopping timer"); aTimer.IsEnabled = false; inMatch = false; } } } catch (Exception) { Console.WriteLine("Could not connect to game!"); Console.WriteLine("Trying again in 2 sec"); ControlUtils.ChangeMainWindowTitle(WindowTitle, "Waiting for game to start"); //Console.WriteLine("Message :{0} ", err.Message); gameIsRunning = false; Thread.Sleep(2000); } } //Load set from json if (!setLoaded) { set = FileUtils.LoadJson(mainDirName); setLoaded = true; Console.WriteLine("Loaded set"); } if (!sortedManaCost && setLoaded) { Console.WriteLine("Sorting deck"); manaCostOrder.Sort((x, y) => { int xManaCost = -1, yManaCost = -1; foreach (JToken item in set) { if (item.Value <string>("cardCode") == x) { xManaCost = item.Value <int>("cost"); } else if (item.Value <string>("cardCode") == y) { yManaCost = item.Value <int>("cost"); } if (xManaCost >= 0 && yManaCost >= 0) { break; } } return(xManaCost.CompareTo(yManaCost)); }); sortedManaCost = true; Console.WriteLine("Sorted deck"); } if (playerCardsInPlay is JArray && !JToken.DeepEquals(playerCardsInPlay, cardsInPlayCopy)) { Console.WriteLine("Cards are different"); cardsInPlayCopy = playerCardsInPlay; foreach (JToken card in cardsInPlayCopy) { if (!playerCards.ContainsKey(card.Value <string>("CardID"))) { Console.WriteLine("Adding card: " + card.Value <string>("CardID") + " to playerCards"); playerCards.Add(card.Value <string>("CardID"), card.ToObject <JObject>()); } } numOfCardsInHand = Utils.GetCardsInHand(playerCardsInPlay, gameWindowHeight); ControlUtils.UpdateCardsInHand(cardsInHandText, numOfCardsInHand); if (inMulligan && playerCards.Count > 4) { playerCards.Clear(); inMulligan = false; Console.WriteLine("No longer in mulligan phase"); Utils.PrintDeckList(deck, set, manaCostOrder, sp, ref labelsDrawn, mainDirName); } if (!inMulligan && deck.Count > 0) { foreach (string card in playerCards.Keys) { if (!purgatory.ContainsKey(card)) { purgatory.Add(card, playerCards[card]); foreach (JToken item in deck["CardsInDeck"]) { JProperty itemProperty = item.ToObject <JProperty>(); if (itemProperty.Name == (string)playerCards[card]["CardCode"] && (int)itemProperty.Value > 0) { toDelete.Add(itemProperty.Name); break; } } } //To-do: add card to graveyard } if (toDelete.Count > 0) { Console.WriteLine("Deleting cards from deck"); foreach (string name in toDelete) { deck["CardsInDeck"][name] = deck["CardsInDeck"].Value <int>(name) - 1; cardsLeftInDeck--; ControlUtils.UpdateCardsLeftInDeck(cardDrawPercentage1, cardDrawPercentage2, cardDrawPercentage3, cardsLeftInDeckText, cardsLeftInDeck); Console.Write("Decremented item: "); Console.WriteLine(name); } toDelete.Clear(); Utils.PrintDeckList(deck, set, manaCostOrder, sp, ref labelsDrawn, mainDirName); } } } Thread.Sleep(500); } }