#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 List { get; private set; } public static List SkillList { get; private set; } private static bool unicode; static SkillGroups() { Initialize(); } public static void Initialize() { string path = Files.GetFilePath("skillgrp.mul"); List = new List(); SkillList = new List(); 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); } } } } } }