private Color GetCellColor(RiverRegionFlags flags)
        {
            // compresses/condenses the bitfield to only consist of useable bits (all unobserved positions removed)

            int index = 0;

            if (CheckRiverRegionFlag(flags, RiverRegionFlags.JungleQuadrant) == true)
            {
                index |= 1;
            }

            if (CheckRiverRegionFlag(flags, RiverRegionFlags.BaronPit) == true)
            {
                index |= 2;
            }

            if (CheckRiverRegionFlag(flags, RiverRegionFlags.River) == true)
            {
                index |= 4;
            }

            if (CheckRiverRegionFlag(flags, RiverRegionFlags.RiverEntrance) == true)
            {
                index |= 8;
            }

            if (CheckRiverRegionFlag(flags, RiverRegionFlags.Unknown32) == true)
            {
                // this is at risk of running out of colors, but we clamp the color index to be in bounds later
                // in practice, this is the only case where you can actually run out of colors
                index |= 16;
            }


            return(GetCellColor(index));
        }
 private bool CheckRiverRegionFlag(RiverRegionFlags flags, RiverRegionFlags mask)
 {
     return((flags | mask) == flags);
 }
        private void CheckForMissingFlags()
        {
            VisionPathingFlags mergedVisionPathingFlags = (VisionPathingFlags)0;
            RiverRegionFlags   mergedRiverRegionFlags   = (RiverRegionFlags)0;

            List <JungleQuadrantFlags> newJungleQuadrantFlags = new List <JungleQuadrantFlags>();
            List <MainRegionFlags>     newMainRegionFlags     = new List <MainRegionFlags>();
            List <NearestLaneFlags>    newNearestLaneFlags    = new List <NearestLaneFlags>();
            List <POIFlags>            newPOIFlags            = new List <POIFlags>();
            List <RingFlags>           newRingFlags           = new List <RingFlags>();
            List <UnknownSRXFlags>     newSRXFlags            = new List <UnknownSRXFlags>();


            for (int i = 0; i < cells.Count; i++)
            {
                NavGridCell cell = cells[i];


                mergedVisionPathingFlags |= cell.visionPathingFlags;
                mergedRiverRegionFlags   |= cell.riverRegionFlags;


                // these values are always read as a single byte, so no need to worry about signed comparisons

                if (cell.jungleQuadrantFlags > JungleQuadrantFlags.LastKnownFlag && newJungleQuadrantFlags.Contains(cell.jungleQuadrantFlags) == false)
                {
                    newJungleQuadrantFlags.Add(cell.jungleQuadrantFlags);
                }

                if (cell.mainRegionFlags > MainRegionFlags.LastKnownFlag && newMainRegionFlags.Contains(cell.mainRegionFlags) == false)
                {
                    newMainRegionFlags.Add(cell.mainRegionFlags);
                }

                if (cell.nearestLaneFlags > NearestLaneFlags.LastKnownFlag && newNearestLaneFlags.Contains(cell.nearestLaneFlags) == false)
                {
                    newNearestLaneFlags.Add(cell.nearestLaneFlags);
                }

                if (cell.poiFlags > POIFlags.LastKnownFlag && newPOIFlags.Contains(cell.poiFlags) == false)
                {
                    newPOIFlags.Add(cell.poiFlags);
                }

                if (cell.ringFlags > RingFlags.LastKnownFlag && newRingFlags.Contains(cell.ringFlags) == false)
                {
                    newRingFlags.Add(cell.ringFlags);
                }

                if (cell.srxFlags > UnknownSRXFlags.LastKnownFlag && newSRXFlags.Contains(cell.srxFlags) == false)
                {
                    newSRXFlags.Add(cell.srxFlags);
                }
            }


            newJungleQuadrantFlags.Sort();
            newMainRegionFlags.Sort();
            newNearestLaneFlags.Sort();
            newPOIFlags.Sort();
            newRingFlags.Sort();
            newSRXFlags.Sort();


            bool foundNewFlags = false;

            int newVisionPathingFlags = (int)(mergedVisionPathingFlags & ~VisionPathingFlags.KnownFlags);

            if (newVisionPathingFlags != 0)
            {
                foundNewFlags = true;
                Console.WriteLine("\nfound new VisionPathingFlags:");

                for (int i = 0; i < 16; i++)
                {
                    int newFlag = newVisionPathingFlags & (1 << i);
                    if (newFlag != 0)
                    {
                        Console.WriteLine(" - " + newFlag);
                    }
                }
            }

            int newRiverRegionFlags = (int)(mergedRiverRegionFlags & ~RiverRegionFlags.KnownFlags);

            if (newRiverRegionFlags != 0)
            {
                foundNewFlags = true;
                Console.WriteLine("\nfound new RiverRegionFlags:");

                for (int i = 0; i < 16; i++)
                {
                    int newFlag = newRiverRegionFlags & (1 << i);
                    if (newFlag != 0)
                    {
                        Console.WriteLine(" - " + newFlag);
                    }
                }
            }


            if (newJungleQuadrantFlags.Count > 0)
            {
                foundNewFlags = true;
                Console.WriteLine("\nfound new JungleQuadrantFlags:");

                for (int i = 0; i < newJungleQuadrantFlags.Count; i++)
                {
                    Console.WriteLine(" - " + (int)newJungleQuadrantFlags[i]);
                }
            }

            if (newMainRegionFlags.Count > 0)
            {
                foundNewFlags = true;
                Console.WriteLine("\nfound new MainRegionFlags:");

                for (int i = 0; i < newMainRegionFlags.Count; i++)
                {
                    Console.WriteLine(" - " + (int)newMainRegionFlags[i]);
                }
            }

            if (newNearestLaneFlags.Count > 0)
            {
                foundNewFlags = true;
                Console.WriteLine("\nfound new NearestLaneFlags:");

                for (int i = 0; i < newNearestLaneFlags.Count; i++)
                {
                    Console.WriteLine(" - " + (int)newNearestLaneFlags[i]);
                }
            }

            if (newPOIFlags.Count > 0)
            {
                foundNewFlags = true;
                Console.WriteLine("\nfound new POIFlags:");

                for (int i = 0; i < newPOIFlags.Count; i++)
                {
                    Console.WriteLine(" - " + (int)newPOIFlags[i]);
                }
            }

            if (newRingFlags.Count > 0)
            {
                foundNewFlags = true;
                Console.WriteLine("\nfound new RingFlags:");

                for (int i = 0; i < newRingFlags.Count; i++)
                {
                    Console.WriteLine(" - " + (int)newRingFlags[i]);
                }
            }

            if (newSRXFlags.Count > 0)
            {
                foundNewFlags = true;
                Console.WriteLine("\nfound new SRXFlags:");

                for (int i = 0; i < newSRXFlags.Count; i++)
                {
                    Console.WriteLine(" - " + (int)newSRXFlags[i]);
                }
            }


            if (foundNewFlags == true)
            {
                Console.WriteLine("\nreport any new flags found (except for on the very first Nexus Blitz layout)");
                Program.Pause();
            }
            else
            {
                Console.WriteLine("\nno unexpected flags found");
            }
        }