server-master/srcs/_plugins/Plugin.ResourceLoader/Loaders/ActDescResourceFileLoader.cs
2026-02-10 18:21:30 +01:00

70 lines
No EOL
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using PhoenixLib.Logging;
using WingsAPI.Data.ActDesc;
using WingsAPI.Data.GameData;
namespace Plugin.ResourceLoader.Loaders
{
public class ActDescResourceFileLoader : IResourceLoader<ActDescDTO>
{
private readonly ResourceLoadingConfiguration _configuration;
public ActDescResourceFileLoader(ResourceLoadingConfiguration configuration) => _configuration = configuration;
public async Task<IReadOnlyList<ActDescDTO>> LoadAsync()
{
string filePath = Path.Combine(_configuration.GameDataPath, "act_desc.dat");
if (!File.Exists(filePath))
{
throw new FileNotFoundException($"{filePath} should be present");
}
var actDescDatas = new List<ActDescDTO>();
var actNames = new Dictionary<byte, string>();
using var actDescStream = new StreamReader(filePath, Encoding.GetEncoding(1252));
string line;
char[] splits = { ' ', '\t' };
while ((line = actDescStream.ReadLine()) != null)
{
string[] currentLine = line.Split(splits, StringSplitOptions.RemoveEmptyEntries);
if (currentLine[0] != "Data" && currentLine[0] != "A")
{
continue;
}
if (currentLine[0] == "Data")
{
var dto = new ActDescDTO
{
Act = byte.Parse(currentLine[2]),
SubAct = byte.Parse(currentLine[3]),
TsAmount = byte.Parse(currentLine[4])
};
actDescDatas.Add(dto);
}
if (currentLine[0] == "A")
{
actNames.TryAdd(byte.Parse(currentLine[1]), currentLine[2]);
}
}
foreach (ActDescDTO actDescDto in actDescDatas)
{
actDescDto.ActName = actNames.GetValueOrDefault(actDescDto.Act);
}
Log.Info($"[RESOURCE_LOADER] {actDescDatas.Count.ToString()} act desc loaded");
return actDescDatas;
}
}
}