예제 #1
0
        private void AddGridRow(DataGridView grid, object wzObject) {
            int id;
            string name = null;
            WzObject png;
            string properties = GetAllProperties(wzObject);

            if (wzObject is WzImage img) {
                id = int.Parse(Path.GetFileNameWithoutExtension(img.Name));
                WzImageProperty link = img.GetFromPath("info/link");
                if (link is WzStringProperty) {
                    string linkName = ((WzStringProperty) link).Value;
                    img = ((WzDirectory) img.Parent).GetChildImages().Find(p => p.Name.Equals(linkName + ".img"));
                    if (img == null) return;
                }

                png = img.GetFromPath("stand/0");
                if (img.WzFileParent.Name.StartsWith("Npc")) {
                    // icon path like: '{ID}/stand/0'
                    name = StringWz.GetNpc(id);
                } else if (img.WzFileParent.Name.StartsWith("Mob")) {
                    // icon path like: '{ID}/(move|stand|fly)/0'
                    name = StringWz.GetMob(id);
                    if (png == null) {
                        png = img.GetFromPath("fly/0") ??
                              img.GetFromPath("move/0"); // attempt to get image of the monster
                    }
                } else if (img.WzFileParent.Name.StartsWith("Reactor")) {
                    name = img.GetFromPath("action")?.GetString();
                    png = img.GetFromPath("0/0");
                } else if (img.WzFileParent.Name.StartsWith("Map")) {
                    name = StringWz.GetFieldFullName(id);
                    png = img.GetFromPath("miniMap/canvas");
                } else {
                    // for breadcrumb like: '{ID}.img/info/icon'
                    if (ItemConstants.IsEquip(id)) name = StringWz.GetEqp(id);
                    else if (ItemConstants.IsPet(id)) name = StringWz.GetPet(id);
                    png = img.GetFromPath("info/icon");
                }
            } else if (wzObject is WzSubProperty subProperty) {
                id = int.Parse(subProperty.Name);

                if (subProperty.WzFileParent.Name.StartsWith("Skill")) {
                    name = StringWz.GetSkill(subProperty.Name);
                    properties = GetAllProperties(subProperty);
                    png = subProperty.GetFromPath("icon");
                } else {
                    // for path like: 'category.img/{ID}/info/icon' (Etc.wz)
                    id = int.Parse(subProperty.Name);
                    if (ItemConstants.IsEtc(id)) name = StringWz.GetEtc(id);
                    else if (ItemConstants.IsCash(id)) name = StringWz.GetCash(id);
                    else if (ItemConstants.IsChair(id)) name = StringWz.GetChair(id);
                    else if (ItemConstants.IsConsume(id)) name = StringWz.GetConsume(id);

                    png = subProperty.GetFromPath("info/icon");
                }
            } else return;

            if (grid.Parent is DataViewport dv) {
                ((List<BinData>)dv.Tag)?.Add(new BinData(id, png?.GetBitmap(), name, properties));
            }
            grid.Rows.Add(id, png?.GetBitmap(), name, properties);
        }
예제 #2
0
        private void LoadWzData(int selectedRoot, WzMapleVersion encryption, string directory)
        {
            if (selectedRoot == -1)
            {
                var result = MessageBox.Show("You have opted to load data for every tab. Are you sure you want to do this?", "Warning", MessageBoxButtons.YesNo);
                if (result != DialogResult.Yes)
                {
                    return;
                }
                loadAll = true;
                for (int i = 0; i <= 10; i++)
                {
                    TabControlMain.SelectedIndex = i;
                    LoadWzData(i, encryption, directory);
                    BtnSave_Click(null, new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0));
                }
                return;
            }

            switch (selectedRoot)
            {
            case 0:     // Equips
            {
                var            file     = Wz.Character.LoadFile($@"{directory}\Character", encryption, false);
                List <WzImage> children = file.WzDirectory.GetChildImages();
                children.Sort((a, b) => a.Name.CompareTo(b.Name));
                foreach (var img in children)
                {
                    string sId = Path.GetFileNameWithoutExtension(img.Name);
                    if (int.TryParse(sId, out int itemId))
                    {
                        var name       = StringWz.GetEqp(itemId);
                        var properties = GetAllProperties(img);
                        var icon       = img.GetFromPath("info/icon")?.GetBitmap();

                        DataViewer dv;
                        int        bodyPart = itemId / 10000;
                        switch (bodyPart)
                        {
                        default: continue;

                        case int n when(n >= 130 && n <= 170):
                            dv = EquipWeaponsView;

                            break;

                        case int n when(n == 2 || n == 5):
                            icon = img.GetFromPath("blink/0/face")?.GetBitmap();

                            dv = EquipFacesView;
                            break;

                        case int n when(n == 3 || n == 4): {
                            icon = (img.GetFromPath("default/hairOverHead") ?? img.GetFromPath("default/hair"))?.GetBitmap();
                            var hairBelowBody = (img.GetFromPath("default/hairBelowBody") as WzCanvasProperty)?.GetBitmap();
                            if (icon != null && hairBelowBody != null)
                            {
                                var merge = new Bitmap(Math.Max(icon.Width, hairBelowBody.Width), Math.Max(icon.Height, hairBelowBody.Height));
                                using (var g = Graphics.FromImage(merge)) {
                                    g.DrawImage(hairBelowBody, Point.Empty);
                                    g.DrawImage(icon, Point.Empty);
                                }

                                icon = merge;
                            }

                            dv = EquipHairsView;
                            break;
                        }

                        case int n when((n >= 101 && n <= 103) || (n >= 112 && n <= 114)):
                            dv = EquipAccessoryView;

                            break;

                        case 100:
                            dv = EquipCapsView;
                            break;

                        case 105:
                            dv = EquipsOverallsView;
                            break;

                        case 104:
                            dv = EquipTopsView;
                            break;

                        case 106:
                            dv = EquipPantsView;
                            break;

                        case 107:
                            dv = EquipShoesView;
                            break;

                        case 110:
                            dv = EquipCapesView;
                            break;

                        case 108:
                            dv = EquipGlovesView;
                            break;

                        case 111:
                            dv = EquipRingsView;
                            break;

                        case 109:
                            dv = EquipShieldsView;
                            break;

                        case int n when(n == 190 || n == 191 || n == 193):
                            dv = EquipMountsView;

                            break;
                        }

                        ((List <BinData>)dv.Tag).Add(new BinData(itemId, icon, name, properties));
                        dv.GridView.Rows.Add(itemId, icon, name, properties);
                    }
                }

                Wz.Character.Dispose();

                break;
            }

            case 1:     // Use
            case 2:     // Setup
            case 3:     // Etc
            case 4:     // Cash
            case 9:     // Pets
            {
                var file     = Wz.Item.LoadFile($@"{directory}\Item", encryption, false);
                var children = file.WzDirectory.GetChildImages();
                children.Sort((a, b) => a.Name.CompareTo(b.Name));

                void AddRow(WzImage wz, DataViewer dv) =>
                wz.WzProperties.ForEach(imgs => AddGridRow(dv.GridView, imgs));

                foreach (var img in children)
                {
                    string name = Path.GetFileNameWithoutExtension(img.Name);
                    if (int.TryParse(name, out int itemId))
                    {
                        switch (selectedRoot)
                        {
                        case 1:
                            switch (itemId)
                            {
                            default:
                                if (ItemConstants.IsConsume(itemId))
                                {
                                    AddRow(img, UseConsumeView);
                                }
                                break;

                            case 204:
                                AddRow(img, UseScrollsView);
                                break;

                            case 206:
                            case 207:
                            case 233:
                                AddRow(img, UseProjectileView);
                                break;
                            }

                            break;

                        case 2 when itemId == 301 || itemId == 399:
                            AddRow(img, (itemId == 301 ? SetupChairsView : SetupOthersView));
                            break;

                        case 3 when ItemConstants.IsEtc(itemId):
                            AddRow(img, EtcView);

                            break;

                        case 4 when ItemConstants.IsCash(itemId):
                            AddRow(img, CashView);

                            break;

                        case 9 when ItemConstants.IsPet(itemId):
                            AddGridRow(PetsView.GridView, img);

                            break;
                        }
                    }
                }

                Wz.Item.Dispose();

                break;
            }

            case 5: {
                // Map
                var file = Wz.Map.LoadFile($@"{directory}\Map", encryption, false);

                var children = file.WzDirectory.GetChildImages();
                children.Sort((a, b) => a.Name.CompareTo(b.Name));
                foreach (var img in children)
                {
                    string sMapId = Path.GetFileNameWithoutExtension(img.Name);
                    if (!int.TryParse(sMapId, out int mapId))
                    {
                        continue;
                    }

                    img.ParseImage();
                    string           properties = GetAllProperties(img);
                    WzCanvasProperty icon       = (WzCanvasProperty)img.GetFromPath("miniMap/canvas");
                    string           name       = StringWz.GetFieldFullName(mapId);

                    MapsView.GridView.Rows.Add(mapId, icon?.GetBitmap(), name, properties);
                }

                Wz.Map.Dispose();

                break;
            }

            case 6: {
                // Mob
                var file     = Wz.Mob.LoadFile($@"{directory}\Mob", encryption, false);
                var children = file.WzDirectory.GetChildImages();
                children.Sort((a, b) => a.Name.CompareTo(b.Name));
                foreach (var img in children)
                {
                    AddGridRow(MobsView.GridView, img);
                }

                Wz.Mob.Dispose();

                break;
            }

            case 7: {
                // Skills
                var file     = Wz.Skill.LoadFile($@"{directory}\Skill", encryption, false);
                var children = file.WzDirectory.GetChildImages();
                foreach (var img in children)
                {
                    string name = Path.GetFileNameWithoutExtension(img.Name);
                    if (!int.TryParse(name, out _))
                    {
                        continue;
                    }
                    WzImageProperty tree = img.GetFromPath("skill");

                    if (!(tree is WzSubProperty))
                    {
                        continue;
                    }
                    List <WzImageProperty> skills = tree.WzProperties;
                    skills.ForEach(s => AddSkillRow(s));
                }

                Wz.Skill.Dispose();

                break;
            }

            case 8: {
                // NPCs
                var file     = Wz.Npc.LoadFile($@"{directory}\Npc", encryption, false);
                var children = file.WzDirectory.GetChildImages();
                children.Sort((a, b) => a.Name.CompareTo(b.Name));
                foreach (var img in children)
                {
                    AddGridRow(NPCView.GridView, img);
                }

                Wz.Npc.Dispose();

                break;
            }

            case 10: {
                // Reactors
                var file     = Wz.Reactor.LoadFile($@"{directory}\Reactor", encryption, false);
                var children = file.WzDirectory.GetChildImages();
                children.Sort((a, b) => a.Name.CompareTo(b.Name));
                foreach (var img in children)
                {
                    AddGridRow(ReactorView.GridView, img);
                }

                Wz.Reactor.Dispose();

                break;
            }
            }
        }