private void newSplit() { EndOfRun = false; if (!Commands.ContainsKey("bet")) { Commands.Add("bet", Bet); //Prevents players from betting between a !start and the next split, if !start is made during the run. } try { SegmentBeginning[BetIndex] = State.CurrentTime; Bets[BetIndex] = new Dictionary <string, Tuple <TimeSpan, double> >(); var timeFormatter = new ShortTimeFormatter(); var comparison = State.Run.Comparisons.Contains(Settings.TimeToShow) ? Settings.TimeToShow : Run.PersonalBestComparisonName; var previousTime = lastParent(SplitIndex) >= 0 ? GetTime(State.Run[lastParent(SplitIndex)].Comparisons[comparison]) : TimeSpan.Zero; Time timeToFormat = new Time(new TimeSpan(0, 0, 0), new TimeSpan(0, 0, 0)); timeToFormat += State.Run[nextParent(SplitIndex)].Comparisons[comparison]; var timeFormatted = timeFormatter.Format(GetTime(timeToFormat) - previousTime); string ret = "Place your bets for " + State.Run[nextParent(SplitIndex)].Name + "! "; if (TimeSpanParser.Parse(timeFormatted) > TimeSpan.Zero && comparison != "None") { ret += CompositeComparisons.GetShortComparisonName(comparison) + " segment for this split is " + timeFormatted + " "; } if (Settings.UseGlobalTime) { ret += "And remember that global time is used to bet!"; } SendMessage(ret); } catch (Exception ex) { LogException(ex); } }
public void Update(IInvalidator invalidator, LiveSplitState state, float width, float height, LayoutMode mode) { var comparison = Settings.Comparison == "Current Comparison" ? state.CurrentComparison : Settings.Comparison; if (!state.Run.Comparisons.Contains(comparison)) { comparison = state.CurrentComparison; } var comparisonName = CompositeComparisons.GetShortComparisonName(comparison); var componentName = (Settings.TotalTimeSave ? "Total " : "") + "Possible Time Save" + (Settings.Comparison == "Current Comparison" ? "" : " (" + comparisonName + ")"); if (InternalComponent.InformationName != componentName) { InternalComponent.AlternateNameText.Clear(); if (componentName.Contains("Total")) { InternalComponent.AlternateNameText.Add("Total Possible Time Save"); } InternalComponent.AlternateNameText.Add("Possible Time Save"); InternalComponent.AlternateNameText.Add("Poss. Time Save"); InternalComponent.AlternateNameText.Add("Time Save"); } InternalComponent.LongestString = componentName; InternalComponent.InformationName = componentName; if (Settings.TotalTimeSave) { if (state.CurrentPhase == TimerPhase.Ended) { InternalComponent.TimeValue = TimeSpan.Zero; } else { var totalPossibleTimeSave = state.Run .Skip(state.CurrentSplitIndex) .Select(x => GetPossibleTimeSave(state, x, comparison, true)) .Where(x => x.HasValue) .Aggregate((TimeSpan?)TimeSpan.Zero, (a, b) => a + b); InternalComponent.TimeValue = totalPossibleTimeSave; } } else { if (state.CurrentPhase == TimerPhase.Running || state.CurrentPhase == TimerPhase.Paused) { InternalComponent.TimeValue = GetPossibleTimeSave(state, state.CurrentSplit, comparison); } else { InternalComponent.TimeValue = null; } } InternalComponent.Update(invalidator, state, width, height, mode); }
protected void AddComparison(string userName) { var run = Model.CurrentState.Run; var comparisonName = "[Race] " + userName; if (run.ComparisonGenerators.All(x => x.Name != comparisonName)) { CompositeComparisons.AddShortComparisonName(comparisonName, userName); run.ComparisonGenerators.Add(new SRLComparisonGenerator(comparisonName)); } }
public Segment( string name, Time pbSplitTime = default(Time), Time bestSegmentTime = default(Time), Image icon = null, Time splitTime = default(Time)) { Comparisons = new CompositeComparisons(); Name = name; PersonalBestSplitTime = pbSplitTime; BestSegmentTime = bestSegmentTime; SplitTime = splitTime; Icon = icon; SegmentHistory = new SegmentHistory(); }
public void Update(IInvalidator invalidator, LiveSplitState state, float width, float height, LayoutMode mode) { var comparison = Settings.Comparison == "Current Comparison" ? state.CurrentComparison : Settings.Comparison; if (!state.Run.Comparisons.Contains(comparison)) { comparison = state.CurrentComparison; } var comparisonName = comparison.StartsWith("[Race] ") ? comparison.Substring(7) : comparison; if (InternalComponent.InformationName != comparisonName) { InternalComponent.AlternateNameText.Clear(); InternalComponent.AlternateNameText.Add(CompositeComparisons.GetShortComparisonName(comparison)); } InternalComponent.LongestString = comparisonName; InternalComponent.InformationName = comparisonName; var useLiveDelta = false; if (state.CurrentPhase == TimerPhase.Running || state.CurrentPhase == TimerPhase.Paused) { TimeSpan?delta = LiveSplitStateHelper.GetLastDelta(state, state.CurrentSplitIndex, comparison, state.CurrentTimingMethod); var liveDelta = state.CurrentTime[state.CurrentTimingMethod] - state.CurrentSplit.Comparisons[comparison][state.CurrentTimingMethod]; if (liveDelta > delta || (delta == null && liveDelta > TimeSpan.Zero)) { delta = liveDelta; useLiveDelta = true; } InternalComponent.TimeValue = delta; } else if (state.CurrentPhase == TimerPhase.Ended) { InternalComponent.TimeValue = state.Run.Last().SplitTime[state.CurrentTimingMethod] - state.Run.Last().Comparisons[comparison][state.CurrentTimingMethod]; } else { InternalComponent.TimeValue = null; } var color = LiveSplitStateHelper.GetSplitColor(state, InternalComponent.TimeValue, state.CurrentSplitIndex - (useLiveDelta ? 0 : 1), true, false, comparison, state.CurrentTimingMethod); if (color == null) { color = Settings.OverrideTextColor ? Settings.TextColor : state.LayoutSettings.TextColor; } InternalComponent.ValueLabel.ForeColor = color.Value; InternalComponent.Update(invalidator, state, width, height, mode); }
public Segment(string name, Time pbSplitTime = default(Time), Time bestSegmentTime = default(Time), Image icon = null, Time splitTime = default(Time), int deathCount = -1, int bestDeathCount = -1, int pbDeathCount = -1) { Comparisons = new CompositeComparisons(); Name = name; PersonalBestSplitTime = pbSplitTime; BestSegmentTime = bestSegmentTime; SplitTime = splitTime; DeathCount = deathCount; BestDeathCount = bestDeathCount; PersonalBestDeathCount = pbDeathCount; Icon = null; SegmentHistory = new SegmentHistory(); Parent = null; }
protected string GetDisplayedName(string comparison) { switch (comparison) { case "Current Comparison": return("Current Pace"); case Run.PersonalBestComparisonName: return("Current Pace"); case BestSegmentsComparisonGenerator.ComparisonName: return("Best Possible Time"); case WorstSegmentsComparisonGenerator.ComparisonName: return("Worst Possible Time"); case AverageSegmentsComparisonGenerator.ComparisonName: return("Predicted Time"); default: return("Current Pace (" + CompositeComparisons.GetShortComparisonName(comparison) + ")"); } }
public void Update(IInvalidator invalidator, LiveSplitState state, float width, float height, LayoutMode mode) { var comparison = Settings.Comparison == "Current Comparison" ? state.CurrentComparison : Settings.Comparison; if (!state.Run.Comparisons.Contains(comparison)) { comparison = state.CurrentComparison; } var comparisonName = CompositeComparisons.GetShortComparisonName(comparison); var componentName = "Previous Segment" + (Settings.Comparison == "Current Comparison" ? "" : " (" + comparisonName + ")"); InternalComponent.LongestString = componentName; InternalComponent.InformationName = componentName; DeltaFormatter.Accuracy = Settings.DeltaAccuracy; DeltaFormatter.DropDecimals = Settings.DropDecimals; TimeSaveFormatter.Accuracy = Settings.TimeSaveAccuracy; TimeSpan?timeChange = null; TimeSpan?timeSave = null; var liveSegment = LiveSplitStateHelper.CheckLiveDelta(state, false, comparison, state.CurrentTimingMethod, false); if (state.CurrentPhase != TimerPhase.NotRunning) { if (liveSegment != null) { timeChange = liveSegment; timeSave = GetPossibleTimeSave(state, state.CurrentSplitIndex, comparison); InternalComponent.InformationName = "Live Segment" + (Settings.Comparison == "Current Comparison" ? "" : " (" + comparisonName + ")"); } else if (state.CurrentSplitIndex > 0) { timeChange = LiveSplitStateHelper.GetPreviousSegmentDelta(state, state.CurrentSplitIndex - 1, comparison, state.CurrentTimingMethod); timeSave = GetPossibleTimeSave(state, state.CurrentSplitIndex - 1, comparison); } if (timeChange != null) { if (liveSegment != null) { InternalComponent.ValueLabel.ForeColor = LiveSplitStateHelper.GetSplitColor(state, timeChange, state.CurrentSplitIndex, false, false, comparison, state.CurrentTimingMethod).Value; } else { InternalComponent.ValueLabel.ForeColor = LiveSplitStateHelper.GetSplitColor(state, timeChange.Value, state.CurrentSplitIndex - 1, false, true, comparison, state.CurrentTimingMethod).Value; } } else { var color = LiveSplitStateHelper.GetSplitColor(state, null, state.CurrentSplitIndex - 1, true, true, comparison, state.CurrentTimingMethod); if (color == null) { color = Settings.OverrideTextColor ? Settings.TextColor : state.LayoutSettings.TextColor; } InternalComponent.ValueLabel.ForeColor = color.Value; } } else { InternalComponent.ValueLabel.ForeColor = Settings.OverrideTextColor ? Settings.TextColor : state.LayoutSettings.TextColor; } if (InternalComponent.InformationName != previousNameText) { InternalComponent.AlternateNameText.Clear(); if (liveSegment != null) { InternalComponent.AlternateNameText.Add("Live Segment"); InternalComponent.AlternateNameText.Add("Live Seg."); } else { InternalComponent.AlternateNameText.Add("Previous Segment"); InternalComponent.AlternateNameText.Add("Prev. Segment"); InternalComponent.AlternateNameText.Add("Prev. Seg."); } previousNameText = InternalComponent.InformationName; } InternalComponent.InformationValue = DeltaFormatter.Format(timeChange) + (Settings.ShowPossibleTimeSave ? " / " + TimeSaveFormatter.Format(timeSave) : ""); InternalComponent.Update(invalidator, state, width, height, mode); }
public void Update(IInvalidator invalidator, LiveSplitState state, float width, float height, LayoutMode mode) { var lastSplitOffset = state.CurrentSplitIndex == state.Run.Count ? -1 : 0; var timingMethod = state.CurrentTimingMethod; if (Settings.TimingMethod == "Real Time") { timingMethod = TimingMethod.RealTime; } else if (Settings.TimingMethod == "Game Time") { timingMethod = TimingMethod.GameTime; } var formatter = new SegmentTimesFormatter(Settings.SegmentTimesAccuracy); if (state.CurrentSplitIndex >= 0) { Comparison = Settings.Comparison == "Current Comparison" ? state.CurrentComparison : Settings.Comparison; Comparison2 = Settings.Comparison2 == "Current Comparison" ? state.CurrentComparison : Settings.Comparison2; HideComparison = Settings.HideComparison; if (HideComparison || !state.Run.Comparisons.Contains(Comparison2) || Comparison2 == "None") { HideComparison = true; if (!state.Run.Comparisons.Contains(Comparison) || Comparison == "None") { Comparison = state.CurrentComparison; } } else if (!state.Run.Comparisons.Contains(Comparison) || Comparison == "None") { HideComparison = true; Comparison = Comparison2; } else if (Comparison == Comparison2) { HideComparison = true; } ComparisonName = CompositeComparisons.GetShortComparisonName(Comparison); ComparisonName2 = CompositeComparisons.GetShortComparisonName(Comparison2); TimeSpan?segmentTime = null; if (Comparison == BestSegmentsComparisonGenerator.ComparisonName) { segmentTime = state.Run[state.CurrentSplitIndex + lastSplitOffset].BestSegmentTime[timingMethod]; } else { if (state.CurrentSplitIndex == 0 || (state.CurrentSplitIndex == 1 && lastSplitOffset == -1)) { segmentTime = state.Run[0].Comparisons[Comparison][timingMethod]; } else if (state.CurrentSplitIndex > 0) { segmentTime = state.Run[state.CurrentSplitIndex + lastSplitOffset].Comparisons[Comparison][timingMethod] - state.Run[state.CurrentSplitIndex - 1 + lastSplitOffset].Comparisons[Comparison][timingMethod]; } } LabelSegment.Text = ComparisonName + ":"; LabelBest.Text = ComparisonName2 + ":"; if (Comparison != "None") { if (segmentTime != null) { SegmentTime.Text = formatter.Format(segmentTime); } else { SegmentTime.Text = TimeFormatConstants.DASH; } } if (!HideComparison) { TimeSpan?bestSegmentTime = null; if (Comparison2 == BestSegmentsComparisonGenerator.ComparisonName) { bestSegmentTime = state.Run[state.CurrentSplitIndex + lastSplitOffset].BestSegmentTime[timingMethod]; } else { if (state.CurrentSplitIndex == 0 || (state.CurrentSplitIndex == 1 && lastSplitOffset == -1)) { bestSegmentTime = state.Run[0].Comparisons[Comparison2][timingMethod]; } else if (state.CurrentSplitIndex > 0) { bestSegmentTime = state.Run[state.CurrentSplitIndex + lastSplitOffset].Comparisons[Comparison2][timingMethod] - state.Run[state.CurrentSplitIndex - 1 + lastSplitOffset].Comparisons[Comparison2][timingMethod]; } } if (bestSegmentTime != null) { BestSegmentTime.Text = formatter.Format(bestSegmentTime); } else { BestSegmentTime.Text = TimeFormatConstants.DASH; } } if (state.CurrentSplitIndex >= 0) { SplitName.Text = state.Run[state.CurrentSplitIndex + lastSplitOffset].Name; } else { SplitName.Text = ""; } } SegmentTimer.Settings.TimingMethod = Settings.TimingMethod; InternalComponent.Settings.TimingMethod = Settings.TimingMethod; SegmentTimer.Update(null, state, width, height, mode); InternalComponent.Update(null, state, width, height, mode); var icon = state.CurrentSplitIndex >= 0 ? state.Run[state.CurrentSplitIndex + lastSplitOffset].Icon : null; Cache.Restart(); Cache["SplitIcon"] = icon; if (Cache.HasChanged) { if (icon == null) { FrameCount = 0; } else { FrameCount = icon.GetFrameCount(new FrameDimension(icon.FrameDimensionsList[0])); } } Cache["SplitName"] = SplitName.Text; Cache["LabelSegment"] = LabelSegment.Text; Cache["LabelBest"] = LabelBest.Text; Cache["SegmentTime"] = SegmentTime.Text; Cache["BestSegmentTime"] = BestSegmentTime.Text; Cache["SegmentTimerText"] = SegmentTimer.BigTextLabel.Text + SegmentTimer.SmallTextLabel.Text; Cache["InternalComponentText"] = InternalComponent.BigTextLabel.Text + InternalComponent.SmallTextLabel.Text; if (InternalComponent.BigTextLabel.Brush != null && invalidator != null) { if (InternalComponent.BigTextLabel.Brush is LinearGradientBrush) { Cache["TimerColor"] = ((LinearGradientBrush)InternalComponent.BigTextLabel.Brush).LinearColors.First().ToArgb(); } else { Cache["TimerColor"] = InternalComponent.BigTextLabel.ForeColor.ToArgb(); } } if (invalidator != null && (Cache.HasChanged || FrameCount > 1)) { invalidator.Invalidate(0, 0, width, height); } }