public AreaColorCoordinates(Coordinates coordinates, AreaColor[] map)
        {
            List = new AreaColor[9];

            List[(int) Directions.Center] = map[coordinates.Center];
            _center = List[(int) Directions.Center];

            List[(int) Directions.East] = map[coordinates.East];
            _east = List[(int) Directions.East];

            List[(int) Directions.North] = map[coordinates.North];
            _north = List[(int) Directions.North];

            List[(int) Directions.NorthEast] = map[coordinates.NorthEast];
            _northEast = List[(int) Directions.NorthEast];

            List[(int) Directions.NorthWest] = map[coordinates.NorthWest];
            _northWest = List[(int) Directions.NorthWest];

            List[(int) Directions.South] = map[coordinates.South];
            _south = List[(int) Directions.South];

            List[(int) Directions.SouthEast] = map[coordinates.SouthEast];
            _southEast = List[(int) Directions.SouthEast];

            List[(int) Directions.SouthWest] = map[coordinates.SouthWest];
            _southWest = List[(int) Directions.SouthWest];

            List[(int) Directions.West] = map[coordinates.West];
            _west = List[(int) Directions.West];


        }
        public override void Read()
        {
            int counter = 0;
            var mountains = new AreaColor();
            foreach (string s in Strings)
            {
                if(s.StartsWith("//"))
                {
                    mountains.Name = s.Replace("//","");
                    continue;
                }
                if (string.IsNullOrEmpty(s))
                {
                    if(mountains.Color != System.Windows.Media.Colors.Black)
                        Mountains.List.Add(mountains);
                    mountains = new AreaColor();
                    continue;
                }
                char[] chars = {','};
                var str = s.Split(chars,StringSplitOptions.RemoveEmptyEntries);
                if(str.Length == 1)
                {
                    if (mountains.Color == System.Windows.Media.Colors.Black)
                        mountains.Color = ReadColorFromInt(s);
                    else
                    {
                        mountains.ColorTopMountain = ReadColorFromInt(s);
                    }
                    continue;
                }

                if(str.Length == 2)
                {
                    if(mountains.TextureIndex == 0)
                    {
                        mountains.TextureIndex = int.Parse(str[0]);
                        mountains.ModeAutomatic = int.Parse(str[1]) == 1;
                        continue;
                    }
                    if(s.StartsWith("0x"))
                    {
                        mountains.ColorTopMountain = ReadColorFromInt(str[0]);
                        mountains.IndexTextureTop = int.Parse(str[1]);
                        continue;
                    }
                    var circle = new CircleMountain {From = int.Parse(str[0]), To = int.Parse(str[1])};
                    if(mountains.List == null) mountains.List=new ObservableCollection<CircleMountain>();
                    mountains.List.Add(circle);
                    continue;
                }
                
            }
            //Mountains.List.Add(mountains);
        }
 public override void Read()
 {
     foreach (string s in Strings)
     {
         if (s.StartsWith("//") || string.IsNullOrEmpty(s)) continue;
         var strings = s.Split('/');
         var read = strings[0].Split(separator, StringSplitOptions.RemoveEmptyEntries);
         var area = new AreaColor();
         area.Color = ReadColorFromInt(read[0]);
         area.Name = strings.Last();
         area.TextureIndex = int.Parse(read[1]);
         area.Min = int.Parse(read[2]);
         area.Max = int.Parse(read[3]);
         area.Index = Areas.List.Count;
         Areas.List.Add(area);
     }
 }
示例#4
0
        private static void SmoothWorker(AreaColor area,AreaColor center, MapObject mapObject, Random random, int index)
        {
            if (area.Type == TypeColor.WaterCoast || area.Type == TypeColor.Water || mapObject.Occupied != 0) return;

            var k = (sbyte)random.Next(center.CoastSmoothCircles[index].From, center.CoastSmoothCircles[index].To);
            if(mapObject.Altitude > k)
                mapObject.Altitude = k;
        }
示例#5
0
        private static void NorthEastSmooth
            (Coordinates coordinates,
            int xmax,
            int ymax,
            int stride,
            AreaColor[] bitmap,
            MapObject[] mapobjects,
            Random random)
        {
            for (int i = 0; i < bitmap[coordinates.Center].CoastSmoothCircles.Count; i++)
            {
                var coordnew = new Coordinates(i + 1, i + 1, coordinates.X, coordinates.Y, stride, xmax * ymax);
                var areacoloronew = new AreaColorCoordinates(coordnew, bitmap);
                var mapobjectCoordnew = new MapObjectCoordinates(coordnew, mapobjects);


                SmoothWorker(areacoloronew.East, areacoloronew.Center, mapobjectCoordnew.East, random, i);
                SmoothWorker(areacoloronew.North, areacoloronew.Center, mapobjectCoordnew.North, random, i);
                SmoothWorker(areacoloronew.NorthEast, areacoloronew.Center, mapobjectCoordnew.NorthEast, random, i);
            }
        }
示例#6
0
        ///// <summary>
        ///// Class costructor
        ///// </summary>
        ///// <param name="map">map cached previusly</param>
        ///// <param name="alt">map altitude cached</param>
        ///// <param name="x">max x of the map</param>
        ///// <param name="y">max y of the map</param>
        ///// <param name="index">index of the map</param>
        //public MapMaker(Color[] map, Color[] alt, int x, int y, int index)
        //{

        //    _bitmap = map;
        //    var x1 = x + 10;
        //    var y1 = y + 10;
        //    var lenght = x1 * y1;
        //    #region InitArrays

        //    _mapObjects = new MapObject[lenght];
        //    _bitmapZ = new sbyte[lenght];
        //    for (int i = 0; i < alt.Length; i++)
        //    {
        //        _bitmapZ[i] = CalculateHeightValue(alt[i]);

        //    }

        //    for (int i = 0; i < _mapObjects.Length; i++)
        //    {
        //        _mapObjects[i] = new MapObject();
        //    }
        //    #endregion

        //    _X = x;
        //    _Y = y;

        //    MulDirectory = "";
        //    mapIndex = index;
        //    _stride = _X;
        //    Random = new Random(DateTime.Now.Millisecond);

        //    AutomaticZMode = true;
        //}


        public MapMaker(sbyte[] altitude, AreaColor[] colors, int x, int y, int index)
        {
            var x1 = x + 10;
            var y1 = y + 10;
            var lenght = x1*y1;


            #region Init Arrays

            _mapObjects = new MapObject[lenght];
            _bitmapZ = new sbyte[lenght];
            _bitmapAreaColor = new AreaColor[lenght];


            for (int i = 0; i < altitude.Length; i++)
            {
                _bitmapZ[i] = altitude[i];
                _bitmapAreaColor[i] = colors[i];
            }

            for (int i = 0; i < lenght; i++)
            {
                _mapObjects[i] = new MapObject();
            }

            #endregion //init arrays


            _X = x;
            _Y = y;
            MulDirectory = "";
            mapIndex = index;
            _stride = _X;
        }
示例#7
0
 private static bool PlaceDoubleBorder
     (
     AreaColorCoordinates areaColorCoordinates,
     MapObjectCoordinates mapObjectCoordinates,
     Coordinates coordinates,
     TypeColor type,
     sbyte zItem,
     sbyte altitude,
     int itemid,
     AreaColor border,
     AreaColor border2,
     int texture = -1,
     bool ground = false,
     bool occupied = true,
     int hue = 0
     )
 {
     return areaColorCoordinates.List.Count(o => o.Type == type && o != border && o != border2) == 7 && mapObjectCoordinates.PlaceObjectOcc(areaColorCoordinates, altitude, itemid, zItem, texture, ground,occupied,hue);
 }
示例#8
0
        ///// <summary>
        ///// Just cache the bmp in ram
        ///// </summary>
        ///// <param name="location"></param>
        ///// <param name="altitude"> </param>
        //private void Cache(string location, bool altitude)
        //{
        //    using (var bitmap = new Bitmap(location))
        //    {
               
        //            BitmapColors = new Color[bitmap.Width*bitmap.Height];
        //            BitmapColors.Initialize();
                
        //             Lock the bitmap's bits.  
        //            var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
                    
        //            lock the bitmap bits
        //            BitmapData bmpData;
                    
        //            bmpData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

        //             Get the address of the first line.
        //            var ptr = bmpData.Scan0;

        //             Declare an array to hold the bytes of the bitmap.
        //            var bytes = bmpData.Stride*bitmap.Height;
        //            var rgbValues = new byte[bytes];


        //             Copy the RGB values into the array.
        //            Marshal.Copy(ptr, rgbValues, 0, bytes);

        //            var stride = bmpData.Stride;
                    
        //            for (var coulmn = bmpData.Height - 1; coulmn >= 0; coulmn--)
        //            {
        //                for (var row = 0; row < bmpData.Width; row++)
        //                {
        //                    BitmapColors[(coulmn * (bmpData.Width)) + row] = Color.FromRgb((rgbValues[(coulmn * stride) + (row * 3) + 2]),
        //                                                               rgbValues[(coulmn*stride) + (row*3) + 1],
        //                                                               rgbValues[(coulmn*stride) + (row*3)]);
        //                }
        //            }
        //    }
        //}


        /// <summary>
        /// 
        /// </summary>
        /// <param name="collectionAreaColor"></param>
        /// <param name="location"></param>
        /// <exception>
        ///   <cref>ExecutionEngineException</cref>
        /// </exception>
        /// <returns></returns>
        public static AreaColor[] ProduceMap(CollectionAreaColor collectionAreaColor, string location)
        {
            AreaColor[] areaColors = null;
            using (var bitmap = new Bitmap(location))
            {

                areaColors = new AreaColor[bitmap.Width * bitmap.Height];
                
                // Lock the bitmap's bits.  
                var rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

                //lock the bitmap bits
                BitmapData bmpData;

                bmpData = bitmap.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

                // Get the address of the first line.
                var ptr = bmpData.Scan0;

                // Declare an array to hold the bytes of the bitmap.
                var bytes = bmpData.Stride * bitmap.Height;
                var rgbValues = new byte[bytes];

                var list = new List<String>();
                // Copy the RGB values into the array.
                Marshal.Copy(ptr, rgbValues, 0, bytes);

                var stride = bmpData.Stride;

                for (var coulmn = bmpData.Height - 1; coulmn >= 0; coulmn--)
                {
                    for (var row = 0; row < bmpData.Width; row++)
                    {
                        areaColors[(coulmn*(bmpData.Width)) + row] =
                            collectionAreaColor.FindByByteArray(new[]
                                                                    {
                                                                        rgbValues[(coulmn*stride) + (row*3) + 2],
                                                                        rgbValues[(coulmn*stride) + (row*3) + 1],
                                                                        rgbValues[(coulmn*stride) + (row*3)]
                                                                    });

                        if (areaColors[(coulmn*(bmpData.Width)) + row] != null) continue;

                        var str = "Color =" + 
                            System.Windows.Media.Color.FromRgb(
                                rgbValues[(coulmn * stride) + (row * 3) + 2],
                                rgbValues[(coulmn * stride) + (row * 3) + 1],
                                rgbValues[(coulmn * stride) + (row * 3)]) 
                            + " not found.";
                            
                        if(!list.Contains(str))
                        {
                            list.Add(str);
                        }
                    }
                }

                if(list.Count>0)
                {
                    var message = list.Aggregate("", (current, str) => current + (str + '\n'));
                    throw new Exception(message);
                }
            }

            return areaColors;
        }
示例#9
0
        public static AreaColor[] ColorsFromBitmap(CollectionAreaColor collectionAreaColor, string originalLocation, int XMax, int YMax)
        {
            var original = new Bitmap(originalLocation);
            if(original.Height != YMax || original.Width != XMax )
                throw new Exception("Terrain Bitmap has wrong dimentions");
            var areaColors = new AreaColor[original.Height * original.Width];
            var list = new List<string>();
            using (original)
            {
                unsafe
                {


                    //lock the original bitmap in memory
                    BitmapData originalData = original.LockBits(
                        new Rectangle(0, 0, original.Width, original.Height),
                        ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);


                    //set the number of bytes per pixel
                    const int pixelSize = 3;


                    for (int y = originalData.Height - 1; y >= 0; y--)
                    {
                        //get the data from the original image
                        byte* oRow = (byte*)originalData.Scan0 + (y * originalData.Stride);

                        for (int x = 0; x < originalData.Width; x++)
                        {
                            var red = oRow[x * pixelSize + 2];
                            var green = oRow[x * pixelSize + 1];
                            var blue = oRow[x * pixelSize];

                            var area =
                            collectionAreaColor.FindByByteArray(new[]
                                                                    {
                                                                        red,
                                                                        green,
                                                                        blue
                                                                    });
                            areaColors[(y*(originalData.Width)) + x] = area;
                            if (area != null) continue;


                            var str = "Color =" +
                                System.Windows.Media.Color.FromRgb(
                                    red,
                                    green,
                                    blue)
                                + " not found.";

                            if (!list.Contains(str))
                            {
                                list.Add(str);
                            }
                        }
                    }

                    original.UnlockBits(originalData);

                }
                if (list.Count > 0)
                {
                    var message = list.Aggregate("", (current, str) => current + (str + '\n'));
                    throw new Exception(message);
                }
                return areaColors;

            }
        }
示例#10
0
 public void AddAreaColor(AreaColor add)
 {
     add.PropertyChanged += EventUpdateList;
     CollectionColorArea.List.Add(add);
 }
示例#11
0
        private void MergingData()
        {
            #region AreaColors

            if (CollectionColorArea == null) return;

            CollectionColorArea.List.CollectionChanged += EventUpdateList;

            foreach (var area in CollectionColorArea.List)
            {
                area.Type = TypeColor.Land;
                area.PropertyChanged += EventUpdateList;
            }

            CollectionColorArea.InitializeSeaches();

            if (CollectionColorMountains != null)
                foreach (var mnt in CollectionColorMountains.List)
                {
                    mnt.Type = TypeColor.Moutains;
                    var area = CollectionColorArea.FindByColor(mnt.Color);
                    if (area == null)
                    {
                        mnt.Index = CollectionColorArea.List.Count;
                        CollectionColorArea.List.Add(mnt);
                    }
                    else
                    {
                        int index = area.Index;
                        CollectionColorArea.List.Remove(area);
                        mnt.Name = area.Name;
                        mnt.Index = index;
                        CollectionColorArea.List.Insert(index, mnt);
                        CollectionColorArea.InitializeSeaches();
                    }
                }


            CollectionColorArea.InitializeSeaches();
            if (CollectionColorCoast != null)
                foreach (var coast in CollectionColorCoast.List)
                {
                    var area = CollectionColorArea.FindByColor(coast.Color);
                    if (area != null)
                    {
                        area.Type = TypeColor.Water;
                        area.Min = coast.Min;
                        area.Max = coast.Max;
                    }
                    else
                    {
                        coast.Index = CollectionColorArea.List.Count;
                        CollectionColorArea.List.Add(coast);
                        coast.Type = TypeColor.Water;
                        CollectionColorArea.InitializeSeaches();
                    }
                }

            #endregion //Colors

            #region Textures
            if (CollectionAreaTransitionTexture != null)
                foreach (var transition in CollectionAreaTransitionTexture.List)
                {
                    var area = CollectionColorArea.FindByColor(transition.ColorFrom);
                    if (area == null)
                        continue;

                    area.TextureTransitions.Add(transition);
                    var area2 = CollectionColorArea.FindByColor(transition.ColorTo);
                    if (area2 == null) continue;

                    transition.IndexTo = area2.Index;
                }
            if (CollectionAreaTransitionCliffTexture != null)
            {
                var colorclif = new AreaColor { Color = CollectionAreaTransitionCliffTexture.Color, Type = TypeColor.Cliff, Name = "Cliff", Index = CollectionColorArea.List.Count };
                CollectionColorArea.List.Add(colorclif);

                CollectionColorArea.InitializeSeaches();

                foreach (var cliff in CollectionAreaTransitionCliffTexture.List)
                {
                    var area = CollectionColorArea.FindByColor(cliff.ColorFrom);
                    if (area == null) continue;

                    area.TransitionCliffTextures.Add(cliff);

                    var areato = CollectionColorArea.FindByColor(cliff.ColorTo);
                    if (areato == null) continue;
                    cliff.IdTo = areato.Index;
                }

            }

            CollectionAreaTexture.InitializeSeaches();

            #endregion //Textures

            #region Items
            if (CollectionAreaItems != null)
                foreach (var items in CollectionAreaItems.List)
                {
                    var area = CollectionColorArea.FindByColor(items.Color);
                    if (area == null)
                        continue;

                    area.Items = items;
                }
            if (CollectionAreaItemsCoasts != null)
                foreach (var coast in CollectionAreaItemsCoasts.List)
                {
                    var area = CollectionColorArea.FindByColor(coast.Ground.Color);

                    if (area == null)
                        continue;

                    area.Coasts = coast;
                }
            if (CollectionAreaTransitionItems != null)
                foreach (var itemtransition in CollectionAreaTransitionItems.List)
                {
                    var area = CollectionColorArea.FindByColor(itemtransition.ColorFrom);

                    if (area == null) continue;

                    area.TransitionItems.Add(itemtransition);
                }

            #endregion


            if (CollectionAreaTexture != null)
                CollectionAreaTexture.InitializeSeaches();
            if (CollectionColorArea != null)
                CollectionColorArea.InitializeSeaches();

            EventUpdateList(this, null);

            if (CollectionAreaTexture != null && CollectionAreaTexture.List.First().AreaTransitionTexture.List.Count == 0)
                foreach (var area in CollectionColorArea.List)
                {
                    foreach (var transition in area.TextureTransitions)
                    {
                        var texture = CollectionAreaTexture.FindByIndex(area.TextureIndex);
                        var chiappa = CollectionColorArea.FindByColor(transition.ColorTo);
                        if (chiappa != null)
                            transition.TextureIdTo = chiappa.TextureIndex;

                        if (!texture.AreaTransitionTexture.List.Contains(transition))
                            texture.AreaTransitionTexture.List.Add(transition);

                    }
                }
        }