public static ResourceTemplate RenderResourceType(ResourceTypeInfo info, string[] exts, IPalette p) { var image = info.EditorSprite; using (var s = GlobalFileSystem.OpenWithExts(image, exts)) { // 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 static ActorTemplate RenderActor(ActorInfo info, TileSet tileset, IPalette p) { var image = info.Traits.Get <ILegacyEditorRenderInfo>().EditorImage(info); using (var s = GlobalFileSystem.OpenWithExts(image, tileset.Extensions)) { var shp = new ShpTDSprite(s); var bitmap = RenderShp(shp, p); try { using (var s2 = GlobalFileSystem.OpenWithExts(image + "2", tileset.Extensions)) { var shp2 = new ShpTDSprite(s2); var roofBitmap = RenderShp(shp2, p); using (var g = System.Drawing.Graphics.FromImage(bitmap)) g.DrawImage(roofBitmap, 0, 0); } } catch { } return(new ActorTemplate { Bitmap = bitmap, Info = info, Appearance = info.Traits.GetOrDefault <EditorAppearanceInfo>() }); } }
static Bitmap RenderShp(ShpTDSprite shp, IPalette p) { var frame = shp.Frames.First(); 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 stride2 = data.Stride; for (var i = 0; i < frame.Size.Width; i++) { for (var j = 0; j < frame.Size.Height; j++) { q[j * stride2 + i] = frame.Data[i + frame.Size.Width * j]; } } } bitmap.UnlockBits(data); return(bitmap); }
public void Run(ModData modData, string[] args) { var remap = new Dictionary <int, int>(); /* the first 4 entries are fixed */ for (var i = 0; i < 4; i++) { remap[i] = i; } var srcMod = args[1].Split(':')[0]; Game.ModData = new ModData(srcMod); GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest); var srcRules = Game.ModData.RulesetCache.Load(); var srcPaletteInfo = srcRules.Actors["player"].Traits.Get <PlayerColorPaletteInfo>(); var srcRemapIndex = srcPaletteInfo.RemapIndex; var destMod = args[2].Split(':')[0]; Game.ModData = new ModData(destMod); GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest); var destRules = Game.ModData.RulesetCache.Load(); var destPaletteInfo = destRules.Actors["player"].Traits.Get <PlayerColorPaletteInfo>(); var destRemapIndex = destPaletteInfo.RemapIndex; var shadowIndex = new int[] { }; // the remap range is always 16 entries, but their location and order changes for (var i = 0; i < 16; i++) { remap[PlayerColorRemap.GetRemapIndex(srcRemapIndex, i)] = PlayerColorRemap.GetRemapIndex(destRemapIndex, i); } // map everything else to the best match based on channel-wise distance var srcPalette = new ImmutablePalette(args[1].Split(':')[1], shadowIndex); var destPalette = new ImmutablePalette(args[2].Split(':')[1], shadowIndex); for (var i = 0; i < Palette.Size; i++) { if (!remap.ContainsKey(i)) { remap[i] = Enumerable.Range(0, Palette.Size) .Where(a => !remap.ContainsValue(a)) .MinBy(a => ColorDistance(destPalette[a], srcPalette[i])); } } using (var s = File.OpenRead(args[3])) using (var destStream = File.Create(args[4])) { var srcImage = new ShpTDSprite(s); ShpTDSprite.Write(destStream, srcImage.Size, srcImage.Frames.Select(im => im.Data.Select(px => (byte)remap[px]).ToArray())); } }
void IUtilityCommand.Run(Utility utility, string[] args) { var remap = new Dictionary <int, int>(); /* the first 4 entries are fixed */ for (var i = 0; i < 4; i++) { remap[i] = i; } var srcMod = args[1].Split(':')[0]; var srcModData = new ModData(utility.Mods[srcMod], utility.Mods); Game.ModData = srcModData; var srcPaletteInfo = srcModData.DefaultRules.Actors[SystemActors.Player].TraitInfo <PlayerColorPaletteInfo>(); var srcRemapIndex = srcPaletteInfo.RemapIndex; var destMod = args[2].Split(':')[0]; var destModData = new ModData(utility.Mods[destMod], utility.Mods); Game.ModData = destModData; var destPaletteInfo = destModData.DefaultRules.Actors[SystemActors.Player].TraitInfo <PlayerColorPaletteInfo>(); var destRemapIndex = destPaletteInfo.RemapIndex; var shadowIndex = new int[] { }; // the remap range is always 16 entries, but their location and order changes for (var i = 0; i < 16; i++) { remap[srcRemapIndex[i]] = destRemapIndex[i]; } // map everything else to the best match based on channel-wise distance var srcPalette = new ImmutablePalette(args[1].Split(':')[1], new[] { 0 }, shadowIndex); var destPalette = new ImmutablePalette(args[2].Split(':')[1], new[] { 0 }, shadowIndex); for (var i = 0; i < Palette.Size; i++) { if (!remap.ContainsKey(i)) { remap[i] = Enumerable.Range(0, Palette.Size) .Where(a => !remap.ContainsValue(a)) .MinBy(a => ColorDistance(destPalette[a], srcPalette[i])); } } using (var s = File.OpenRead(args[3])) using (var destStream = File.Create(args[4])) { var srcImage = new ShpTDSprite(s); ShpTDSprite.Write(destStream, srcImage.Size, srcImage.Frames.Select(im => im.Data.Select(px => (byte)remap[px]).ToArray())); } }
public void Run(ModData modData, string[] args) { var inputFiles = GlobArgs(args).OrderBy(a => a).ToList(); var dest = inputFiles[0].Split('-').First() + ".shp"; var frames = inputFiles.Select(a => PngLoader.Load(a)); var size = frames.First().Size; if (frames.Any(f => f.Size != size)) { throw new InvalidOperationException("All frames must be the same size"); } using (var destStream = File.Create(dest)) ShpTDSprite.Write(destStream, size, frames.Select(f => ToBytes(f))); Console.WriteLine(dest + " saved."); }
void IUtilityCommand.Run(Utility utility, string[] args) { var inputFiles = GlobArgs(args).OrderBy(a => a).ToList(); var dest = inputFiles[0].Split('-').First() + ".shp"; var frames = inputFiles.Select(a => new Png(File.OpenRead(a))).ToList(); var size = new Size(frames[0].Width, frames[0].Height); if (frames.Any(f => f.Width != size.Width || f.Height != size.Height)) { throw new InvalidOperationException("All frames must be the same size"); } using (var destStream = File.Create(dest)) ShpTDSprite.Write(destStream, size, frames.Select(f => f.Data)); Console.WriteLine(dest + " saved."); }
public static ActorTemplate RenderActor(ActorInfo info, SequenceProvider sequenceProvider, TileSet tileset, IPalette p, string race) { var image = info.Traits.Get <ILegacyEditorRenderInfo>().EditorImage(info, sequenceProvider, race); image = ResolveFilename(image, tileset); using (var s = GlobalFileSystem.Open(image)) { var shp = new ShpTDSprite(s); var bitmap = RenderShp(shp, p); return(new ActorTemplate { Bitmap = bitmap, Info = info, Appearance = info.Traits.GetOrDefault <EditorAppearanceInfo>() }); } }