Пример #1
0
        public ActionResult <Response> Post(IFormFile file, string type)
        {
            byte[] data;
            try
            {
                using (var fs = file.OpenReadStream())
                {
                    data = new byte[fs.Length];
                    fs.Read(data, 0, (int)fs.Length);
                }
            }
            catch (Exception e)
            {
                return(new ErrorResponse(ErrorCode.INTERNAL_ERROR, e.Message, e.ToString()));
            }

            string errorMessage = "";

            try
            {
                switch (type)
                {
                case null:
                    goto default;

                case "charinfo":
                    var charinfo = new CharInfo();
                    charinfo.Read(data);
                    return(new SuccessResponse(charinfo));

                case "charsave":
                    var charsave = new SaveReader("1.13c");
                    charsave.Read(data);
                    var charsaveResponse = new CharSaveResponse(charsave);
                    return(new SuccessResponse(charsaveResponse));

                case "charitem":
                    var charitem         = Item.NewItem(data);
                    var charitemResponse = new CharItemResponse(charitem);
                    return(new SuccessResponse(charitemResponse));

                default:
                    return(new ErrorResponse(ErrorCode.MISS_PARAM, "Type parameter is empty (allowed: charinfo, charsave, charitem)"));
                }
            }
            catch (EndOfStreamException e3)
            {
                return(new ErrorResponse(ErrorCode.NOT_SUPPORTED, e3.Message, file.Name));
            }
            catch (Exception e3)
            {
                errorMessage += "\n\n" + e3.ToString();
            }
            return(new ErrorResponse(ErrorCode.BAD_DATA, "Bad file format. Only charinfo, charsave and charitem are allowed.", errorMessage));
        }
Пример #2
0
        public void ErrorOnTruncatedHeader()
        {
            var reader            = new StringReader("|MxDz;");
            var buildHeaderReader = new SaveReader(reader);
            var exception         = Assert.Throws <Exception>(() =>
            {
                var buildHeader = buildHeaderReader.Read();
            });

            Assert.Equal("The header was truncated", exception.Message);
        }
Пример #3
0
        public void ErrorOnInvalidStart()
        {
            var reader            = new StringReader("MxDz;");
            var buildHeaderReader = new SaveReader(reader);
            var exception         = Assert.Throws <Exception>(() =>
            {
                var buildHeader = buildHeaderReader.Read();
            });

            Assert.Equal("The header is missing", exception.Message);
        }
Пример #4
0
        public void CanRead()
        {
            var reader     = new StringReader("|MxDz;1442;655;1310;HEX;||78DA6594594F13511886CFA153A1A5A5AD2C652B500A94B5827A6FA28051694242D4CBA6916369D2B4E3748872E93F50D478E3020A2E37FE1FF7F8035C12C5E5AA7E9DF705899D74FACCBCE7DBE6FBCE4CF6C67CE8D5D99BA7946E3D53CA57ABB9D3CEBA6B5AB2EB6EDE2D56CA3E2547B39CBD9E9ECB9A9231999575DB38B915D731E582BB16C7D2BCB96ACA5593B95C2C95ECCA75E3A8F072A552CA2C160B6B6EB15C087A772BB631AB21EF72C9E46DD123FB37ABC6A9AE15ED9E05BB7825B350364E612397CD575DE36CA0AA6EA96354CE612D7FF553D5FC6A474A9CB354D32EF914B49E90DBE0912DF0B53AE4FB8B6B7B60CB0FF20F183C0ECEC4C52161A99440D357C72C6F2D142523605B1B1906A321F08D78F9E06BF99827CABC477F92ACA7E337F856ACFDF0D1FE4B1AB55C044735E652AFA5F91E7204EF821DB7C0AEDBE426D87D077C275E01C4F5053A11AFBB03ECFD8EDCBD17C031915B99A7B5DAE469FD0E590107AE9136385706B5141886AF0AD7E450EFE53AE2B5B0E68FF423C340021C1A2007C921309904D3E216A36F6C071992BBE0B167E47356F0927C017E10AF7676B2FD3E7D37419F54D9C96E747212294E20C5098D706296D8C6691B67E746D8B9912838D60E0E8B6D0F9E5EF74C29AC911F057D88D3D4C738638C93669C2EF14FD026419BF47F361382414E67F001A63BF1907C443E0627B7C86D3010E39B24D319664F3EF10DAB3FDF289F7992BD98666FA6B94B6352DF38EB1B677DD3AC6F86F58524C714734C31474AFC32D4327D8815176D96DAAC8FBBCB523C6AF2ABEF9EC90665B641996B504E3428271B9445EBE0AB505B6A585DB6B8288AF6944054DE6628B5CFC183AF82D23398EFD77F9AD6E7E5222D7BF31CF8E5B0FD38ECBF1DB6DFEF13F7E75F04F8E113|");
            var saveReader = new SaveReader(reader);
            var save       = saveReader.Read();

            Assert.NotNull(save);
            Assert.Equal("MxDz", save.Format);
            Assert.Equal(1442, save.CompressionData.UncompressedByteCount);
            Assert.Equal(655, save.CompressionData.CompressedByteCount);
            Assert.Equal(1310, save.CompressionData.EncodedByteCount);
            Assert.Equal("HEX", save.CompressionData.Encoding);
            Assert.Equal("78DA6594594F13511886CFA153A1A5A5AD2C652B500A94B5827A6FA28051694242D4CBA6916369D2B4E3748872E93F50D478E3020A2E37FE1FF7F8035C12C5E5AA7E9DF705899D74FACCBCE7DBE6FBCE4CF6C67CE8D5D99BA7946E3D53CA57ABB9D3CEBA6B5AB2EB6EDE2D56CA3E2547B39CBD9E9ECB9A9231999575DB38B915D731E582BB16C7D2BCB96ACA5593B95C2C95ECCA75E3A8F072A552CA2C160B6B6EB15C087A772BB631AB21EF72C9E46DD123FB37ABC6A9AE15ED9E05BB7825B350364E612397CD575DE36CA0AA6EA96354CE612D7FF553D5FC6A474A9CB354D32EF914B49E90DBE0912DF0B53AE4FB8B6B7B60CB0FF20F183C0ECEC4C52161A99440D357C72C6F2D142523605B1B1906A321F08D78F9E06BF99827CABC477F92ACA7E337F856ACFDF0D1FE4B1AB55C044735E652AFA5F91E7204EF821DB7C0AEDBE426D87D077C275E01C4F5053A11AFBB03ECFD8EDCBD17C031915B99A7B5DAE469FD0E590107AE9136385706B5141886AF0AD7E450EFE53AE2B5B0E68FF423C340021C1A2007C921309904D3E216A36F6C071992BBE0B167E47356F0927C017E10AF7676B2FD3E7D37419F54D9C96E747212294E20C5098D706296D8C6691B67E746D8B9912838D60E0E8B6D0F9E5EF74C29AC911F057D88D3D4C738638C93669C2EF14FD026419BF47F361382414E67F001A63BF1907C443E0627B7C86D3010E39B24D319664F3EF10DAB3FDF289F7992BD98666FA6B94B6352DF38EB1B677DD3AC6F86F58524C714734C31474AFC32D4327D8815176D96DAAC8FBBCB523C6AF2ABEF9EC90665B641996B504E3428271B9445EBE0AB505B6A585DB6B8288AF6944054DE6628B5CFC183AF82D23398EFD77F9AD6E7E5222D7BF31CF8E5B0FD38ECBF1DB6DFEF13F7E75F04F8E113", save.CompressionData.EncodedString);
        }
Пример #5
0
        public ActionResult <Response> Put([FromBody] object json)
        {
            var data     = json.ToString();
            var response = JsonConvert.DeserializeObject <CharacterResponse>(data);

            try
            {
                if (response.FileType == "charsave")
                {
                    // get json into object
                    var charsaveResponse = JsonConvert.DeserializeObject <CharSaveResponse>(data);

                    // load character data
                    var charsave = new SaveReader("1.13c");
                    charsave.Read(charsaveResponse.Data);

                    // replace stats and items from response
                    charsave = charsaveResponse.GetCharacter(charsave);
                    var ms = new MemoryStream(charsave.GetBytes(true)); // true is important!
                    return(File(ms, "application/octet-stream", charsave.Character.Name));
                }
                else if (response.FileType == "charitem")
                {
                    var charitemResponse = JsonConvert.DeserializeObject <CharItemResponse>(data);

                    // load item data
                    var charitem = Item.NewItem(charitemResponse.Data);

                    // replace item data from response
                    charitem = charitemResponse.GetItem(charitem);
                    var ms = new MemoryStream(charitem.GetItemBytes());
                    return(File(ms, "application/octet-stream", charitemResponse.DisplayData.Title));
                }
                else if (response.FileType == "charinfo")
                {
                    var charinfo = JsonConvert.DeserializeObject <CharInfo>(data);
                    var ms       = new MemoryStream(charinfo.GetBytes());
                    return(File(ms, "application/octet-stream", charinfo.Name));
                }
            }
            catch (Exception e)
            {
                return(new ErrorResponse(ErrorCode.BAD_DATA, e.Message, e.ToString()));
            }
            return(new ErrorResponse(ErrorCode.NOT_SUPPORTED, "Unsupported fileType. Use POST method to retrieve proper data structure."));
        }
Пример #6
0
        private void ProcessCharacter(byte[] rawCharacterBytes)
        {
            playerData = new SaveReader(comboBoxResourceSet.Text);

            playerData.Read(rawCharacterBytes);

            if (playerData.FailedCharacterDecoding)
            {
                MessageBox.Show("Failed character decoding");
            }
            if (playerData.FailedInventoryDecoding)
            {
                MessageBox.Show("Failed inventory decoding");
            }
            if (playerData.FailedSkillDecoding)
            {
                MessageBox.Show("Failed skill decoding");
            }

            if (playerData.Inventory.FailedItemCount > 0)
            {
                MessageBox.Show(string.Format("Failed to read {0} items. These items will not be included when saving character", playerData.Inventory.FailedItemCount));
            }

            listBoxInventory.Items.Clear();
            listBoxCorpseInventory.Items.Clear();
            listBoxGolemInventory.Items.Clear();
            listBoxMercInventory.Items.Clear();

            UpdateInventoryList();

            textBoxUnknownFlags.DataBindings.Clear();
            textBoxName.DataBindings.Clear();
            characterBindingSource.Clear();
            statBindingSource.Clear();
            itemBindingSource.Clear();
            dataGridViewItemProperties.DataSource         = null;
            dataGridViewItemRunewordProperties.DataSource = null;
            dataGridViewItemSetProperties.DataSource      = null;

            textBoxUnknownFlags.DataBindings.Add("Text", playerData.Character, "UnknownFlags");
            textBoxName.DataBindings.Add("Text", playerData.Character, "Name");

            characterBindingSource.Add(playerData.Character);
            statBindingSource.Add(playerData.Stat);
        }
Пример #7
0
        /// <summary>
        /// Process raw character bytes from save file
        /// </summary>
        /// <param name="rawCharacterbytes">Raw data from save file</param>
        private void ProcessCharacter(byte[] rawCharacterbytes)
        {
            ClearPlayerData();

            CharacterEditor.Resources.Instance.ResourceSet = (string)comboBoxResourceSets.SelectedItem;
            playerData = new SaveReader(comboBoxResourceSets.SelectedItem.ToString());

            try
            {
                playerData.Read(rawCharacterbytes);
            }
            catch (Exception ex)
            {
                new ErrorWindow("Unable to read character, most likely wrong version: " + ex.Message, true);
                return;
            }

            string errorString = "";

            if (playerData.FailedCharacterDecoding)
            {
                errorString += "Failed character decoding\n";
            }
            if (playerData.FailedInventoryDecoding)
            {
                errorString += "Failed inventory decoding";
            }
            if (playerData.FailedSkillDecoding)
            {
                errorString += "Failed skill decoding";
            }

            if (errorString.Length > 0)
            {
                ErrorWindow errorWindow = new ErrorWindow(errorString, true);
            }

            if (playerData.Inventory.FailedItemCount > 0)
            {
                new ErrorWindow(string.Format("Failed to read {0} items. These items will not be included when saving character", playerData.Inventory.FailedItemCount));
            }

            RefreshCharacter();
            RefreshInventory();
        }
Пример #8
0
        public void CanRead()
        {
            var reader     = new StringReader("|MxDz;1862;706;1412;HEX;||78DA6D944B6F125114C7676028E5551EA5D052A08516DA824550F726DAD6444BD284449784B4572041203334EAD2857B6DAD6E7CB43E125F71E56BE9EB4BA855E307B0F5191F9BF1C0BD70CE62260CF9CDFF9EFBBFE79E7367F267E69C8F8E9C3B28C98EC3B592A6150FA9AB2D66C997CAD565B3244976ED5449AB54976B4CB3C263A8335CCCB31A6399C26A93A9C5424B65F572AB12E44373EC24AB6B2C73A25AAB351BA7992AB9961A8D5A66A15AAEB4AAF5B2BDF3546832B6E2ECE0222B354177771F56980A0B367DF3CDEA7266BEA4B62AC57C496B31F5EC302490843B2EC35FFB96748BB40959E61459876B6A8BF04DC2B79053B79167EF20BF9588E74FD44DBF08FF4656FE12DE87DC1F049308E7776D4BEE699689671FF1EC239EFD7F9027609E59E463762AA8BB080F204FBA097B087B91DF839B857BCA9649A9A787092760BCDDE8F6BAD60B38D7791179608DF03AB2E712E10DE46D70B3893AD876708FF65DC2DF909DDF919330CFC1F3911C9A097B0149BA84EE3A8FFA0750DC9DA2EB8A3B8C3EE10872348A1C1B43CE8D93330316DECE81D0656F1AEBE323FC117090EF4B1ABC82399821B721B1DF21D2F700E97B80F47D98F45D81B9413137D836E9C6F89143C7C819F6A01E87B923A2BF2324CF10E14F80A33CC6344AFC53C42747D60A806744C447487C94C4447F603E33208F89F3337615CFC0F835C2D709DF408E6D12DE42F65AC53B0FFB8A931C26480E9F6134C1D7352748CD93A4E64952F324A9F93AE0349FAB4CDFC57567EE11BE4FF80172EA21F206F8A4799E4AFA05EA7B5E127E45F835F2EC1BE4CBE09311F9641EA3BEF709E1A7849F21E79E2307A16E59F18E64DB027F1314495C3AFCBA6ACA50CD1AAA394375BFA17AC0505D507A5F5B7DD13062491101A0CA3DD5E681AF2257F52FF6DED79544ECA26A9263D863DF713C2BFEA3C0539C770C5DBEA22ACBE4CDF6AF21FF0B008A3DFC07685F8D90|");
            var saveReader = new SaveReader(reader);
            var save       = saveReader.Read();

            Assert.NotNull(save);
            Assert.NotNull(save.CompressionData);

            using var stream       = new CompressionDataStream(save.CompressionData);
            using var binaryReader = new BinaryReader(stream);
            var characterReader = new CharacterReader(binaryReader);
            var character       = characterReader.Read();

            Assert.NotNull(character);
            Assert.NotNull(character.Archetype);
            Assert.NotNull(character.Name);
            Assert.Equal("smashicles", character.Name);

            Assert.Equal("Class_Brute", character.Archetype.ClassName);
            Assert.Equal("Brute", character.Archetype.DisplayName);
            Assert.Equal <object>(SchemaVersion.v1_1_0, character.Version);
            Assert.True(character.UseSubpowerFields);
            Assert.False(character.UseQualifiedNames);

            Assert.NotNull(character.Builds);
            Assert.Single(character.Builds);

            foreach (var build in character.Builds)
            {
                Assert.NotNull(build.PowerSlots);
                Assert.Equal(39, build.PowerSlots.Count);

                Assert.NotNull(build.PowerSets);
                Assert.Equal(8, build.PowerSets.Count);
                Assert.Equal(23, build.LastPower);
            }
        }
Пример #9
0
        private static void BatchConvertToD2s(string path, string resourceSet)
        {
            string convertedSavePath = path + "\\d2s\\";

            string[] fileNames = Directory.GetFiles(path);

            if (!Directory.Exists(convertedSavePath))
            {
                Directory.CreateDirectory(convertedSavePath);
            }
            for (int i = 0; i < fileNames.Length; i++)
            {
                SaveReader currentSave = new SaveReader(resourceSet);

                try
                {
                    currentSave.Read(File.ReadAllBytes(fileNames[i]));
                    if (currentSave.Character.UnknownFlags != 64)
                    {
                        Console.WriteLine("Flags = {0}", currentSave.Character.UnknownFlags);
                    }
                    currentSave.Character.UnknownFlags = 0;

                    string savePath = convertedSavePath + Path.GetFileNameWithoutExtension(fileNames[i]) + ".d2s";

                    using (FileStream saveStream = File.OpenWrite(savePath))
                    {
                        currentSave.Write(saveStream, false);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Failed to convert {0}: {1}", fileNames[i], ex.Message);
                }
            }
        }
Пример #10
0
        private static void TestAllFiles(string path, string resourceSet, bool detectDuplicateIds, bool detectFlaggedItems, bool detectFlaggedProperties, string flaggedItemsPath, string flaggedPropertiesPath)
        {
            string invalidSavePath   = path + "\\invalid\\";
            string invalidItemPath   = path + "\\baditems\\";
            string invalidPropsPath  = path + "\\badprops\\";
            string invalidDecodePath = path + "\\undecoded\\";

            string[] fileNames = Directory.GetFiles(path);

            List <string> invlaidSaves       = new List <string>();
            List <string> invalidItemSaves   = new List <string>();
            List <string> invalidPropsSaves  = new List <string>();
            List <string> invalidDecodeSaves = new List <string>();

            Dictionary <uint, List <ItemData> >   itemIds = new Dictionary <uint, List <ItemData> >();
            Dictionary <string, List <ItemData> > detectedFlaggedItems = new Dictionary <string, List <ItemData> >();
            Dictionary <string, List <ItemData> > detectedFlaggedProps = new Dictionary <string, List <ItemData> >();

            HashSet <string> flaggedItems = null;
            Dictionary <string, ItemPropData> flaggedProperties = null;

            if (detectFlaggedItems)
            {
                try
                {
                    flaggedItems = ReadFlaggedItemList(flaggedItemsPath);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Failed to read " + flaggedItemsPath + ": " + ex.Message);
                    sw.Close();
                    return;
                }
            }
            if (detectFlaggedProperties)
            {
                try
                {
                    flaggedProperties = ReadFlaggedPropertyList(flaggedPropertiesPath);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Failed to read " + flaggedPropertiesPath + ": " + ex.Message);
                    return;
                }
            }

            for (int i = 0; i < fileNames.Length; i++)
            {
                SaveReader currentSave = new SaveReader(resourceSet);

                try
                {
                    currentSave.Read(File.ReadAllBytes(fileNames[i]));

                    foreach (var item in currentSave.Inventory.PlayerItems)
                    {
                        if (detectDuplicateIds)
                        {
                            if (!itemIds.ContainsKey(item.Id))
                            {
                                itemIds[item.Id] = new List <ItemData>();
                            }

                            itemIds[item.Id].Add(new ItemData()
                            {
                                FileName = fileNames[i], Item = item
                            });
                        }
                        if (detectFlaggedItems)
                        {
                            if (flaggedItems.Contains(item.ItemCode))
                            {
                                if (!detectedFlaggedItems.ContainsKey(item.ItemCode))
                                {
                                    detectedFlaggedItems[item.ItemCode] = new List <ItemData>();
                                }

                                detectedFlaggedItems[item.ItemCode].Add(new ItemData()
                                {
                                    FileName = fileNames[i], Item = item
                                });
                            }
                        }
                        if (detectFlaggedProperties)
                        {
                            foreach (var prop in item.Properties)
                            {
                                if (flaggedProperties.ContainsKey(prop.PropertyName))
                                {
                                    if (flaggedProperties[prop.PropertyName].TestValue(prop.Value))
                                    {
                                        if (!detectedFlaggedProps.ContainsKey(prop.PropertyName))
                                        {
                                            detectedFlaggedProps[prop.PropertyName] = new List <ItemData>();
                                        }

                                        detectedFlaggedProps[prop.PropertyName].Add(new ItemData()
                                        {
                                            FileName = fileNames[i], Item = item
                                        });
                                    }
                                }
                            }
                        }
                    }
                }
                catch (IndexOutOfRangeException)
                {
                    invlaidSaves.Add(fileNames[i]);
                    continue;
                }
                catch (KeyNotFoundException)
                {
                    invalidPropsSaves.Add(fileNames[i]);
                    continue;
                }
                catch (Exception)
                {
                    invlaidSaves.Add(fileNames[i]);
                    continue;
                }

                if (currentSave != null)
                {
                    DumpCharacterData(currentSave);
                    if (currentSave.Inventory.FailedItemCount > 0)
                    {
                        invalidItemSaves.Add(fileNames[i]);
                    }
                    else if (currentSave.FailedCharacterDecoding || currentSave.FailedInventoryDecoding || currentSave.FailedSkillDecoding)
                    {
                        invalidDecodeSaves.Add(fileNames[i]);
                    }
                }

                if (i % 100 == 0)
                {
                    Console.Write("\r");
                    Console.Write(string.Format("Progress: {0,7:0.00%}", i / (double)fileNames.Length));
                }
            }
            Console.Write("\r");
            Console.Write(string.Format("Progress: {0,7:0.00%}", 1.0));
            Console.WriteLine();

            MoveInvalidSaves(invlaidSaves, invalidSavePath);
            MoveInvalidSaves(invalidItemSaves, invalidItemPath);
            MoveInvalidSaves(invalidPropsSaves, invalidPropsPath);
            MoveInvalidSaves(invalidDecodeSaves, invalidDecodePath);

            if (detectDuplicateIds)
            {
                Console.WriteLine();
                Console.WriteLine("Searching for duplicate ids:");
                Console.WriteLine();
                var dupes = (from n in itemIds where n.Key > 0 && n.Value.Count > 1 select n).ToList();

                foreach (var item in dupes)
                {
                    Console.WriteLine("Item {0} - {1}:", item.Key, CharacterEditor.ItemDefs.GetItemDescription(item.Value[0].Item.ItemCode));
                    foreach (var dupe in item.Value)
                    {
                        Console.WriteLine("\t{0}", dupe.FileName);
                    }
                    Console.WriteLine();
                }
            }

            if (detectFlaggedItems)
            {
                Console.WriteLine();
                Console.WriteLine("Flagged items detected:");
                Console.WriteLine();
                foreach (var item in detectedFlaggedItems)
                {
                    Console.WriteLine("Item {0} - {1}:", item.Key, CharacterEditor.ItemDefs.GetItemDescription(item.Key));
                    foreach (var dupe in item.Value)
                    {
                        Console.WriteLine("\t{0}", dupe.FileName);
                    }
                    Console.WriteLine();
                }
            }

            if (detectFlaggedProperties)
            {
                Console.WriteLine();
                Console.WriteLine("Flagged item properties detected:");
                Console.WriteLine();
                foreach (var item in detectedFlaggedProps)
                {
                    Console.WriteLine("Property {0}:", flaggedProperties[item.Key]);
                    foreach (var flagged in item.Value)
                    {
                        Console.Write("\t{0} -> ", flagged.FileName);
                        foreach (var prop in flagged.Item.Properties)
                        {
                            if (prop.PropertyName == item.Key)
                            {
                                Console.WriteLine("[n = {0}] {1}", prop.Value, flagged.Item);
                                break;
                            }
                        }
                    }
                    Console.WriteLine();
                }
            }
        }