private static List<List<Event>> getPurchaseGroups(Timeline timeline, int participantId) { var purchaseGroups = new List<List<Event>>(); var emptyFrameCount = 0; var currentGroup = new List<Event>(); foreach (var frame in timeline.Frames) { if (emptyFrameCount > NEW_GROUP_FRAME_GAP) { if (currentGroup.Any()) purchaseGroups.Add(currentGroup); currentGroup = new List<Event>(); } var purchasesThisFrame = new List<Event>(); var sellbacksThisFrame = new List<Event>(); if (frame.Events != null) { purchasesThisFrame = frame.Events.Where(x => x.ParticipantId == participantId && x.EventType == EventType.ItemPurchased).ToList(); sellbacksThisFrame = frame.Events.Where(x => x.EventType == EventType.ItemSold || x.EventType == EventType.ItemUndo).ToList(); } foreach (var purchase in purchasesThisFrame) { currentGroup.Add(purchase); } foreach (var sellback in sellbacksThisFrame) { if (currentGroup.Any(x => x.ItemId == sellback.ItemId)) currentGroup.Remove(currentGroup.First(x => x.ItemId == sellback.ItemId)); if (purchasesThisFrame.Any(x => x.ItemId == sellback.ItemId)) purchasesThisFrame.Remove(purchasesThisFrame.First(x => x.ItemId == sellback.ItemId)); } var meaningfulPurchases = purchasesThisFrame.Any(x => getItem(x.ItemId).Gold.TotalPrice > 150); var isFirstPurchase = meaningfulPurchases && !purchaseGroups.Any(); if (isFirstPurchase && emptyFrameCount > 0) { purchaseGroups.Add(currentGroup); currentGroup = new List<Event>(); } emptyFrameCount = (meaningfulPurchases) ? 0 : emptyFrameCount + 1; } if (currentGroup.Any()) purchaseGroups.Add(currentGroup); return purchaseGroups; }
private static PurchaseSet getStartingItems(Timeline timeline, int participantId) { PurchaseSet set = new PurchaseSet() { Name = "Starting Items", RecMath = false }; bool foundAny = false; foreach (var frame in timeline.Frames) { var purchasesThisFrame = new List<Event>(); var sellbacksThisFrame = new List<Event>(); if (frame.Events != null) { purchasesThisFrame = frame.Events.Where(x => x.ParticipantId == participantId && x.EventType == EventType.ItemPurchased).ToList(); sellbacksThisFrame = frame.Events.Where(x => x.ParticipantId == participantId && (x.EventType == EventType.ItemSold || x.EventType == EventType.ItemUndo)).ToList(); } foreach (var purchase in purchasesThisFrame) { set.Items.Add(getItem(purchase.ItemId)); } foreach (var sellback in sellbacksThisFrame) { if (set.Items.Any(x => x.Id == sellback.ItemId)) set.Items.Remove(set.Items.First(x => x.Id == sellback.ItemId)); } if (foundAny) { break; } if (purchasesThisFrame.Any()) { foundAny = true; } } foreach (var item in set.Items) { set.TotalCost += item.Gold.TotalPrice; } set.Name = set.Name + " (" + set.TotalCost + " gold)"; return set; }
private static List<ItemStatic> getAllPurchasedItems(Timeline timeline, int participantId) { List<ItemStatic> items = new List<ItemStatic>(); foreach (var frame in timeline.Frames) { var purchasesThisFrame = new List<Event>(); var sellbacksThisFrame = new List<Event>(); if (frame.Events != null) { purchasesThisFrame = frame.Events.Where(x => x.ParticipantId == participantId && x.EventType == EventType.ItemPurchased).ToList(); sellbacksThisFrame = frame.Events.Where(x => x.ParticipantId == participantId && x.EventType == EventType.ItemUndo).ToList(); } foreach (var purchase in purchasesThisFrame) { items.Add(getItem(purchase.ItemId)); } foreach (var sellback in sellbacksThisFrame) { if (items.Any(x => x.Id == sellback.ItemId)) items.Remove(items.First(x => x.Id == sellback.ItemId)); } } return items; }