/// <summary> /// Take a team name and college name from the user and find all decks brought by any matching teams in the database /// </summary> private static void PreviewOpponent() { /* We need team name & college in case one of the two isn't unique. * Could also use the team ID field from TESPA but I didn't import those to my sheet when I started, * and haven't felt like adding them. */ Console.Write("Enter the team name of your opponent: "); string teamName = Console.ReadLine(); teamName = teamName.Trim(); Console.WriteLine("Entered name: " + teamName); Console.Write("Enter the name of your opponents college: "); string collegeName = Console.ReadLine(); collegeName = collegeName.Trim(); Console.WriteLine("Entered College name: " + collegeName); //save time by searching for the opponent and saving their deck codes first //then deserializing the decks later string[] deckCodes = new string[4 * NUM_SHEETS]; int deckNum = 0; //search for the opponent and then add all their decks to the array for (int i = 1; i <= NUM_SHEETS; i++) { //loop through each cell in the column of team names GoogleSheetReader nameReader = new GoogleSheetReader("Sheet" + i + "!A1:A"); int row = 0; foreach (string team in nameReader) { row++; if (team == teamName) { //check that the team of matching name is the team from the correct college //'foreach' should only execute once since we only ask the Sheets API for a single cell GoogleSheetReader possibleMatch = new GoogleSheetReader("Sheet" + i + "!B" + row + ":B" + row); foreach (string college in possibleMatch) { if (college == collegeName) { GoogleSheetReader opponentDecksForWeekI = new GoogleSheetReader("Sheet" + i + "!C" + row + ":F" + row); foreach (string deckCode in opponentDecksForWeekI) { deckCodes[deckNum++] = deckCode; } } } } } } //deserialize all the decks we just found HearthDb.Deckstrings.Deck deck; int index = -1; //this is for delimiting between weeks so that we don't dump 28 decks on our user at once string toPrint = ""; //this is faster than lots of Console.WriteLine() calls foreach (string code in deckCodes) { //teams bring 4 decks per week. delimiting the output by week keeps the user sane. if (++index % 4 == 0) { toPrint += "\n----Week Number: " + index / 4 + " done. press Enter to continue with next week."; Console.WriteLine(toPrint); toPrint = ""; Console.ReadLine(); } try { deck = HearthDb.Deckstrings.DeckSerializer.Deserialize(code); toPrint += HearthDb.Deckstrings.DeckSerializer.Serialize(deck, true) + "\n"; } //return the raw code in case we can't read it. this helps the user take it elsewhere for a more reliable deserialize without finding it manually catch (ArgumentException) { toPrint += "\n---------------------\n" + "Deserializer couldn't read: " + code + "\n---------------------\n"; } } toPrint += "All weeks done.\n"; Console.WriteLine(toPrint); //I think this might be unnecessary based off memory but I don't feel like testing that theory rn Console.ReadLine(); }
private static void SummarizeMeta() { //these are the cards that are used to identify archetypes. Dictionary <string, int> dbfIDs = new Dictionary <string, int> { { "Wispering Woods", 47063 }, { "Baku", 48158 }, { "Malygos", 436 }, { "Druid Quest", 41099 }, { "King Togwaggle", 46589 }, { "Azalina Soulthief", 46874 }, { "Hadronox", 43439 }, { "Mecha'thun", 48625 }, { "Spiteful Summoner", 46551 }, { "Rogue Quest", 41222 }, { "Kingsbane", 47035 }, { "Devilsaur Egg", 41259 }, { "Academic Espionage", 48040 }, { "Pogo-Hopper", 48471 }, { "Leeroy Jenkins", 559 }, { "Genn Greymane", 47693 }, { "Soul Infusion", 48211 }, { "Carnivorous Cube", 45195 }, { "Voidlord", 46056 }, { "Zola", 46403 }, { "Kangor's Army", 49009 }, { "Murloc Warleader", 1063 }, { "Warrior Quest", 41427 }, { "Aluneth", 43426 }, { "Book of Specters", 47054 }, { "Dragoncaller Alanna", 46499 }, { "Archmage Antonidas", 1080 }, { "Alexstraza", 581 }, { "Zerek's Cloning Gallery", 49421 }, { "Divine Spirit", 1361 }, { "Al'Akir the Windlord", 32 }, { "The Lich King", 42818 }, { "Shudderwock", 48111 }, { "Rhok'delar", 43369 }, { "Subject 9", 49447 } }; //TODO decksScanned is currently assigned but unused. this is for implementing percentages rather than raw numbers when I feel like it int decksScanned = 0, invalidDecks = 0, //counter vars for all the different deck archetypes tracked warlockZoo = 0, warlockEven = 0, warlockControl = 0, warlockCube = 0, warlockMechathun = 0, warlockOther = 0, druidToken = 0, druidMalygos = 0, druidTogwaggle = 0, druidQuest = 0, druidTaunt = 0, druidMechathun = 0, druidSpiteful = 0, druidOther = 0, paladinOdd = 0, paladinEven = 0, paladinOther = 0, paladinOTK = 0, paladinMech = 0, paladinMurloc = 0, rogueOdd = 0, rogueOther = 0, rogueQuest = 0, rogueMaly = 0, rogueKingsbane = 0, rogueDeathrattle = 0, rogueThief = 0, roguePogo = 0, rogueAggro = 0, warriorOdd = 0, warriorOddQuest = 0, warriorQuest = 0, warriorMechathun = 0, warriorOther = 0, mageTempo = 0, mageHand = 0, mageBigSpell = 0, mageExodia = 0, mageOther = 0, priestRez = 0, priestControl = 0, priestDivineSpirit = 0, priestMechathun = 0, priestMechathunQuest = 0, priestOther = 0, shamanEven = 0, shamanOther = 0, shamanMidrange = 0, shamanShudderwok = 0, hunterDeathrattle = 0, hunterSecret = 0, hunterSpell = 0, hunterOther = 0; HearthDb.Deckstrings.Deck deck; Dictionary <int, int> cardDBFIDs; string toPrint = ""; //loop through each sheet of my google doc (week of the tournament) for (int i = 1; i <= NUM_SHEETS; i++) { GoogleSheetReader reader = new GoogleSheetReader("Sheet" + i + "!C:F"); foreach (string deckCode in reader) { //ignore empty cells from no-show / disqualified teams if (deckCode.Length > 1) { decksScanned++; try { /* * I highly advise minimizing all these if/else statements. * I literally check for one card and then assume that the deck is one of a few archetypes * It is ugly and I hate it and you should too but I don't have access to HearthSim's archetype analysis * If you have a better solution, please fork and implement ;) */ deck = HearthDb.Deckstrings.DeckSerializer.Deserialize(deckCode); cardDBFIDs = deck.CardDbfIds; if (deck.GetHero().Class.ToString() == "HUNTER") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Devilsaur Egg"))) { hunterDeathrattle++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Subject 9"))) { hunterSecret++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Rhok'delar"))) { hunterSecret++; } else { hunterOther++; } } else if (deck.GetHero().Class.ToString() == "WARLOCK") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Genn Greymane"))) { warlockEven++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Soul Infusion"))) { warlockZoo++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Carnivorous Cube"))) { warlockCube++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Voidlord"))) { warlockControl++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Mecha'thun"))) { warlockMechathun++; } else { warlockOther++; } } else if (deck.GetHero().Class.ToString() == "MAGE") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Aluneth"))) { mageTempo++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Book of Specters"))) { mageHand++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Dragoncaller Alanna"))) { mageBigSpell++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Archmage Antonidas"))) { mageExodia++; } else { mageOther++; } } else if (deck.GetHero().Class.ToString() == "ROGUE") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Baku"))) { rogueOdd++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Rogue Quest"))) { rogueQuest++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Malygos"))) { rogueMaly++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Kingsbane"))) { rogueKingsbane++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Devilsaur Egg"))) { rogueDeathrattle++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Academic Espionage"))) { rogueThief++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Pogo-Hopper"))) { roguePogo++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Leeroy Jenkins"))) //but NOT Baku { rogueAggro++; } else { rogueOther++; } } else if (deck.GetHero().Class.ToString() == "DRUID") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Wispering Woods"))) { druidToken++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Malygos"))) { druidMalygos++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("King Togwaggle"))) { druidTogwaggle++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Hadronox"))) { druidTaunt++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Druid Quest"))) { druidQuest++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Mecha'thun"))) { druidMechathun++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Spiteful Summoner"))) { druidSpiteful++; } else { druidOther++; } } else if (deck.GetHero().Class.ToString() == "SHAMAN") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Genn Greymane"))) { shamanEven++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Al'Akir the Windlord")) || cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("The Lich King"))) { shamanMidrange++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Shudderwock"))) { shamanShudderwok++; } else { shamanOther++; } } else if (deck.GetHero().Class.ToString() == "WARRIOR") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Baku"))) { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Warrior Quest"))) { warriorOddQuest++; } else { warriorOdd++; } } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Warrior Quest"))) { warriorQuest++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Mecha'thun"))) { warriorMechathun++; } else { warriorOther++; } } else if (deck.GetHero().Class.ToString() == "PRIEST") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Zerek's Cloning Gallery"))) { priestRez++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Alexstraza"))) { priestControl++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Mecha'thun"))) { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Priest Quest"))) { priestMechathunQuest++; } else { priestMechathun++; } } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Divine Spirit"))) { priestDivineSpirit++; } else { priestOther++; } } else if (deck.GetHero().Class.ToString() == "PALADIN") { if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Baku"))) { paladinOdd++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Zola"))) { paladinOTK++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Genn Greymane"))) { paladinEven++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Kangor's Army"))) { paladinMech++; } else if (cardDBFIDs.ContainsKey(dbfIDs.GetValueOrDefault("Murloc Warleader"))) { paladinMurloc++; } else { paladinOther++; } } } //I don't know why some decks cause errors. Bug in HearthDB?? catch (ArgumentException) { invalidDecks++; } } } } //nullify vars after use to save some memory(?) dbfIDs = null; deck = null; cardDBFIDs = null; //I wish I could collapse the following massive print Console.WriteLine(toPrint + "\n\nMeta Analysis Done. Unrecognized Decks Above. Press ENTER to continue to overview."); toPrint = ""; Console.ReadLine(); Console.Clear(); toPrint += "Invalid Decks: " + invalidDecks + "\n"; //Druid data toPrint += "\nDruid Archetypes: " + "\n Token Druids: \t\t" + druidToken + "\n Malygos Druids: \t" + druidMalygos + "\n Togwaggle Druids: \t" + druidTogwaggle + "\n Taunt Druids: \t\t" + druidTaunt + "\n Mecha'thun Druids: \t" + druidMechathun + "\n Spiteful Druids: \t" + druidSpiteful + "\n Quest Druids: \t\t" + druidQuest + "\n Other Druids: \t\t" + druidOther + "\n"; //Rogue data toPrint += "\n\nRogue Archetypes: " + "\n Odd Rogues: \t\t" + rogueOdd + "\n Quest Rogue: \t\t" + rogueQuest + "\n Kingsbane Rogues: \t" + rogueKingsbane + "\n Thief Rogues: \t\t" + rogueThief + "\n Malygos Rogue: \t" + rogueMaly + "\n Deathrattle Rogues: \t" + rogueDeathrattle + "\n Aggro Rogues: \t\t" + rogueAggro + "\n Pogo-Hopper Rogues: \t" + roguePogo + "\n Other Rogues: \t\t" + rogueOther + "\n"; //Warlock Data toPrint += "\n\nWarlock Archetypes: " + "\n Zoo Warlocks: \t\t" + warlockZoo + "\n Even Warlocks: \t" + warlockEven + "\n Control Warlocks: \t" + warlockControl + "\n Cube Warlocks: \t" + warlockCube + "\n Mecha'thun Warlocks: \t" + warlockMechathun + "\n Other Warlocks: \t" + warlockOther + "\n"; //Paladin Data toPrint += "\n\nPaladin Archetypes: " + "\n Odd Paladin: \t\t" + paladinOdd + "\n Even Paladin: \t\t" + paladinEven + "\n OTK Paladin: \t\t" + paladinOTK + "\n Mech Paladin: \t\t" + paladinMech + "\n Murloc Paladin: \t" + paladinMurloc + "\n Other Paladin: \t" + paladinOther + "\n"; //Warrior Data toPrint += "\n\nWarrior Archetypes: " + "\n Odd Warriors: \t\t" + warriorOdd + "\n Odd Quest Warriors: \t" + warriorOddQuest + "\n Quest Warriors: \t" + warriorQuest + "\n Mecha'thun Warriors: \t" + warriorMechathun + "\n Other Warriors: \t" + warriorOther + "\n"; //Mage data toPrint += "\n\nMage Archetypes: " + "\nTempo Mages: \t" + mageTempo + "\nBig Spell Mages: \t\t" + mageBigSpell + "\nExodia Mages: \t\t" + mageExodia + "\nHand Mages: \t\t" + mageHand + "\nOther Mages: \t\t" + mageOther + "\n"; //Priest Data toPrint += "\n\nPriest Archetypes: " + "\nControl Priests: \t" + priestControl + "\nRez Priests: \t\t" + priestRez + "\nDS Priests: \t\t" + priestDivineSpirit + "\nMecha'thun Priests: \t" + priestMechathun + "\nMecha Quest Priests: \t" + priestMechathunQuest + "\nOther Priests: \t" + priestOther + "\n"; //Shaman Data toPrint += "\n\nShaman Archetypes:" + "\nEven Shamans: \t\t" + shamanEven + "\nMidrange Shamans: \t" + shamanMidrange + "\nShudderwok Shamans: \t" + shamanShudderwok + "\nOther Shamans: \t\t" + shamanOther + "\n"; toPrint += "\nHunter Archetypes: " + "\nDeathrattle Hunters: \t" + hunterDeathrattle + "\nSecret Hunters: \t\t" + hunterSecret + "\nSpell Hunters: \t\t" + hunterSpell + "\nOther Hunters: \t\t" + hunterOther + "\n"; Console.WriteLine(toPrint); toPrint = ""; Console.ReadLine(); }