151 lines
3.0 KiB
C#
151 lines
3.0 KiB
C#
#region References
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
#endregion
|
|
|
|
namespace Ultima
|
|
{
|
|
public sealed class SkillGroup
|
|
{
|
|
public string Name { get; set; }
|
|
|
|
public SkillGroup(string name)
|
|
{
|
|
Name = name;
|
|
}
|
|
}
|
|
|
|
public sealed class SkillGroups
|
|
{
|
|
public static List<SkillGroup> List { get; private set; }
|
|
public static List<int> SkillList { get; private set; }
|
|
private static bool unicode;
|
|
|
|
static SkillGroups()
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
public static void Initialize()
|
|
{
|
|
string path = Files.GetFilePath("skillgrp.mul");
|
|
|
|
List = new List<SkillGroup>();
|
|
SkillList = new List<int>();
|
|
|
|
if (path != null)
|
|
{
|
|
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
|
|
{
|
|
using (var bin = new BinaryReader(fs))
|
|
{
|
|
int start = 4;
|
|
int strlen = 17;
|
|
int count = bin.ReadInt32();
|
|
if (count == -1)
|
|
{
|
|
unicode = true;
|
|
count = bin.ReadInt32();
|
|
start *= 2;
|
|
strlen *= 2;
|
|
}
|
|
|
|
List.Add(new SkillGroup("Misc"));
|
|
for (int i = 0; i < count - 1; ++i)
|
|
{
|
|
int strbuild;
|
|
fs.Seek((start + (i * strlen)), SeekOrigin.Begin);
|
|
var builder2 = new StringBuilder(17);
|
|
if (unicode)
|
|
{
|
|
while ((strbuild = bin.ReadInt16()) != 0)
|
|
{
|
|
builder2.Append((char)strbuild);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while ((strbuild = bin.ReadByte()) != 0)
|
|
{
|
|
builder2.Append((char)strbuild);
|
|
}
|
|
}
|
|
List.Add(new SkillGroup(builder2.ToString()));
|
|
}
|
|
fs.Seek((start + ((count - 1) * strlen)), SeekOrigin.Begin);
|
|
try
|
|
{
|
|
while (bin.BaseStream.Length != bin.BaseStream.Position)
|
|
{
|
|
SkillList.Add(bin.ReadInt32());
|
|
}
|
|
}
|
|
catch // just for safety
|
|
{ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void Save(string path)
|
|
{
|
|
string mul = Path.Combine(path, "skillgrp.mul");
|
|
using (var fs = new FileStream(mul, FileMode.Create, FileAccess.Write, FileShare.Write))
|
|
{
|
|
using (var bin = new BinaryWriter(fs))
|
|
{
|
|
if (unicode)
|
|
{
|
|
bin.Write(-1);
|
|
}
|
|
bin.Write(List.Count);
|
|
|
|
foreach (SkillGroup group in List)
|
|
{
|
|
if (group.Name == "Misc")
|
|
{
|
|
continue;
|
|
}
|
|
byte[] name;
|
|
if (unicode)
|
|
{
|
|
name = new byte[34];
|
|
}
|
|
else
|
|
{
|
|
name = new byte[17];
|
|
}
|
|
if (group.Name != null)
|
|
{
|
|
if (unicode)
|
|
{
|
|
byte[] bb = Encoding.Unicode.GetBytes(group.Name);
|
|
if (bb.Length > 34)
|
|
{
|
|
Array.Resize(ref bb, 34);
|
|
}
|
|
bb.CopyTo(name, 0);
|
|
}
|
|
else
|
|
{
|
|
byte[] bb = Encoding.Default.GetBytes(group.Name);
|
|
if (bb.Length > 17)
|
|
{
|
|
Array.Resize(ref bb, 17);
|
|
}
|
|
bb.CopyTo(name, 0);
|
|
}
|
|
}
|
|
bin.Write(name);
|
|
}
|
|
foreach (int group in SkillList)
|
|
{
|
|
bin.Write(group);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |