public bool CollidesWith(BaseScheduleItem other) { var paddedStartTime = StartTime; var paddedEndTime = EndTime; if (this.GetType() != other.GetType()) { paddedStartTime = StartTime.Subtract(TimeSpan.FromMinutes(10)); paddedEndTime = EndTime.Add(TimeSpan.FromMinutes(10)); } // AAAA // BBBB // AAAAAAA // BBBB // AAAAAAAAAAAAA // BBBB // AA // BBBB // Easier to determine if it does NOT collide bool doesNotCollide = paddedEndTime <= other.StartTime || paddedStartTime >= other.EndTime; return(!doesNotCollide); }
void OnStep(int stepNumber) { while (schedule.Count > 0 && stepNumber >= schedule.First.ScheduledStep) { BaseScheduleItem item = schedule.Dequeue(); itemDict.Remove(item.ID); item.Activate(); } }
private static void AccomodateTouchingItemsIfNeeded(BaseScheduleItem first, BaseScheduleItem second) { const int collisionPadding = 8; if (first.StartTime == second.EndTime) { second.EndTime = second.EndTime.Subtract(TimeSpan.FromMinutes(collisionPadding / 2)); first.StartTime = first.StartTime.Add(TimeSpan.FromMinutes(collisionPadding / 2)); } else if (first.EndTime == second.StartTime) { first.EndTime = first.EndTime.Subtract(TimeSpan.FromMinutes(collisionPadding / 2)); second.StartTime = second.StartTime.Add(TimeSpan.FromMinutes(collisionPadding / 2)); } }