public override byte[] Rebuild() { List <byte> rebuilt = new List <byte>(); rebuilt.AddRange(Encoding.ASCII.GetBytes(TableSignature)); rebuilt.AddRange(BitConverter.GetBytes(Unknown)); rebuilt.AddRange(BitConverter.GetBytes(Size)); rebuilt.AddRange(BitConverter.GetBytes(NumMessages)); rebuilt.AddRange(BitConverter.GetBytes(Unknown2)); int messageDataLocation = ((int)(rebuilt.Count + (NumMessages * sizeof(uint)))).Round(16) - 16; List <int> messageOffsets = new List <int>(); List <byte> messageData = new List <byte>(); int offset = messageDataLocation; for (int i = 0; i < NumMessages; i++) { if (Messages[i].ConvertedString != string.Empty) { originalMessages[i] = new EtrianString(Messages[i].RawData); foreach (ushort val in Messages[i].RawData) { messageData.AddRange(BitConverter.GetBytes(val)); } messageData.AddRange(new byte[2]); int padding = (messageData.Count.Round(16) - messageData.Count); messageData.AddRange(new byte[padding]); messageOffsets.Add(offset); offset = messageDataLocation + messageData.Count; } else { messageOffsets.Add(0); } } foreach (int messageOffset in messageOffsets) { rebuilt.AddRange(BitConverter.GetBytes(messageOffset)); } rebuilt.AddRange(new byte[(rebuilt.Count.Round(16) - rebuilt.Count)]); rebuilt.AddRange(messageData); return(rebuilt.ToArray()); }
public void Terminate() { isBusy = true; etrianString = null; pbPreview.Image = null; if (renderedString != null) { renderedString.Dispose(); } txtString.Text = string.Empty; isBusy = false; }
public void Initialize(GameDataManager gameDataManager, MessageTable messageTable, int messageNo) { isBusy = true; this.gameDataManager = gameDataManager; this.messageTable = messageTable; this.messageNo = messageNo; this.etrianString = this.messageTable.Messages[this.messageNo]; txtString.Text = this.etrianString.ConvertedString; RenderString(); isBusy = false; }
protected override void Parse() { BinaryReader reader = new BinaryReader(TableFile.Stream); reader.BaseStream.Seek(Offset + 4, SeekOrigin.Begin); Unknown = reader.ReadUInt32(); Size = reader.ReadUInt32(); NumMessages = reader.ReadUInt32(); Unknown2 = reader.ReadUInt32(); MessageOffsets = new uint[NumMessages]; for (int i = 0; i < NumMessages; i++) { reader.BaseStream.Seek(Offset + 20 + (i * sizeof(uint)), SeekOrigin.Begin); MessageOffsets[i] = reader.ReadUInt32(); } byte[] fileData = TableFile.Stream.ToArray(); Messages = new EtrianString[NumMessages]; originalMessages = new EtrianString[NumMessages]; for (int i = 0; i < NumMessages; i++) { if (MessageOffsets[i] == 0) { Messages[i] = new EtrianString(string.Empty); } else { Messages[i] = new EtrianString(fileData, (int)(Offset + 0x10 + MessageOffsets[i]), GameDataManager.GameDataPropertyChanged); } originalMessages[i] = new EtrianString(Messages[i].RawData); } }
public Bitmap RenderString(EtrianString str, int width = 256, int spacingModifier = 0, int zoom = 1) { if (str == null) { return(null); } int newLines = str.ConvertedString.Count(xx => xx == '\n') + 1; int yIncrease = CharacterSize.Height; if (GameDataManager.Version != Yggdrasil.GameDataManager.Versions.European) { yIncrease += 4; } Bitmap rendered = new Bitmap(width, Math.Max(newLines, 1) * yIncrease); ColorMap[] colorMap = new ColorMap[1] { new ColorMap() { OldColor = font.Palette.Colors[1], NewColor = font.Palette.Colors[1] } }; ImageAttributes imageAttrib = new ImageAttributes(); int x = 0, y = 0; using (Graphics g = Graphics.FromImage(rendered)) { for (int i = 0; i < str.RawData.Length; i++) { if ((str.RawData[i] & 0x8000) == 0x8000 && !EtrianString.CharacterMap.ContainsKey(str.RawData[i])) { /* TODO: Figure out at least colors, not sure what else might be needed for preview here... */ switch (str.RawData[i] & 0xFF) { case 0x04: // Color ushort color = str.RawData[i + 1]; if (color == 0) { colorMap[0].NewColor = colorMap[0].OldColor; } else if (color == 4) { colorMap[0].NewColor = font.Palette.Colors[1]; } else if (color == 6) { colorMap[0].NewColor = Color.FromArgb(0xF8, 0x70, 0x48); } else if (color == 7) { colorMap[0].NewColor = Color.FromArgb(0x4A, 0xBD, 0xA5); } else if (color == 9) { colorMap[0].NewColor = Color.FromArgb(0xEF, 0xF7, 0xAD); } else if (color == 0xA) { colorMap[0].NewColor = Color.FromArgb(0x5A, 0xEF, 0xCE); } imageAttrib.SetRemapTable(colorMap); i++; continue; default: break; } } if (i + 1 < str.RawData.Length && (str.RawData[i] == 0x8001 && str.RawData[i + 1] == 0x8002)) { y += yIncrease; using (Pen pen = new Pen(Color.FromArgb(128, Color.White))) { g.DrawLine(pen, new Point(0, y + 1), new Point(rendered.Width, y + 1)); } x = 0; } else if (str.RawData[i] == 0x8001) { y += yIncrease; x = 0; } else { Character chrData = Characters.FirstOrDefault(xx => xx.ID == (ushort)((str.RawData[i] & 0xFF00) | (str.RawData[i] & 0xFF) - 1)); if (chrData != null) { g.DrawImage(chrData.Image, new Rectangle(x, y, chrData.Image.Width, chrData.Image.Height), 0, 0, chrData.Image.Width, chrData.Image.Height, GraphicsUnit.Pixel, imageAttrib); x += (chrData.Image.Width + spacingModifier); } } } } if (zoom == 1) { return(rendered); } else { Bitmap scaledRendered = new Bitmap(rendered.Width * zoom, rendered.Height * zoom); using (Graphics g = Graphics.FromImage(scaledRendered)) { g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.DrawImage(rendered, 0.0f, 0.0f, scaledRendered.Width, scaledRendered.Height); } return(scaledRendered); } }