public void Import(ReadAndWrite rw, Bitmap bm, int frame, int pal, bool clear, bool find) { int gfx_offset = npc.gfx_table + (frame << 3); int img_offset; try { img_offset = rw.ReadPointer(gfx_offset); if (clear) { rw.FillWith0xFF(img_offset, rw.Br.ReadInt16()); goto FIND; } if (clear || find) { goto FIND; } goto NOT_FIND; } catch (NullReferenceException) { } FIND: img_offset = rw.FindFreeOffset0xFF(PokeConfig.ini.start_offset, bm.Width * bm.Height / 2); NOT_FIND: byte[] img = ImgFunction.ConvertNormalImagToGBA(bm, new List <Color>(palletes[pal]), false); rw.WriteBytes(img_offset, 0, img); rw.Seek(gfx_offset); rw.Bw.Write(img_offset + ReadAndWrite.ROM); rw.Bw.Write(bm.Width * bm.Height >> 1); npc.width = (short)bm.Width; npc.height = (short)bm.Height; Save(rw); }
public void Resize(ReadAndWrite rw, int old, int new_, bool clear) { if (new_ < old) { return; } int start = rw.FindFreeOffset0xFF(new_ * 8); rw.Seek(start); for (int i = 0; i < new_; i++) { rw.Bw.Write(0x1010101010001000); } byte[] a = rw.ReadAndClear(npc.gfx_table, 8 * old, clear); rw.WriteBytes(start, 0, a); npc.gfx_table = start + ReadAndWrite.ROM; Save(rw); }
/// <summary> /// 保存任意压缩数据,需要提供原始指针所在地址。 /// </summary> /// <param name="rw"></param> /// <param name="data">所需要写入的数据</param> /// <param name="offset">指针所在地址</param> /// <param name="fill">是否将原来的数据填充为0xFF</param> public int Save(ReadAndWrite rw, byte[] data, int offset_to_repoint, bool fill) { //指针所在地址 int offset_old = rw.ReadPointer(offset_to_repoint); //新地址 int offset_new = rw.FindFreeOffset(start, data.Length); rw.WriteBytes(offset_new, 0, data); start = rw.Position; rw.Repoint(offset_to_repoint, offset_new); int length = ImgFunction.LZUncompress(rw.Br, offset_old).Item2; if (fill) { rw.FillWith0xFF(offset_old, length); } return(offset_new); }