public static List <int> getBoonStacksList(AbstractBoon boon, List <BoonLog> boon_logs, BossData b_data)
        {
            // Initialise variables
            int        t_prev      = 0;
            int        t_curr      = 0;
            List <int> boon_stacks = new List <int>();

            boon_stacks.Add(0);

            // Loop: fill, update, and add to stacks
            foreach (BoonLog log in boon_logs)
            {
                t_curr = log.getTime();
                boon.addStacksBetween(boon_stacks, t_curr - t_prev);
                boon.update(t_curr - t_prev);
                boon.add(log.getValue());
                if (t_curr != t_prev)
                {
                    boon_stacks.Add(boon.getStackValue());
                }
                else
                {
                    boon_stacks[boon_stacks.Count() - 1] = boon.getStackValue();
                }
                t_prev = t_curr;
            }

            // Fill in remaining stacks
            boon.addStacksBetween(boon_stacks, b_data.getLastAware() - b_data.getFirstAware() - t_prev);
            boon.update(1);
            boon_stacks.Add(boon.getStackValue());
            return(boon_stacks);
        }
        public static double[] getBoonUptime(AbstractBoon boon, List <BoonLog> boon_logs, BossData b_data, int players)
        {
            double fight_duration = b_data.getLastAware() - b_data.getFirstAware();
            double boonDur        = 0.00;
            double os             = 0.00;

            if (players <= 0)
            {
                players = 1;
            }
            foreach (BoonLog bl in boon_logs)
            {
                boonDur = boonDur + bl.getValue();
                os      = os + bl.getOverstack();
            }
            double[] doubles = { (boonDur - os) / (fight_duration * players), boonDur / (fight_duration * players) };

            return(doubles);
        }
        public static List <Point> getBoonIntervalsList(AbstractBoon boon, List <BoonLog> boon_logs, BossData b_data)//Needs boonremoval added
        {
            // Initialise variables
            int          t_prev         = 0;
            int          t_curr         = 0;
            List <Point> boon_intervals = new List <Point>();

            // Loop: update then add durations
            foreach (BoonLog log in boon_logs)
            {
                t_curr = log.getTime();
                boon.update(t_curr - t_prev);
                boon.add(log.getValue());
                int duration = t_curr + boon.getStackValue();//this may overload
                if (duration < 0)
                {
                    duration = Int32.MaxValue;
                }

                boon_intervals.Add(new Point(t_curr, duration));
            }

            // Merge intervals
            boon_intervals = Utility.mergeIntervals(boon_intervals);

            // Trim duration overflow
            int fight_duration = b_data.getLastAware() - b_data.getFirstAware();
            int last           = boon_intervals.Count() - 1;

            if (boon_intervals[last].Y > fight_duration)
            {
                Point mod = boon_intervals[last];
                mod.Y = fight_duration;
                boon_intervals[last] = mod;
            }

            return(boon_intervals);
        }