public void WriteFile(CacheItemNode node, byte[] data) { if (node.SubArchive != -1) { SubArchives[node.SubArchive].WriteFile(node.FileIndex, data); } else if (node.Archive != -1) { Archives[node.Archive].WriteFile(node.FileIndex, data, data.Length); } }
public RSImage(Cache cache, CacheItemNode node, DataBuffer image_data, int sprite_index = 0) : this(cache.SubArchives[node.SubArchive], image_data, sprite_index) { }
public bool Write(Cache cache, CacheItemNode node, DataBuffer original) { try { DataBuffer index_data = cache.SubArchives[node.SubArchive].ExtractFile("index.dat"); original.Location = 0; index_data.Location = original.ReadShort() + 4; byte pcount = index_data.ReadByte(); if (pcount >= Palette.Length) { index_data.Location -= 5; } else //move to back { index_data.Location = index_data.Buffer.Length; byte[] temp = new byte[index_data.Buffer.Length + 12 + Palette.Length * 3]; Array.Copy(index_data.Buffer, temp, index_data.Buffer.Length); index_data.Buffer = temp; } IndexLocation = index_data.Location; index_data.WriteShort(WholeWidth); index_data.WriteShort(WholeHeight); index_data.WriteByte((byte)Palette.Length); for (int i = 0; i < Palette.Length - 1; i++) { index_data.WriteByte(Palette[i].R); index_data.WriteByte(Palette[i].G); index_data.WriteByte(Palette[i].B); } index_data.WriteByte((byte)XOffset); index_data.WriteByte((byte)YOffset); index_data.WriteShort(Width); index_data.WriteShort(Height); index_data.WriteByte(0); //x, y (1 is y, x) byte[] data = new byte[Width * Height + 2]; data[0] = (byte)(IndexLocation >> 8); data[1] = (byte)IndexLocation; for (int i = 0; i < Width * Height; i++) { //todo: optimize Color c = Pixels[i]; for (int k = 0; k < Palette.Length; k++) { if (Palette[k].R == c.R && Palette[k].G == c.G && Palette[k].B == c.B && Palette[k].A == c.A) { if (c.A == 0) { data[i + 2] = 0; } else { data[i + 2] = (byte)(k + 1); } } } } cache.SubArchives[node.SubArchive].WriteFile("index.dat", index_data.Buffer); cache.SubArchives[node.SubArchive].WriteFile(node.FileIndex, data); cache.SubArchives[node.SubArchive].RewriteArchive(); return(true); } catch (Exception) { return(false); } }