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)); }
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); }
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); }
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); }
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.")); }
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); }
/// <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(); }
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); } }
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); } } }
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(); } } }