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); } }
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; }
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); } }
///// <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; }
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); }
///// <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; }
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; } }
public void AddAreaColor(AreaColor add) { add.PropertyChanged += EventUpdateList; CollectionColorArea.List.Add(add); }
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); } } }