예제 #1
0
        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());
        }
예제 #2
0
        public void Terminate()
        {
            isBusy = true;

            etrianString    = null;
            pbPreview.Image = null;
            if (renderedString != null)
            {
                renderedString.Dispose();
            }
            txtString.Text = string.Empty;

            isBusy = false;
        }
예제 #3
0
        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;
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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);
            }
        }