示例#1
0
        public static ResourceTemplate RenderResourceType(ResourceTypeInfo info, string[] exts, Palette p)
        {
            var image = info.EditorSprite;
            using (var s = FileSystem.OpenWithExts(image, exts))
            {
                // TODO: Do this properly
                var shp = new ShpReader(s) as ISpriteSource;
                var frame = shp.Frames.Last();

                var bitmap = new Bitmap(frame.Size.Width, frame.Size.Height, PixelFormat.Format8bppIndexed);
                bitmap.Palette = p.AsSystemPalette();
                var data = bitmap.LockBits(bitmap.Bounds(),
                    ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

                unsafe
                {
                    byte* q = (byte*)data.Scan0.ToPointer();
                    var stride = data.Stride;

                    for (var i = 0; i < frame.Size.Width; i++)
                        for (var j = 0; j < frame.Size.Height; j++)
                            q[j * stride + i] = frame.Data[i + frame.Size.Width * j];
                }

                bitmap.UnlockBits(data);
                return new ResourceTemplate { Bitmap = bitmap, Info = info, Value = shp.Frames.Count() - 1 };
            }
        }
示例#2
0
        public static ResourceTemplate RenderResourceType(ResourceTypeInfo info, string[] exts, Palette p)
        {
            var image = info.SpriteNames[0];
            using (var s = FileSystem.OpenWithExts(image, exts))
            {
                var shp = new ShpReader(s);
                var frame = shp[shp.ImageCount - 1];

                var bitmap = new Bitmap(shp.Width, shp.Height, PixelFormat.Format8bppIndexed);
                bitmap.Palette = MakeSystemPalette(p);
                var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                    ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

                unsafe
                {
                    byte* q = (byte*)data.Scan0.ToPointer();
                    var stride = data.Stride;

                    for (var i = 0; i < shp.Width; i++)
                        for (var j = 0; j < shp.Height; j++)
                            q[j * stride + i] = frame.Image[i + shp.Width * j];
                }

                bitmap.UnlockBits(data);
                return new ResourceTemplate { Bitmap = bitmap, Info = info, Value = shp.ImageCount - 1 };
            }
        }
示例#3
0
        public static ResourceTemplate RenderResourceType(ResourceTypeInfo info, TileSet tileset, IPalette p)
        {
            var image = ResolveFilename(info.EditorSprite, tileset);
            using (var s = GlobalFileSystem.Open(image))
            {
                // TODO: Do this properly
                var shp = new ShpTDSprite(s);
                var frame = shp.Frames.Last();

                var bitmap = new Bitmap(frame.Size.Width, frame.Size.Height, PixelFormat.Format8bppIndexed);
                bitmap.Palette = p.AsSystemPalette();
                var data = bitmap.LockBits(bitmap.Bounds(),
                    ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

                unsafe
                {
                    var q = (byte*)data.Scan0.ToPointer();
                    var stride = data.Stride;

                    for (var i = 0; i < frame.Size.Width; i++)
                        for (var j = 0; j < frame.Size.Height; j++)
                            q[j * stride + i] = frame.Data[i + frame.Size.Width * j];
                }

                bitmap.UnlockBits(data);
                return new ResourceTemplate { Bitmap = bitmap, Info = info, Value = shp.Frames.Count - 1 };
            }
        }
示例#4
0
 public int GetAdjacentCellsWith(ResourceTypeInfo info, int i, int j)
 {
     int sum = 0;
     for (var u = -1; u < 2; u++)
         for (var v = -1; v < 2; v++)
             if (content[i+u, j+v].type == info)
                 ++sum;
     return sum;
 }
示例#5
0
 public ResourceType(ResourceTypeInfo info, World world)
 {
     this.Info = info;
     Variants = new Dictionary<string, Sprite[]>();
     foreach (var v in info.Variants)
     {
         var seq = world.Map.SequenceProvider.GetSequence(Info.Sequence, v);
         var sprites = Exts.MakeArray(seq.Length, x => seq.GetSprite(x));
         Variants.Add(v, sprites);
     }
 }
示例#6
0
 public ResourceType(ResourceTypeInfo info, World world)
 {
     this.Info = info;
     Variants  = new Dictionary <string, Sprite[]>();
     foreach (var v in info.Variants)
     {
         var seq     = world.Map.SequenceProvider.GetSequence("resources", v);
         var sprites = Exts.MakeArray(seq.Length, x => seq.GetSprite(x));
         Variants.Add(v, sprites);
     }
 }
示例#7
0
 public ResourceType(ResourceTypeInfo info, World world)
 {
     Info     = info;
     Variants = new Dictionary <string, Sprite[]>();
     foreach (var v in info.Sequences)
     {
         var seq     = world.Map.Rules.Sequences.GetSequence(Info.Image, v);
         var sprites = Exts.MakeArray(seq.Length, x => seq.GetSprite(x));
         Variants.Add(v, sprites);
     }
 }
示例#8
0
        public void AddResource(ResourceTypeInfo info, int i, int j, int n)
        {
            if (content[i, j].type == null)
            {
                content[i, j].type = info;
                content[i, j].image = ChooseContent(info);
                content[i, j].density = -1;
            }

            if (content[i, j].type != info)
                return;

            content[i, j].density = Math.Min(
                content[i, j].image.Length - 1,
                content[i, j].density + n);
        }
示例#9
0
        public EditorResourceBrush(EditorViewportControllerWidget editorWidget, ResourceTypeInfo resource, WorldRenderer wr)
        {
            this.editorWidget = editorWidget;
            ResourceType = resource;
            worldRenderer = wr;
            world = wr.World;

            preview = editorWidget.Get<SpriteWidget>("DRAG_LAYER_PREVIEW");
            preview.Palette = resource.Palette;
            preview.GetScale = () => worldRenderer.Viewport.Zoom;
            preview.IsVisible = () => editorWidget.CurrentBrush == this;

            var variant = resource.Sequences.FirstOrDefault();
            var sequence = wr.World.Map.Rules.Sequences.GetSequence("resources", variant);
            var sprite = sequence.GetSprite(resource.MaxDensity - 1);
            preview.GetSprite = () => sprite;

            // The preview widget may be rendered by the higher-level code before it is ticked.
            // Force a manual tick to ensure the bounds are set correctly for this first draw.
            Tick();
        }
示例#10
0
 public ResourceType(ResourceTypeInfo info)
 {
     this.info = info;
 }
示例#11
0
 public void AcceptResource(ResourceTypeInfo type)
 {
     if (!contents.ContainsKey(type)) contents[type] = 1;
     else contents[type]++;
 }
示例#12
0
 public ResourceType(ResourceTypeInfo info)
 {
     this.info = info;
 }
示例#13
0
 public Sprite[] ChooseContent(ResourceTypeInfo info)
 {
     return info.Sprites[w.SharedRandom.Next(info.Sprites.Length)];
 }
示例#14
0
        public void Spread(ResourceTypeInfo info)
        {
            var map = w.Map;

            var mini = map.XOffset; var maxi = map.XOffset + map.Width;
            var minj = map.YOffset; var maxj = map.YOffset + map.Height;

            var growMask = new bool[map.MapSize, map.MapSize];
            for (int j = minj; j < maxj; j++)
                for (int i = mini; i < maxi; i++)
                    if (content[i,j].type == null
                        && GetAdjacentCellsWith(info, i,j ) > 0
                        && w.IsCellBuildable(new int2(i, j), false))
                        growMask[i, j] = true;

            for (int j = minj; j < maxj; j++)
                for (int i = mini; i < maxi; i++)
                    if (growMask[i, j])
                    {
                        content[i, j].type = info;
                        content[i, j].image = ChooseContent(info);
                        content[i, j].density = 0;
                    }
        }
示例#15
0
        public void Grow(ResourceTypeInfo info)
        {
            var map = w.Map;
            var mini = map.XOffset; var maxi = map.XOffset + map.Width;
            var minj = map.YOffset; var maxj = map.YOffset + map.Height;

            var newDensity = new byte[map.MapSize, map.MapSize];
            for (int j = minj; j < maxj; j++)
                for (int i = mini; i < maxi; i++)
                    if (content[i, j].type == info)
                        newDensity[i, j] = (byte)GetIdealDensity(i, j);

            for (int j = minj; j < maxj; j++)
                for (int i = mini; i < maxi; i++)
                    if (content[i, j].type == info && content[i, j].density < newDensity[i, j])
                        ++content[i, j].density;
        }