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); }
        }
Example #2
0
        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);
        }
Example #3
0
        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));
            }
        }
Example #4
0
 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();
 }
Example #5
0
        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);
        }
Example #6
0
 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;
 }
Example #7
0
        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);
        }
Example #9
0
        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);
            }
        }