Ejemplo n.º 1
0
        private void DrawSlotItem(Graphics g, ShipSlot slotItem, int x, int y)
        {
            var font8 = new Font(this.Font.FontFamily, 8);
            var item  = slotItem.Item;

            var sloticon = ImageAssets.GetSlotIconImage(item.Info.IconType);

            g.DrawImage(sloticon, new Rectangle(x + 4, y, 28, 28));

            if (item.Level > 0)
            {
                using (SolidBrush b = new SolidBrush(Color.FromArgb(0x40, 0x00, 0x00, 0x00)))
                    g.FillRectangle(b, new Rectangle(x, y + 16, 36, 12));

                TextRenderer.DrawText(
                    g,
                    item.LevelText,
                    font8,
                    new Rectangle(x, y + 16, 36, 12),
                    Color.White,
                    TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter
                    );
            }

            if (item.Proficiency > 0)
            {
                using (SolidBrush b = new SolidBrush(Color.FromArgb(0x60, 0x00, 0x00, 0x00)))
                    g.FillRectangle(b, new Rectangle(x + 36 - 12, y, 12, 12));

                var proficiency = ImageAssets.GetProficiencyImage(item.Proficiency);
                g.DrawImage(proficiency, new Rectangle(x + 36 - 11, y + 1, 10, 10));
            }

            var w = TextRenderer.MeasureText(slotItem.Current.ToString(), font8).Width;

            using (SolidBrush b = new SolidBrush(Color.FromArgb(0x60, 0x00, 0x00, 0x00)))
                g.FillRectangle(b, new Rectangle(x + 2, y, w - 1, 12));

            var currentColor = slotItem.Lost == 0 ? Color.White : Color.FromArgb(0xDD, 0x35, 0x35);

            if (!slotItem.IsAirplane)
            {
                currentColor = Color.FromArgb(
                    currentColor.R * 5 / 7,
                    currentColor.G * 5 / 7,
                    currentColor.B * 5 / 7
                    );
            }
            TextRenderer.DrawText(
                g,
                slotItem.Current.ToString(),
                font8,
                new Rectangle(x + 2, y, 36, 12),
                currentColor,
                TextFormatFlags.Left | TextFormatFlags.VerticalCenter
                );
        }
Ejemplo n.º 2
0
        private void CheckForRefresh()
        {
            if (assets == null)
            {
                assets = new GameObject("WebObject").AddComponent <ImageAssets>();
            }

            isInitialized = true;

            if (imageIdentifiers.lastCEID != CommunityEntity.ServerInstance.net.ID)
            {
                if (imageIdentifiers.imageIds.Count < 2)
                {
                    RefreshImagery();
                }
                else
                {
                    PrintWarning("The CommunityEntity instance ID has changed! Due to the way CUI works in Rust all previously stored images must be removed and re-stored using the new ID as reference so clients can find the images. These images will be added to a new load order. Interupting this process will result in being required to re-download these images from the web");
                    RestoreLoadedImages();
                }
            }
        }
Ejemplo n.º 3
0
            public TableView(SlotitemListTable Owner)
            {
                // SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer, true);
                this.DoubleBuffered = true;
                this.Owner          = Owner;
                this.Font           = Owner?.Font;

                this.components   = new System.ComponentModel.Container();
                toolTip           = new ToolTip(this.components);
                toolTip.OwnerDraw = true;

                this.Resize += (s, e) => this.RequestUpdate();
                this.Paint  += (s, e) =>
                {
                    var g      = e.Graphics;
                    var Width  = this.Width - this.Padding.Left - this.Padding.Right;
                    var Height = this.Height - this.Padding.Top - this.Padding.Bottom;

                    g.Clear(this.BackColor);

                    Font font8 = new Font(this.Font.FontFamily, 8);

                    var Ships     = homeport?.Organization?.Ships;
                    var SlotItems = homeport?.Itemyard?.SlotItems.Select(_ => _.Value)
                                    .OrderBy(_ => _.Info.Id)
                                    .GroupBy(_ => _.Info.Id);

                    #region Cell Size Calculate
                    ColumnSizes[0] = SlotItems?.Count() > 0
                                                ? (SlotItems?.Max(__ =>
                                                                  __.Max(_ => TextRenderer.MeasureText(_.Info.Name.ToString(), this.Font).Width)
                                                                  ) ?? 0) + 20
                                                : 0;
                    ColumnSizes[1] = SlotItems?.Count() > 0
                                                ? (SlotItems?.Max(_ => TextRenderer.MeasureText(_.Count().ToString(), this.Font).Width) ?? 0)
                                                : 0;
                    ColumnSizes[2] = ColumnSizes[3] = ColumnSizes[4] = 0;


                    ColumnSizes[0] = Math.Max(ColumnSizes[0], TextRenderer.MeasureText(Headers[0], this.Font).Width) + 8;
                    ColumnSizes[1] = Math.Max(ColumnSizes[1], TextRenderer.MeasureText(Headers[1], this.Font).Width) + 8;
                    ColumnSizes[2] = Math.Max(ColumnSizes[2], TextRenderer.MeasureText(Headers[2], this.Font).Width) + 8;
                    ColumnSizes[3] = Math.Max(ColumnSizes[3], TextRenderer.MeasureText(Headers[3], this.Font).Width) + 8;
                    ColumnSizes[4] = Math.Max(ColumnSizes[4], TextRenderer.MeasureText(Headers[4], this.Font).Width) + 8;
                    ColumnSizes[5] = 0;

                    ColumnSizes[5] = (this.Owner?.Width ?? this.Width) - ColumnSizes.Sum() - 1 - 18;
                    #endregion

                    int x, y = 0;
                    using (Pen p = new Pen(Color.FromArgb(83, 83, 83), 1.0f))
                    {
                        SlotItemMap.Clear();

                        #region Data Rendering
                        if (SlotItems != null)
                        {
                            Color colorWhite           = Color.White;
                            Color colorDarkGray        = Color.FromArgb(0x20, 0x90, 0x90, 0x90);
                            Color colorGray            = Color.FromArgb(0x40, 0xC4, 0xC4, 0xC4);
                            Color colorLevel           = Color.FromArgb(0x45, 0xA9, 0xA5);
                            Color colorProficiency123  = Color.FromArgb(0x98, 0xB3, 0xCE);
                            Color colorProficiency4567 = Color.FromArgb(0xD4, 0x9C, 0x0F);
                            int   idx = 0;
                            y = 0;

                            foreach (var slotitemIdGroup in SlotItems)
                            {
                                if (slotitemIdGroup == null)
                                {
                                    continue;
                                }

                                int widthValue, nx;
                                x  = 0;
                                y -= 2;

                                var slotitemLevelGroup = slotitemIdGroup
                                                         .GroupBy(_ => _.NameWithLevel);

                                if (idx % 2 == 1)
                                {
                                    int py = y;

                                    #region Calcuate Equipped Ships Size
                                    foreach (var slotitems in slotitemLevelGroup)
                                    {
                                        int nx2           = x;
                                        var EquippedShips = Ships.Where(
                                            _ => _.Value.Slots.Any(__ => slotitems.Any(___ => ___.Id == __.Item.Id)) ||
                                            (slotitems.Any(___ => ___.Id == _.Value.ExSlot?.Item.Id))
                                            ).Select(_ => _.Value);

                                        foreach (var ship in EquippedShips)
                                        {
                                            int sizeName  = 0;
                                            int sizeLevel = 0;
                                            int sizeCount = 0;
                                            int hasCount  = ship.Slots.Count(_ => slotitems.Any(__ => __.Id == _.Item.Id))
                                                            + (slotitems.Any(_ => _.Id == ship.ExSlot?.Item.Id) ? 1 : 0);

                                            sizeName  = TextRenderer.MeasureText(ship.Info.Name, this.Font).Width - 2;
                                            sizeLevel = TextRenderer.MeasureText("Lv." + ship.Level.ToString(), font8).Width;
                                            if (hasCount > 1)
                                            {
                                                sizeCount = TextRenderer.MeasureText("x " + hasCount.ToString(), font8).Width + 1;
                                            }

                                            if ((x - nx2) + sizeName + sizeLevel + sizeCount > ColumnSizes[5])
                                            {
                                                x  = nx2;
                                                y += RowSize;
                                            }
                                            x += sizeName + sizeLevel + sizeCount + 8;
                                        }
                                    }
                                    #endregion

                                    using (SolidBrush b = new SolidBrush(Color.FromArgb(0x18, 0x90, 0x90, 0x90)))
                                        g.FillRectangle(b, new Rectangle(0, py, Width, y - py + RowSize));

                                    x = 0;
                                    y = py;
                                }

                                #region Icon And Name
                                Image icon = ImageAssets.GetSlotIconImage(slotitemIdGroup.First().Info.IconType);
                                g.DrawImage(icon, new Rectangle(x + 4, y + 2, 18, 18));

                                TextRenderer.DrawText(
                                    g,
                                    slotitemIdGroup.First().Info.Name,
                                    this.Font,
                                    new Rectangle(x + 20 + 3, y, ColumnSizes[0] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                SlotItemMap.Add(new Rectangle(x, y, ColumnSizes[0], RowSize), slotitemIdGroup.First());
                                x += ColumnSizes[0];
                                #endregion

                                #region Items count (Group)
                                TextRenderer.DrawText(
                                    g,
                                    slotitemIdGroup.Count().ToString(),
                                    this.Font,
                                    new Rectangle(x + 3, y, ColumnSizes[1] - 8, RowSize),
                                    colorWhite,
                                    TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                    );
                                x += ColumnSizes[1];
                                #endregion

                                nx = x;
                                foreach (var slotitems in slotitemLevelGroup)
                                {
                                    if (slotitems == null)
                                    {
                                        continue;
                                    }

                                    var slotitem = slotitems.First();

                                    #region Item Level
                                    TextRenderer.DrawText(
                                        g,
                                        "★" + (slotitem.Level == 10 ? "max" : "+" + slotitem.Level.ToString()),
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[2] - 8, RowSize),
                                        slotitem.Level > 0 ? colorLevel : colorDarkGray,
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                    x += ColumnSizes[2];
                                    #endregion

                                    #region Item Proficiency
                                    TextRenderer.DrawText(
                                        g,
                                        "+" + slotitem.Proficiency.ToString(),
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[3] - 8, RowSize),
                                        slotitem.Proficiency >= 4
                                                                                ? colorProficiency4567
                                                                                : (
                                            slotitem.Proficiency >= 1 && slotitem.Proficiency <= 3
                                                                                        ? colorProficiency123
                                                                                        : colorDarkGray
                                            ),
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                    x += ColumnSizes[3];
                                    #endregion

                                    #region Items count
                                    widthValue = TextRenderer.MeasureText(
                                        slotitems.Count().ToString(),
                                        this.Font
                                        ).Width;

                                    TextRenderer.DrawText(
                                        g,
                                        slotitems.Count().ToString(),
                                        this.Font,
                                        new Rectangle(x + 3, y, ColumnSizes[4] - 8, RowSize),
                                        colorWhite,
                                        TextFormatFlags.VerticalCenter | TextFormatFlags.Left
                                        );
                                    TextRenderer.DrawText(
                                        g,
                                        "(" + slotitems.Count(
                                            _ => !Ships.Any(
                                                __ => __.Value.Slots.Any(___ => ___.Item.Id == _.Id) ||
                                                (__.Value.ExSlot?.Item.Id == _.Id)
                                                )
                                            ) + ")",
                                        font8,
                                        new Rectangle(x + widthValue + 3, y, ColumnSizes[4] - 8, RowSize - 4),
                                        colorGray,
                                        TextFormatFlags.Bottom | TextFormatFlags.Left
                                        );
                                    x += ColumnSizes[4];
                                    #endregion

                                    #region Equipped Ships
                                    int nx2           = x;
                                    var EquippedShips = Ships.Where(
                                        _ => _.Value.Slots.Any(__ => slotitems.Any(___ => ___.Id == __.Item.Id)) ||
                                        (slotitems.Any(___ => ___.Id == _.Value.ExSlot?.Item.Id))
                                        ).Select(_ => _.Value);

                                    foreach (var ship in EquippedShips)
                                    {
                                        int sizeName  = 0;
                                        int sizeLevel = 0;
                                        int sizeCount = 0;
                                        int hasCount  = ship.Slots.Count(_ => slotitems.Any(__ => __.Id == _.Item.Id))
                                                        + (slotitems.Any(_ => _.Id == ship.ExSlot?.Item.Id) ? 1 : 0);

                                        sizeName  = TextRenderer.MeasureText(ship.Info.Name, this.Font).Width - 2;
                                        sizeLevel = TextRenderer.MeasureText("Lv." + ship.Level.ToString(), font8).Width;
                                        if (hasCount > 1)
                                        {
                                            sizeCount = TextRenderer.MeasureText("x " + hasCount.ToString(), font8).Width + 1;
                                        }

                                        if ((x - nx2) + sizeName + sizeLevel + sizeCount > ColumnSizes[5])
                                        {
                                            x  = nx2;
                                            y += RowSize;
                                        }

                                        TextRenderer.DrawText(g, ship.Info.Name, this.Font, new Point(x, y + 4), colorWhite);
                                        TextRenderer.DrawText(g, "Lv." + ship.Level.ToString(), font8, new Point(x + sizeName, y + 4 + 2), colorGray);
                                        if (hasCount > 1)
                                        {
                                            using (SolidBrush b = new SolidBrush(Color.FromArgb(0x20, 0x20, 0x20)))
                                                g.FillRectangle(b, new Rectangle(x + sizeName + sizeLevel, y + 4, sizeCount, RowSize - 4 - 4));

                                            TextRenderer.DrawText(g, "x " + hasCount.ToString(), font8, new Point(x + sizeName + sizeLevel + 1, y + 4 + 1), colorGray);
                                        }
                                        x += sizeName + sizeLevel + sizeCount + 8;
                                    }
                                    #endregion

                                    y += RowSize;
                                    x  = nx;
                                }                                 // GroupBy LevelProficiency

                                idx++;
                                y += 3;
                                g.DrawLine(p, 0, y - 3, Width, y - 3);
                            }                             // GroupBy Id
                        }
                        #endregion
                    }

                    var ResultSize = new Size(
                        ColumnSizes.Sum() + this.Padding.Left + this.Padding.Right + 1,
                        y + this.Padding.Top + this.Padding.Bottom + 1
                        );
                    if (ResultSize.Width != LatestSize.Width || ResultSize.Height != LatestSize.Height)
                    {
                        LatestSize = ResultSize;
                        this.PerformAutoScale();
                        this.PerformLayout();
                        this.Owner.RequestUpdate();
                    }
                };

                var toolTipFont = new Font(this.Font.FontFamily, 10);
                toolTip.Popup += (s, e) =>
                {
                    if (CurrentItem == null)
                    {
                        e.Cancel = true;
                        return;
                    }

                    var text = CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData;
                    var sz   = TextRenderer.MeasureText(text, toolTipFont);
                    e.ToolTipSize = new Size(sz.Width + 6, sz.Height + 6);
                };
                toolTip.Draw += (s, e) =>
                {
                    var g = e.Graphics;
                    g.Clear(Color.FromArgb(0x27, 0x27, 0x2F));
                    g.DrawRectangle(
                        new Pen(Color.FromArgb(0x44, 0x44, 0x4A), 1.0f),
                        new Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width - 1, e.Bounds.Height - 1)
                        );
                    TextRenderer.DrawText(
                        g,
                        e.ToolTipText,
                        toolTipFont,
                        e.Bounds,
                        Color.FromArgb(255, 255, 255),
                        TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter
                        );
                };

                this.MouseMove += (s, e) =>
                {
                    if (!this.SlotItemMap.Any(x => x.Key.Contains(e.X, e.Y)))
                    {
                        CurrentItem = null;
                        toolTip.Hide(this);
                        return;
                    }

                    var item = this.SlotItemMap.FirstOrDefault(x => x.Key.Contains(e.X, e.Y)).Value;
                    if (item == CurrentItem)
                    {
                        return;
                    }

                    CurrentItem = item;
                    toolTip.Show(CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData, this);
                };
                this.MouseDown += (s, e) =>
                {
                    if (!this.SlotItemMap.Any(x => x.Key.Contains(e.X, e.Y)))
                    {
                        CurrentItem = null;
                        toolTip.Hide(this);
                        return;
                    }

                    var item = this.SlotItemMap.FirstOrDefault(x => x.Key.Contains(e.X, e.Y)).Value;
                    CurrentItem = item;
                    toolTip.Show(CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData, this);
                };
            }
Ejemplo n.º 4
0
        public override bool Execute()
        {
            try {
                LogTaskProperty("ImageAssets", ImageAssets);
                LogTaskProperty("ProjectDir", ProjectDir);
                LogTaskProperty("SessionId", SessionId);

                var connection  = BuildConnection.GetAsync(SessionId, BuildEngine4).Result;
                var buildClient = connection.Client as BuildClient;

                if (!connection.IsConnected || buildClient == null)
                {
                    Log.LogWarning(MSBStrings.E0179, nameof(ResolveUniversalTypeIdentifiers));

                    return(true);
                }

                var contentFiles = ImageAssets
                                   .Where(asset => Path.GetFileName(asset.ItemSpec) == "Contents.json" &&
                                          Path.GetDirectoryName(asset.ItemSpec).EndsWith(".dataset"))
                                   .Select(x => x.ItemSpec);

                foreach (var filePath in contentFiles)
                {
                    string  content;
                    DataSet dataset = null;

                    if (File.Exists(filePath))
                    {
                        content = File.ReadAllText(filePath);
                        dataset = JsonConvert.DeserializeObject <DataSet> (content);
                    }

                    if (dataset == null)
                    {
                        Log.LogError(MSBStrings.E0180, Path.GetDirectoryName(filePath));
                        continue;
                    }

                    var dataItemsToComplete = dataset
                                              .DataItems
                                              .Where(item => string.IsNullOrEmpty(item.UniversalTypeIdentifier) &&
                                                     !string.IsNullOrEmpty(item.Filename)).ToList();

                    foreach (var data in dataItemsToComplete)
                    {
                        var file = ImageAssets.FirstOrDefault(x => Path.GetFileName(x.ItemSpec) == data.Filename);

                        if (file == null)
                        {
                            Log.LogWarning(MSBStrings.E0181, data.Filename);

                            continue;
                        }

                        var message = new GetUniversalTypeIdentifierMessage {
                            Payload  = File.ReadAllBytes(file.ItemSpec),
                            FileName = Path.GetFileName(data.Filename)
                        };

                        var response = buildClient
                                       .RunMessagingAsync <GetUniversalTypeIdentifierMessage, GetUniversalTypeIdentifierResult> (message, timeoutSecs: 10)
                                       .Result;

                        if (string.IsNullOrEmpty(response.UniversalTypeIdentifier))
                        {
                            Log.LogError(string.Format(MSBStrings.E0182, data.Filename, Path.GetDirectoryName(filePath)));
                        }

                        data.UniversalTypeIdentifier = response.UniversalTypeIdentifier;
                    }

                    if (dataItemsToComplete.Any())
                    {
                        content = JsonConvert.SerializeObject(dataset, Formatting.Indented);
                        File.WriteAllText(filePath, content);
                    }
                }

                return(!Log.HasLoggedErrors);
            } catch (Exception ex) {
                Log.LogErrorFromException(ex);

                return(false);
            }
        }
Ejemplo n.º 5
0
        public BattleShipTooltip(BattleFleetView Owner, IContainer container) : base(container)
        {
            this.Owner = Owner;

            this.Popup += (s, e) =>
            {
                e.ToolTipSize = CalcSize(this.Ship);
            };
            this.Draw += (s, e) =>
            {
                var g = e.Graphics;
                g.Clear(Color.FromArgb(0x27, 0x27, 0x2F));
                g.DrawRectangle(
                    new Pen(Color.FromArgb(0x44, 0x44, 0x4A), 1.0f),
                    new Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width - 1, e.Bounds.Height - 1)
                    );
                if (this.Ship == null)
                {
                    return;
                }

                Color colorWhite    = Color.White;
                Color colorDarkGray = Color.FromArgb(0x20, 0x90, 0x90, 0x90);
                Color colorGray     = Color.FromArgb(0x40, 0xC4, 0xC4, 0xC4);

                var ship = this.Ship;
                var f = this.Owner?.Font;
                int x, y;
                int h = TextRenderer.MeasureText(" ", f).Height;

                int[]  cols            = new int[2];
                string firepowerSum    = ship.SumFirepower.ToString(),
                       torpedoSum      = ship.SumTorpedo.ToString(),
                       aaSum           = ship.SumAA.ToString(),
                       armorSum        = ship.SumArmor.ToString(),
                       firepowerDetail = string.Format("({0}+{1})", ship.Firepower, ship.SlotsFirepower),
                       torpedoDetail   = string.Format("({0}+{1})", ship.Torpedo, ship.SlotsTorpedo),
                       aaDetail        = string.Format("({0}+{1})", ship.AA, ship.SlotsAA),
                       armorDetail     = string.Format("({0}+{1})", ship.Armor, ship.SlotsArmor),
                       aswDetail       = string.Format("(+{0})", ship.SlotsASW),
                       hitDetail       = string.Format("(+{0})", ship.SlotsHit),
                       evadeDetail     = string.Format("(+{0})", ship.SlotsEvade);

                #region Cell size calculate
                cols[0] = new int[] {
                    TextRenderer.MeasureText("화력", f).Width
                    + TextRenderer.MeasureText(firepowerSum, f).Width
                    + TextRenderer.MeasureText(firepowerDetail, f).Width,

                    TextRenderer.MeasureText("뇌장", f).Width
                    + TextRenderer.MeasureText(torpedoSum, f).Width
                    + TextRenderer.MeasureText(torpedoDetail, f).Width,

                    TextRenderer.MeasureText("대공", f).Width
                    + TextRenderer.MeasureText(aaSum, f).Width
                    + TextRenderer.MeasureText(aaDetail, f).Width,

                    TextRenderer.MeasureText("장갑", f).Width
                    + TextRenderer.MeasureText(armorSum, f).Width
                    + TextRenderer.MeasureText(armorDetail, f).Width
                }.Max();
                cols[1] = new int[] {
                    TextRenderer.MeasureText("대잠", f).Width
                    + TextRenderer.MeasureText(aswDetail, f).Width,

                    TextRenderer.MeasureText("명중", f).Width
                    + TextRenderer.MeasureText(hitDetail, f).Width,

                    TextRenderer.MeasureText("회피", f).Width
                    + TextRenderer.MeasureText(evadeDetail, f).Width
                }.Max();
                #endregion


                #region First Column
                x = 4; y = 3;
                TextRenderer.DrawText(g, "화력", f, new Point(x, y), colorGray);
                x += TextRenderer.MeasureText("화력", f).Width;
                TextRenderer.DrawText(g, firepowerSum, f, new Point(x, y), colorWhite);
                x += TextRenderer.MeasureText(firepowerSum, f).Width;
                TextRenderer.DrawText(g, firepowerDetail, f, new Point(x, y), colorGray);

                x = 4; y += h;
                TextRenderer.DrawText(g, "뇌장", f, new Point(x, y), colorGray);
                x += TextRenderer.MeasureText("뇌장", f).Width;
                TextRenderer.DrawText(g, torpedoSum, f, new Point(x, y), colorWhite);
                x += TextRenderer.MeasureText(torpedoSum, f).Width;
                TextRenderer.DrawText(g, torpedoDetail, f, new Point(x, y), colorGray);

                x = 4; y += h;
                TextRenderer.DrawText(g, "대공", f, new Point(x, y), colorGray);
                x += TextRenderer.MeasureText("대공", f).Width;
                TextRenderer.DrawText(g, aaSum, f, new Point(x, y), colorWhite);
                x += TextRenderer.MeasureText(aaSum, f).Width;
                TextRenderer.DrawText(g, aaDetail, f, new Point(x, y), colorGray);

                x = 4; y += h;
                TextRenderer.DrawText(g, "장갑", f, new Point(x, y), colorGray);
                x += TextRenderer.MeasureText("장갑", f).Width;
                TextRenderer.DrawText(g, armorSum, f, new Point(x, y), colorWhite);
                x += TextRenderer.MeasureText(armorSum, f).Width;
                TextRenderer.DrawText(g, armorDetail, f, new Point(x, y), colorGray);
                #endregion

                #region Second Column
                x = 4 + cols[0]; y = 3;
                TextRenderer.DrawText(g, "대잠", f, new Point(x, y), colorGray);
                x += TextRenderer.MeasureText("대잠", f).Width;
                TextRenderer.DrawText(g, aswDetail, f, new Point(x, y), colorGray);

                x = 4 + cols[0]; y += h;
                TextRenderer.DrawText(g, "명중", f, new Point(x, y), colorGray);
                x += TextRenderer.MeasureText("명중", f).Width;
                TextRenderer.DrawText(g, hitDetail, f, new Point(x, y), colorGray);

                x = 4 + cols[0]; y += h;
                TextRenderer.DrawText(g, "회피", f, new Point(x, y), colorGray);
                x += TextRenderer.MeasureText("회피", f).Width;
                TextRenderer.DrawText(g, evadeDetail, f, new Point(x, y), colorGray);
                #endregion

                #region Last Column
                x = 4 + cols[0] + cols[1]; y = 3;
                foreach (var slot in ship.Slots.Where(_ => _.Equipped))
                {
                    var icon = ImageAssets.GetSlotIconImage(slot.Source.IconType);
                    g.DrawImage(icon, new Rectangle(x + 1, y + 1, 14, 14));

                    TextRenderer.DrawText(g, slot.Source.Name, f, new Point(x + 14 + 2, y), colorWhite);
                    y += h;
                }
                if (ship.ExSlot?.Equipped ?? false)
                {
                    using (Pen p = new Pen(colorGray))
                        g.DrawLine(p, x + 2, y, e.Bounds.Width - 2, y);

                    var slot = ship.ExSlot;
                    var icon = ImageAssets.GetSlotIconImage(slot.Source.IconType);
                    g.DrawImage(icon, new Rectangle(x + 1, y + 1, 14, 14));

                    TextRenderer.DrawText(g, slot.Source.Name, f, new Point(x + 14 + 2, y), colorWhite);
                    y += h;
                }
                #endregion
            };
            this.OwnerDraw = true;
        }