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 }; } }
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 }; } }
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 }; } }
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; }
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); } }
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); } }
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); } }
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); }
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(); }
public ResourceType(ResourceTypeInfo info) { this.info = info; }
public void AcceptResource(ResourceTypeInfo type) { if (!contents.ContainsKey(type)) contents[type] = 1; else contents[type]++; }
public Sprite[] ChooseContent(ResourceTypeInfo info) { return info.Sprites[w.SharedRandom.Next(info.Sprites.Length)]; }
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; } }
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; }