private static void PersistentUpdateStats() { // Total stats string filename = Path.Combine(FileManager.LoggingPath, String.Format("FullStats - {0}.xml", PlayerStatus.ActorClass)); PersistentTotalStats = PersistentUpdateOne(filename); // World ID stats filename = Path.Combine(FileManager.LoggingPath, String.Format("WorldStats {1} - {0}.xml", PlayerStatus.ActorClass, cachedStaticWorldId)); if (!worldStatsDictionary.ContainsKey(cachedStaticWorldId)) { worldStatsDictionary.Add(cachedStaticWorldId, new PersistentStats()); } worldStatsDictionary[cachedStaticWorldId] = PersistentUpdateOne(filename); // Sets LastSaved to now for the rest of the things TimeSpan TotalRunningTime = DateTime.Now.Subtract(ItemStatsWhenStartedBot); PersistentLastSaved.TotalRunningTime = TotalRunningTime; PersistentLastSaved.TotalDeaths = iTotalDeaths; PersistentLastSaved.TotalLeaveGames = TotalLeaveGames; PersistentLastSaved.TotalJoinGames = iTotalJoinGames; PersistentLastSaved.TotalProfileRecycles = TotalProfileRecycles; PersistentLastSaved.TotalXp = iTotalXp; PersistentLastSaved.LastXp = iLastXp; PersistentLastSaved.NextLvXp = iNextLvXp; PersistentStats.UpdateItemsDroppedStats(PersistentLastSaved.ItemsDropped, ItemsDroppedStats); PersistentStats.UpdateItemsPickedStats(PersistentLastSaved.ItemsPicked, ItemsPickedStats); }
private static PersistentStats PersistentUpdateOne(String aFilename) { PersistentStats updated = new PersistentStats(); // Load from file var xml = new XmlSerializer(updated.GetType()); if (File.Exists(aFilename)) { using (var reader = new StreamReader(aFilename)) { updated = xml.Deserialize(reader) as PersistentStats; if (updated.IsReset) { updated.Reset(); } } } else { updated.Reset(); } // If we are in new session (started times don't match) we clear PersistentLastSaved, // because we want to add all we now have. // However, after reset, we don't want to do that, because we are (hopefully) curious // only about new stuff if (updated.WhenStartedSession != ItemStatsWhenStartedBot && !updated.IsReset) { PersistentLastSaved.Reset(); } // Add the differences TimeSpan TotalRunningTime = DateTime.Now.Subtract(ItemStatsWhenStartedBot); updated.IsReset = false; updated.WhenStartedSession = ItemStatsWhenStartedBot; updated.TotalRunningTime += TotalRunningTime - PersistentLastSaved.TotalRunningTime; updated.TotalDeaths += iTotalDeaths - PersistentLastSaved.TotalDeaths; updated.TotalLeaveGames += TotalLeaveGames - PersistentLastSaved.TotalLeaveGames; updated.TotalJoinGames += iTotalJoinGames - PersistentLastSaved.TotalJoinGames; updated.TotalProfileRecycles += TotalProfileRecycles - PersistentLastSaved.TotalProfileRecycles; updated.TotalXp += iTotalXp - PersistentLastSaved.TotalXp; updated.LastXp += iLastXp - PersistentLastSaved.LastXp; updated.NextLvXp += iNextLvXp - PersistentLastSaved.NextLvXp; // Adds difference between now and LastSaved, and set LastSaved to now updated.AddItemsDroppedStats(PersistentLastSaved.ItemsDropped, ItemsDroppedStats); updated.AddItemsPickedStats(PersistentLastSaved.ItemsPicked, ItemsPickedStats); // Write the PersistentTotalStats using (var writer = new StreamWriter(aFilename)) { xml.Serialize(writer, updated); writer.Flush(); } return(updated); }
void Awake() { if (instance != null && instance != this) { Destroy(this.gameObject); return; } else { instance = this; } DontDestroyOnLoad(this.gameObject); transform.parent = null; }
void Start() { Application.targetFrameRate = 60; // Initiate fields playerColor = "red"; // Get references to components sr = GetComponent <SpriteRenderer>(); anim = GetComponent <Animator>(); bomb = 10; move = GetComponent <movement>(); perStats = GameObject.Find("PersistentStats").GetComponent <PersistentStats>(); pointsBlue = perStats.initBluePoints; pointsRed = perStats.initRedPoints; }
internal static void LogStats(FileStream LogStream, PersistentStats aPersistentStats) { var ts = aPersistentStats; // Create whole new file using (StreamWriter LogWriter = new StreamWriter(LogStream)) { LogWriter.WriteLine("===== Misc Statistics ====="); LogWriter.WriteLine("Total tracking time: " + ((int)ts.TotalRunningTime.TotalHours).ToString() + "h " + ts.TotalRunningTime.Minutes.ToString("0.00") + "m " + ts.TotalRunningTime.Seconds.ToString() + "s"); LogWriter.WriteLine("Total deaths: " + ts.TotalDeaths.ToString() + " [" + Math.Round(ts.TotalDeaths / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); LogWriter.WriteLine("Total games (approx): " + ts.TotalLeaveGames.ToString() + " [" + Math.Round(ts.TotalLeaveGames / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); if (ts.TotalLeaveGames == 0 && ts.TotalJoinGames > 0) { if (ts.TotalJoinGames == 1 && ts.TotalProfileRecycles > 1) { LogWriter.WriteLine("(a profile manager/death handler is interfering with join/leave game events, attempting to guess total runs based on profile-loops)"); LogWriter.WriteLine("Total full profile cycles: " + ts.TotalProfileRecycles.ToString() + " [" + Math.Round(ts.TotalProfileRecycles / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); } else { LogWriter.WriteLine("(your games left value may be bugged @ 0 due to profile managers/routines etc., now showing games joined instead:)"); LogWriter.WriteLine("Total games joined: " + ts.TotalJoinGames.ToString() + " [" + Math.Round(ts.TotalJoinGames / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); } } LogWriter.WriteLine("Total XP gained: " + Math.Round(ts.TotalXp / (float)1000000, 2).ToString("0.00") + " million [" + Math.Round(ts.TotalXp / ts.TotalRunningTime.TotalHours / 1000000, 2).ToString("0.00") + " million per hour]"); LogWriter.WriteLine(""); LogWriter.WriteLine("===== Item DROP Statistics ====="); // Item stats if (ts.ItemsDropped.Total > 0) { LogWriter.WriteLine("Items:"); LogWriter.WriteLine("Total items dropped: " + ts.ItemsDropped.Total.ToString() + " [" + Math.Round(ts.ItemsDropped.Total / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); LogWriter.WriteLine("Items dropped by ilvl: "); for (int itemLevel = 1; itemLevel <= 63; itemLevel++) { if (ts.ItemsDropped.TotalPerLevel[itemLevel] > 0) { LogWriter.WriteLine("- ilvl" + itemLevel.ToString() + ": " + ts.ItemsDropped.TotalPerLevel[itemLevel].ToString() + " [" + Math.Round(ts.ItemsDropped.TotalPerLevel[itemLevel] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsDropped.TotalPerLevel[itemLevel] / ts.ItemsDropped.Total) * 100, 2).ToString("0.00") + " %}"); } } LogWriter.WriteLine(""); LogWriter.WriteLine("Items dropped by quality: "); for (int iThisQuality = 0; iThisQuality <= 3; iThisQuality++) { if (ts.ItemsDropped.TotalPerQuality[iThisQuality] > 0) { LogWriter.WriteLine("- " + sQualityString[iThisQuality] + ": " + ts.ItemsDropped.TotalPerQuality[iThisQuality].ToString() + " [" + Math.Round(ts.ItemsDropped.TotalPerQuality[iThisQuality] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsDropped.TotalPerQuality[iThisQuality] / ts.ItemsDropped.Total) * 100, 2).ToString("0.00") + " %}"); for (int itemLevel = 1; itemLevel <= 63; itemLevel++) { if (ts.ItemsDropped.TotalPerQPerL[iThisQuality, itemLevel] > 0) { LogWriter.WriteLine("--- ilvl " + itemLevel.ToString() + " " + sQualityString[iThisQuality] + ": " + ts.ItemsDropped.TotalPerQPerL[iThisQuality, itemLevel].ToString() + " [" + Math.Round(ts.ItemsDropped.TotalPerQPerL[iThisQuality, itemLevel] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsDropped.TotalPerQPerL[iThisQuality, itemLevel] / ts.ItemsDropped.Total) * 100, 2).ToString("0.00") + " %}"); } } } // Any at all this quality? } // For loop on quality LogWriter.WriteLine(""); } // End of item stats // Potion stats if (ts.ItemsDropped.TotalPotions > 0) { LogWriter.WriteLine("Potion Drops:"); LogWriter.WriteLine("Total potions: " + ts.ItemsDropped.TotalPotions.ToString() + " [" + Math.Round(ts.ItemsDropped.TotalPotions / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); for (int itemLevel = 1; itemLevel <= 63; itemLevel++) { if (ts.ItemsDropped.PotionsPerLevel[itemLevel] > 0) { LogWriter.WriteLine("- ilvl " + itemLevel.ToString() + ": " + ts.ItemsDropped.PotionsPerLevel[itemLevel].ToString() + " [" + Math.Round(ts.ItemsDropped.PotionsPerLevel[itemLevel] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsDropped.PotionsPerLevel[itemLevel] / ts.ItemsDropped.TotalPotions) * 100, 2).ToString("0.00") + " %}"); } } LogWriter.WriteLine(""); } // End of potion stats // Gem stats if (ts.ItemsDropped.TotalGems > 0) { LogWriter.WriteLine("Gem Drops:"); LogWriter.WriteLine("Total gems: " + ts.ItemsDropped.TotalGems.ToString() + " [" + Math.Round(ts.ItemsDropped.TotalGems / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); for (int iThisGemType = 0; iThisGemType <= 3; iThisGemType++) { if (ts.ItemsDropped.GemsPerType[iThisGemType] > 0) { LogWriter.WriteLine("- " + sGemString[iThisGemType] + ": " + ts.ItemsDropped.GemsPerType[iThisGemType].ToString() + " [" + Math.Round(ts.ItemsDropped.GemsPerType[iThisGemType] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsDropped.GemsPerType[iThisGemType] / ts.ItemsDropped.TotalGems) * 100, 2).ToString("0.00") + " %}"); for (int itemLevel = 1; itemLevel <= 63; itemLevel++) { if (ts.ItemsDropped.GemsPerTPerL[iThisGemType, itemLevel] > 0) { LogWriter.WriteLine("--- ilvl " + itemLevel.ToString() + " " + sGemString[iThisGemType] + ": " + ts.ItemsDropped.GemsPerTPerL[iThisGemType, itemLevel].ToString() + " [" + Math.Round(ts.ItemsDropped.GemsPerTPerL[iThisGemType, itemLevel] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsDropped.GemsPerTPerL[iThisGemType, itemLevel] / ts.ItemsDropped.TotalGems) * 100, 2).ToString("0.00") + " %}"); } } } // Any at all this quality? } // For loop on quality } // End of gem stats // Key stats if (ts.ItemsDropped.TotalInfernalKeys > 0) { LogWriter.WriteLine("Infernal Key Drops:"); LogWriter.WriteLine("Total Keys: " + ts.ItemsDropped.TotalInfernalKeys.ToString() + " [" + Math.Round(ts.ItemsDropped.TotalInfernalKeys / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); } // End of key stats LogWriter.WriteLine(""); LogWriter.WriteLine(""); LogWriter.WriteLine("===== Item PICKUP Statistics ====="); // Item stats if (ts.ItemsPicked.Total > 0) { LogWriter.WriteLine("Items:"); LogWriter.WriteLine("Total items picked up: " + ts.ItemsPicked.Total.ToString() + " [" + Math.Round(ts.ItemsPicked.Total / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); LogWriter.WriteLine("Item picked up by ilvl: "); for (int itemLevel = 1; itemLevel <= 63; itemLevel++) { if (ts.ItemsPicked.TotalPerLevel[itemLevel] > 0) { LogWriter.WriteLine("- ilvl" + itemLevel.ToString() + ": " + ts.ItemsPicked.TotalPerLevel[itemLevel].ToString() + " [" + Math.Round(ts.ItemsPicked.TotalPerLevel[itemLevel] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsPicked.TotalPerLevel[itemLevel] / ts.ItemsPicked.Total) * 100, 2).ToString("0.00") + " %}"); } } LogWriter.WriteLine(""); LogWriter.WriteLine("Items picked up by quality: "); for (int iThisQuality = 0; iThisQuality <= 3; iThisQuality++) { if (ts.ItemsPicked.TotalPerQuality[iThisQuality] > 0) { LogWriter.WriteLine("- " + sQualityString[iThisQuality] + ": " + ts.ItemsPicked.TotalPerQuality[iThisQuality].ToString() + " [" + Math.Round(ts.ItemsPicked.TotalPerQuality[iThisQuality] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsPicked.TotalPerQuality[iThisQuality] / ts.ItemsPicked.Total) * 100, 2).ToString("0.00") + " %}"); for (int itemLevel = 1; itemLevel <= 63; itemLevel++) { if (ts.ItemsPicked.TotalPerQPerL[iThisQuality, itemLevel] > 0) { LogWriter.WriteLine("--- ilvl " + itemLevel.ToString() + " " + sQualityString[iThisQuality] + ": " + ts.ItemsPicked.TotalPerQPerL[iThisQuality, itemLevel].ToString() + " [" + Math.Round(ts.ItemsPicked.TotalPerQPerL[iThisQuality, itemLevel] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsPicked.TotalPerQPerL[iThisQuality, itemLevel] / ts.ItemsPicked.Total) * 100, 2).ToString("0.00") + " %}"); } } } // Any at all this quality? } // For loop on quality LogWriter.WriteLine(""); if (totalFollowerItemsIgnored > 0) { LogWriter.WriteLine(" (note: " + totalFollowerItemsIgnored.ToString() + " follower items ignored for being ilvl <60 or blue)"); } } // End of item stats // Potion stats if (ts.ItemsPicked.TotalPotions > 0) { LogWriter.WriteLine("Potion Pickups:"); LogWriter.WriteLine("Total potions: " + ts.ItemsPicked.TotalPotions.ToString() + " [" + Math.Round(ts.ItemsPicked.TotalPotions / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); for (int itemLevel = 1; itemLevel <= 63; itemLevel++) { if (ts.ItemsPicked.PotionsPerLevel[itemLevel] > 0) { LogWriter.WriteLine("- ilvl " + itemLevel.ToString() + ": " + ts.ItemsPicked.PotionsPerLevel[itemLevel].ToString() + " [" + Math.Round(ts.ItemsPicked.PotionsPerLevel[itemLevel] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsPicked.PotionsPerLevel[itemLevel] / ts.ItemsPicked.TotalPotions) * 100, 2).ToString("0.00") + " %}"); } } LogWriter.WriteLine(""); } // End of potion stats // Gem stats if (ts.ItemsPicked.TotalGems > 0) { LogWriter.WriteLine("Gem Pickups:"); LogWriter.WriteLine("Total gems: " + ts.ItemsPicked.TotalGems.ToString() + " [" + Math.Round(ts.ItemsPicked.TotalGems / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); for (int iThisGemType = 0; iThisGemType <= 3; iThisGemType++) { if (ts.ItemsPicked.GemsPerType[iThisGemType] > 0) { LogWriter.WriteLine("- " + sGemString[iThisGemType] + ": " + ts.ItemsPicked.GemsPerType[iThisGemType].ToString() + " [" + Math.Round(ts.ItemsPicked.GemsPerType[iThisGemType] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsPicked.GemsPerType[iThisGemType] / ts.ItemsPicked.TotalGems) * 100, 2).ToString("0.00") + " %}"); for (int itemLevel = 1; itemLevel <= 63; itemLevel++) { if (ts.ItemsPicked.GemsPerTPerL[iThisGemType, itemLevel] > 0) { LogWriter.WriteLine("--- ilvl " + itemLevel.ToString() + " " + sGemString[iThisGemType] + ": " + ts.ItemsPicked.GemsPerTPerL[iThisGemType, itemLevel].ToString() + " [" + Math.Round(ts.ItemsPicked.GemsPerTPerL[iThisGemType, itemLevel] / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour] {" + Math.Round((ts.ItemsPicked.GemsPerTPerL[iThisGemType, itemLevel] / ts.ItemsPicked.TotalGems) * 100, 2).ToString("0.00") + " %}"); } } } // Any at all this quality? } // For loop on quality } // End of gem stats // Key stats if (ts.ItemsPicked.TotalInfernalKeys > 0) { LogWriter.WriteLine("Infernal Key Pickups:"); LogWriter.WriteLine("Total Keys: " + ts.ItemsPicked.TotalInfernalKeys.ToString() + " [" + Math.Round(ts.ItemsPicked.TotalInfernalKeys / ts.TotalRunningTime.TotalHours, 2).ToString("0.00") + " per hour]"); } // End of key stats LogWriter.WriteLine("===== End Of Report ====="); LogWriter.Flush(); LogStream.Flush(); } }
private void Start() { player = GameObject.Find("Player"); perStats = GameObject.Find("PersistentStats").GetComponent <PersistentStats>(); }