fix: Fixes reading prof.txt (#1745)

### Summary
* Fixes reading the professions file.
This commit is contained in:
Kamron Batman 2024-04-27 19:10:37 -07:00 committed by GitHub
parent c4fbc6b88e
commit d23d92d278
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2,65 +2,88 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
namespace Server namespace Server;
public class ProfessionInfo
{ {
public class ProfessionInfo public static ProfessionInfo[] Professions { get; }
private static bool TryGetSkillName(string name, out SkillName skillName)
{ {
public static ProfessionInfo[] Professions { get; } if (Enum.TryParse(name, out skillName))
private static bool TryGetSkillName(string name, out SkillName skillName)
{ {
if (Enum.TryParse(name, out skillName)) return true;
{
return true;
}
var lowerName = name?.ToLowerInvariant().RemoveOrdinal(" ");
if (!string.IsNullOrEmpty(lowerName))
{
foreach (var so in SkillInfo.Table)
{
if (lowerName == so.ProfessionSkillName.ToLowerInvariant())
{
skillName = (SkillName)so.SkillID;
return true;
}
}
}
return false;
} }
static ProfessionInfo() var lowerName = name?.ToLowerInvariant().RemoveOrdinal(" ");
if (!string.IsNullOrEmpty(lowerName))
{ {
var profs = new List<ProfessionInfo> foreach (var so in SkillInfo.Table)
{ {
new() if (lowerName == so.ProfessionSkillName.ToLowerInvariant())
{ {
ID = 0, // Custom skillName = (SkillName)so.SkillID;
Name = "Advanced", return true;
TopLevel = false,
GumpID = 5571
} }
};
var file = Core.FindDataFile("prof.txt", false);
if (!File.Exists(file))
{
var parent = Path.Combine(Core.BaseDirectory, "Data/Professions");
file = Path.Combine(ExpansionInfo.GetEraFolder(parent), "prof.txt");
} }
}
var maxProf = 0; return false;
}
if (File.Exists(file)) static ProfessionInfo()
{
var profs = new List<ProfessionInfo>
{
new()
{ {
using var s = File.OpenText(file); ID = 0, // Custom
Name = "Advanced",
TopLevel = false,
GumpID = 5571
}
};
var file = Core.FindDataFile("prof.txt", false);
if (!File.Exists(file))
{
var parent = Path.Combine(Core.BaseDirectory, "Data/Professions");
file = Path.Combine(ExpansionInfo.GetEraFolder(parent), "prof.txt");
}
var maxProf = 0;
if (File.Exists(file))
{
using var s = File.OpenText(file);
while (!s.EndOfStream)
{
var line = s.ReadLine();
if (string.IsNullOrWhiteSpace(line))
{
continue;
}
line = line.Trim();
if (!line.InsensitiveStartsWith("Begin"))
{
continue;
}
var prof = new ProfessionInfo();
var statIndex = 0;
var totalStats = 0;
var skillIndex = 0;
var totalSkill = 0;
while (!s.EndOfStream) while (!s.EndOfStream)
{ {
var line = s.ReadLine(); line = s.ReadLine();
if (string.IsNullOrWhiteSpace(line)) if (string.IsNullOrWhiteSpace(line))
{ {
@ -69,139 +92,135 @@ namespace Server
line = line.Trim(); line = line.Trim();
if (!line.InsensitiveStartsWith("Begin")) if (line.InsensitiveStartsWith("End"))
{ {
continue; if (prof.ID > 0 && totalStats >= 80 && totalSkill >= 100)
{
prof.FixSkills(); // Adjust skills array in case there are fewer skills than the default 4
profs.Add(prof);
}
break;
} }
var prof = new ProfessionInfo(); var cols = line.Split('\t', StringSplitOptions.RemoveEmptyEntries);
var key = cols[0].ToLowerInvariant();
var value = cols[1].Trim('"');
int stats; if (key == "type" && !value.InsensitiveEquals("profession"))
int valid;
var skills = stats = valid = 0;
while (!s.EndOfStream)
{ {
line = s.ReadLine(); break;
}
if (string.IsNullOrWhiteSpace(line)) switch (key)
{ {
continue; case "truename":
}
line = line.Trim();
if (line.InsensitiveStartsWith("End"))
{
if (valid >= 4)
{ {
profs.Add(prof); prof.Name = value;
} }
break; break;
} case "nameid":
{
var cols = line.Split('\t', StringSplitOptions.RemoveEmptyEntries);
var key = cols[0].ToLowerInvariant();
var value = cols[1].Trim('"');
if (key == "type" && !value.InsensitiveEquals("profession"))
{
break;
}
switch (key)
{
case "truename":
{
prof.Name = value;
++valid;
}
break;
case "nameid":
prof.NameID = Utility.ToInt32(value); prof.NameID = Utility.ToInt32(value);
break; break;
case "descid": }
case "descid":
{
prof.DescID = Utility.ToInt32(value); prof.DescID = Utility.ToInt32(value);
break; break;
case "desc": }
case "desc":
{
prof.ID = Utility.ToInt32(value);
if (prof.ID > maxProf)
{ {
prof.ID = Utility.ToInt32(value); maxProf = prof.ID;
if (prof.ID > maxProf)
{
maxProf = prof.ID;
}
++valid;
} }
break; }
case "toplevel": break;
case "toplevel":
{
prof.TopLevel = Utility.ToBoolean(value); prof.TopLevel = Utility.ToBoolean(value);
break; break;
case "gump": }
case "gump":
{
prof.GumpID = Utility.ToInt32(value); prof.GumpID = Utility.ToInt32(value);
break; break;
case "skill": }
case "skill":
{
if (!TryGetSkillName(value, out var skillName))
{ {
if (!TryGetSkillName(value, out var skillName)) break;
{
break;
}
prof.Skills[skills++] = new SkillNameValue(skillName, Utility.ToInt32(cols[2]));
if (skills == prof.Skills.Length)
{
++valid;
}
} }
break;
case "stat": var skillValue = Utility.ToInt32(cols[2]);
prof.Skills[skillIndex++] = new SkillNameValue(skillName, skillValue);
totalSkill += skillValue;
}
break;
case "stat":
{
if (!Enum.TryParse(value, out StatType stat))
{ {
if (!Enum.TryParse(value, out StatType stat)) break;
{
break;
}
prof.Stats[stats++] = new StatNameValue(stat, Utility.ToInt32(cols[2]));
if (stats == prof.Stats.Length)
{
++valid;
}
} }
break;
} var statValue = Utility.ToInt32(cols[2]);
prof.Stats[statIndex++] = new StatNameValue(stat, statValue);
totalStats += statValue;
}
break;
} }
} }
} }
}
Professions = new ProfessionInfo[1 + maxProf]; Professions = new ProfessionInfo[1 + maxProf];
foreach (var p in profs) foreach (var p in profs)
{
Professions[p.ID] = p;
}
profs.Clear();
profs.TrimExcess();
}
private SkillNameValue[] _skills;
private ProfessionInfo()
{
Name = string.Empty;
_skills = new SkillNameValue[4];
Stats = new StatNameValue[3];
}
public int ID { get; private set; }
public string Name { get; private set; }
public int NameID { get; private set; }
public int DescID { get; private set; }
public bool TopLevel { get; private set; }
public int GumpID { get; private set; }
public SkillNameValue[] Skills => _skills;
public StatNameValue[] Stats { get; }
public void FixSkills()
{
var index = _skills.Length - 1;
while (index >= 0)
{
var skill = _skills[index];
if (skill is not { Name: SkillName.Alchemy, Value: 0 })
{ {
Professions[p.ID] = p; break;
} }
profs.Clear(); index--;
profs.TrimExcess();
} }
private ProfessionInfo() Array.Resize(ref _skills, index + 1);
{
Name = string.Empty;
Skills = new SkillNameValue[4];
Stats = new StatNameValue[3];
}
public int ID { get; private set; }
public string Name { get; private set; }
public int NameID { get; private set; }
public int DescID { get; private set; }
public bool TopLevel { get; private set; }
public int GumpID { get; private set; }
public SkillNameValue[] Skills { get; }
public StatNameValue[] Stats { get; }
} }
} }