Skip to content

Commit

Permalink
allow reading custom txt
Browse files Browse the repository at this point in the history
  • Loading branch information
dschu012 committed Apr 24, 2021
1 parent 7539bad commit ee3073c
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 26 deletions.
13 changes: 13 additions & 0 deletions src/Core.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,19 @@ namespace D2SLib
{
public class Core
{
private static TXT _TXT = null;
public static TXT TXT
{
get
{
return _TXT ?? ResourceFilesTXT.Instance.TXT;
}
set
{
_TXT = value;
}
}

public static D2S ReadD2S(string path)
{
return D2S.Read(File.ReadAllBytes(path));
Expand Down
3 changes: 3 additions & 0 deletions src/D2SLib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
<PackageTags>d2s d2i diablo-ii diablo2 d2r</PackageTags>
<Description>Read and write saves from Diablo 2. Supports versions 1.10 through Diablo II: Resurrected (1.15). Supports both d2s (player saves) and d2i (shared stash).</Description>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<RepositoryUrl>https://github.com/dschu012/D2SLib</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<Version>1.0.1</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions src/Model/Save/Attributes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class Attributes

public static Attributes Read(BitReader reader)
{
ItemStatCostTXT itemStatCost = ResourceFilesTXT.Instance.TXT.ItemStatCost;
ItemStatCostTXT itemStatCost = Core.TXT.ItemStatCostTXT;
Attributes attributes = new Attributes();
attributes.Header = reader.ReadUInt16();
UInt16 id = reader.ReadUInt16(9);
Expand All @@ -37,7 +37,7 @@ public static byte[] Write(Attributes attributes)
{
using (BitWriter writer = new BitWriter())
{
ItemStatCostTXT itemStatCost = ResourceFilesTXT.Instance.TXT.ItemStatCost;
ItemStatCostTXT itemStatCost = Core.TXT.ItemStatCostTXT;
writer.WriteUInt16(attributes.Header ?? (UInt16)0x6667);
foreach (var entry in attributes.Stats)
{
Expand Down
26 changes: 13 additions & 13 deletions src/Model/Save/Items.cs
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ protected static void ReadCompact(BitReader reader, Item item, UInt32 version)
{
for(int i = 0; i < 4; i++)
{
item.Code += ResourceFilesTXT.Instance.TXT.ItemsTXT.ItemCodeTree.DecodeChar(reader);
item.Code += Core.TXT.ItemsTXT.ItemCodeTree.DecodeChar(reader);
}
}
item.NumberOfSocketedItems = reader.ReadByte(item.IsCompact ? 1 : 3);
Expand Down Expand Up @@ -295,7 +295,7 @@ protected static void WriteCompact(BitWriter writer, Item item, UInt32 version)
{
for (int i = 0; i < 4; i++)
{
BitArray bits = ResourceFilesTXT.Instance.TXT.ItemsTXT.ItemCodeTree.EncodeChar((char)code[i]);
BitArray bits = Core.TXT.ItemsTXT.ItemCodeTree.EncodeChar((char)code[i]);
foreach (var bit in bits.Cast<bool>())
{
writer.WriteBit(bit);
Expand Down Expand Up @@ -374,10 +374,10 @@ protected static void ReadComplete(BitReader reader, Item item, UInt32 version)
{
reader.ReadBits(96);
}
ItemStatCostTXT itemStatCostTXT = ResourceFilesTXT.Instance.TXT.ItemStatCost;
TXTRow row = ResourceFilesTXT.Instance.TXT.ItemsTXT.GetByCode(item.Code);
bool isArmor = ResourceFilesTXT.Instance.TXT.ItemsTXT.IsArmor(item.Code);
bool isWeapon = ResourceFilesTXT.Instance.TXT.ItemsTXT.IsWeapon(item.Code);
ItemStatCostTXT itemStatCostTXT = Core.TXT.ItemStatCostTXT;
TXTRow row = Core.TXT.ItemsTXT.GetByCode(item.Code);
bool isArmor = Core.TXT.ItemsTXT.IsArmor(item.Code);
bool isWeapon = Core.TXT.ItemsTXT.IsWeapon(item.Code);
bool isStackable = row["stackable"].ToBool();
if (isArmor)
{
Expand Down Expand Up @@ -492,10 +492,10 @@ protected static void WriteComplete(BitWriter writer, Item item, UInt32 version)
{
//todo 96 bits
}
ItemStatCostTXT itemStatCostTXT = ResourceFilesTXT.Instance.TXT.ItemStatCost;
TXTRow row = ResourceFilesTXT.Instance.TXT.ItemsTXT.GetByCode(item.Code);
bool isArmor = ResourceFilesTXT.Instance.TXT.ItemsTXT.IsArmor(item.Code);
bool isWeapon = ResourceFilesTXT.Instance.TXT.ItemsTXT.IsWeapon(item.Code);
ItemStatCostTXT itemStatCostTXT = Core.TXT.ItemStatCostTXT;
TXTRow row = Core.TXT.ItemsTXT.GetByCode(item.Code);
bool isArmor = Core.TXT.ItemsTXT.IsArmor(item.Code);
bool isWeapon = Core.TXT.ItemsTXT.IsWeapon(item.Code);
bool isStackable = row["stackable"].ToBool();
if (isArmor)
{
Expand Down Expand Up @@ -614,7 +614,7 @@ public class ItemStat
public static ItemStat Read(BitReader reader, UInt16 id)
{
ItemStat itemStat = new ItemStat();
TXTRow property = ResourceFilesTXT.Instance.TXT.ItemStatCost[id];
TXTRow property = Core.TXT.ItemStatCostTXT[id];
if (property == null)
{
throw new Exception($"No ItemStatCost record found for id: {id} at bit {reader.Position - 9}");
Expand Down Expand Up @@ -728,11 +728,11 @@ public static TXTRow GetStatRow(ItemStat stat)
{
if (stat.Id != null)
{
return ResourceFilesTXT.Instance.TXT.ItemStatCost[(UInt16)stat.Id];
return Core.TXT.ItemStatCostTXT[(UInt16)stat.Id];
}
else
{
return ResourceFilesTXT.Instance.TXT.ItemStatCost[(string)stat.Stat];
return Core.TXT.ItemStatCostTXT[(string)stat.Stat];
}
}

Expand Down
25 changes: 21 additions & 4 deletions src/Model/TXT/ItemsTXT.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,23 @@ public class ItemsTXT
public ArmorTXT ArmorTXT {get; set;}
public WeaponsTXT WeaponsTXT { get; set; }
public MiscTXT MiscTXT { get; set; }
public HuffmanTree ItemCodeTree { get; set; }

private HuffmanTree _ItemCodeTree = null;
public HuffmanTree ItemCodeTree
{
get
{
if(_ItemCodeTree == null)
{
_ItemCodeTree = InitializeHuffmanTree();
}
return _ItemCodeTree;
}
set
{
_ItemCodeTree = value;
}
}

public TXTRow this[string i] => this.GetByCode(i);

Expand All @@ -40,7 +56,7 @@ public bool IsMisc(string code)
return MiscTXT[code] != null;
}

public void InitializeHuffmanTree()
private HuffmanTree InitializeHuffmanTree()
{
/*
List<string> items = new List<string>();
Expand All @@ -57,8 +73,9 @@ public void InitializeHuffmanTree()
items.Add(row["code"]);
}
*/
ItemCodeTree = new HuffmanTree();
ItemCodeTree.Build(new List<string>());
var itemCodeTree = new HuffmanTree();
itemCodeTree.Build(new List<string>());
return itemCodeTree;
}

}
Expand Down
5 changes: 1 addition & 4 deletions src/ResourceFilesTXT.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@ private static ResourceFilesTXT Init()
ResourceFilesTXT resourceFilesTXT = new ResourceFilesTXT();
resourceFilesTXT.TXT = new TXT();
using(Stream s = GetResource("ItemStatCost.txt")) {
resourceFilesTXT.TXT.ItemStatCost = ItemStatCostTXT.Read(s);
resourceFilesTXT.TXT.ItemStatCostTXT = ItemStatCostTXT.Read(s);
}
resourceFilesTXT.TXT.ItemsTXT = new ItemsTXT();
using (Stream s = GetResource("Armor.txt"))
{
resourceFilesTXT.TXT.ItemsTXT.ArmorTXT = ArmorTXT.Read(s);
Expand All @@ -34,8 +33,6 @@ private static ResourceFilesTXT Init()
{
resourceFilesTXT.TXT.ItemsTXT.MiscTXT = MiscTXT.Read(s);
}
resourceFilesTXT.TXT.ItemsTXT.InitializeHuffmanTree();

return resourceFilesTXT;
}

Expand Down
19 changes: 17 additions & 2 deletions src/TXT.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,22 @@ namespace D2SLib
{
public class TXT
{
public ItemStatCostTXT ItemStatCost { get; set; }
public ItemsTXT ItemsTXT { get; set; }
public ItemStatCostTXT ItemStatCostTXT { get; set; }
private ItemsTXT _ItemsTXT = null;
public ItemsTXT ItemsTXT
{
get
{
if(_ItemsTXT == null)
{
_ItemsTXT = new ItemsTXT();
}
return _ItemsTXT;
}
set
{
_ItemsTXT = value;
}
}
}
}
3 changes: 2 additions & 1 deletion test/D2STest.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using D2SLib;
using D2SLib.Model.Save;
using D2SLib.Model.TXT;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.IO;
Expand All @@ -22,7 +23,6 @@ public void VerifyCanReadSimple115Save()
public void VerifyCanReadComplex115Save()
{
D2S character = Core.ReadD2S(File.ReadAllBytes(@"Resources\D2S\1.15\DannyIsGreat.d2s"));
character.ClassSkills.Skills.ForEach(skill => skill.Points = 20);
Assert.IsTrue(character.Name == "DannyIsGreat");
Assert.IsTrue(character.ClassId == 0x1);
/*
Expand All @@ -44,5 +44,6 @@ public void VerifyCanWriteComplex115Save()
//File.WriteAllBytes(Environment.ExpandEnvironmentVariables($"%userprofile%/Saved Games/Diablo II Resurrected Tech Alpha/{character.Name}.d2s"), ret);
Assert.IsTrue(input.Length == ret.Length);
}

}
}

0 comments on commit ee3073c

Please sign in to comment.