710 lines
32 KiB
C#
710 lines
32 KiB
C#
|
using FLCompanionByDvurechensky.Data;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Diagnostics;
|
|||
|
using System.Globalization;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using System.Windows.Forms;
|
|||
|
|
|||
|
namespace FLCompanionByDvurechensky.Services
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Сервис глобальной работы системы
|
|||
|
/// </summary>
|
|||
|
public class SystemService
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Все данные системы
|
|||
|
/// </summary>
|
|||
|
public Dictionary<string, UniverseSystem> UniverseSystemsData { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// Список баз
|
|||
|
/// </summary>
|
|||
|
public Dictionary<string, UniverseBase> UniverseBasesData { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// ID Систнем
|
|||
|
/// </summary>
|
|||
|
public List<string> SystemsID { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// Список предметов в игре
|
|||
|
/// </summary>
|
|||
|
public List<Equipment> Equipments { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// ID системы - Список зон добычи ископаемых
|
|||
|
/// </summary>
|
|||
|
public Dictionary<string, List<LootableZone>> SysAsteroids { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// ID - Name системы
|
|||
|
/// </summary>
|
|||
|
public Dictionary<string, string> SystemNamesID { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// Name - Id систем
|
|||
|
/// </summary>
|
|||
|
public Dictionary<string, string> SystemsNameId { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// Cписок контейнеров
|
|||
|
/// </summary>
|
|||
|
public List<Loadout> Loadouts { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// Список путей от систем до систем
|
|||
|
/// </summary>
|
|||
|
public List<string> HollRoads { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// Массив очищенных айдишников систем для ComboBox
|
|||
|
/// </summary>
|
|||
|
public string[] ArraySystemsCombobox { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// Обрабатывать русские наименования в алгоритмах
|
|||
|
/// </summary>
|
|||
|
public bool IsRussian { get; set; }
|
|||
|
|
|||
|
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
|
|||
|
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);
|
|||
|
|
|||
|
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
|||
|
private static extern int LoadString(IntPtr hInstance, int ID, StringBuilder lpBuffer, int nBufferMax);
|
|||
|
|
|||
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|||
|
private static extern bool FreeLibrary(IntPtr hModule);
|
|||
|
private LogService LogService { get; set; }
|
|||
|
private string BaseId { get; set; }
|
|||
|
private string SystemID { get; set; }
|
|||
|
private int SurptiseNick_ID { get; set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Конструктор
|
|||
|
/// </summary>
|
|||
|
/// <param name="isRussian">использование русского языка(TODO: по умолчанию только он)</param>
|
|||
|
/// <param name="logService">экземпляр сервиса логирования</param>
|
|||
|
public SystemService(bool isRussian, LogService logService)
|
|||
|
{
|
|||
|
UniverseSystemsData = new Dictionary<string, UniverseSystem>();
|
|||
|
UniverseBasesData = new Dictionary<string, UniverseBase>();
|
|||
|
SystemNamesID = new Dictionary<string, string>();
|
|||
|
SystemsNameId = new Dictionary<string, string>();
|
|||
|
SysAsteroids = new Dictionary<string, List<LootableZone>>();
|
|||
|
Equipments = new List<Equipment>();
|
|||
|
SystemsID = new List<string>();
|
|||
|
Loadouts = new List<Loadout>();
|
|||
|
HollRoads = new List<string>();
|
|||
|
IsRussian = isRussian;
|
|||
|
LogService = logService;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получение и обработка информации
|
|||
|
/// </summary>
|
|||
|
/// <param name="systems">Список систем</param>
|
|||
|
/// <param name="roadStart">Выбор пути старта</param>
|
|||
|
/// <param name="roadStop">Выбор точки остановки</param>
|
|||
|
/// <param name="equipments">Выбор оборудования для поиска</param>
|
|||
|
/// <param name="logService">Экземпляр сервиса логирования</param>
|
|||
|
public void GetInfo(ComboBox systems, ComboBox roadStart, ComboBox roadStop, ComboBox equipments, LogService logService)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var stopwatch = new Stopwatch();
|
|||
|
Task.Factory.StartNew(delegate ()
|
|||
|
{
|
|||
|
Parallel.Invoke(() => GetAllSystems(),
|
|||
|
() => GetAllEquipments(equipments),
|
|||
|
() => GetAllAsteroids(),
|
|||
|
() => GetAllLoadouts(),
|
|||
|
() => GetAllBases(roadStart, roadStop, systems));
|
|||
|
});
|
|||
|
}
|
|||
|
catch (Exception exception)
|
|||
|
{
|
|||
|
logService.ErrorLogEvent(exception.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получение списка грузов
|
|||
|
/// </summary>
|
|||
|
/// <param name="line"></param>
|
|||
|
/// <param name="logService"></param>
|
|||
|
private void GetLoadout(string line)
|
|||
|
{
|
|||
|
if (line.Contains("nickname ="))
|
|||
|
{
|
|||
|
SurptiseNick_ID++;
|
|||
|
var nickName = (line.Substring(10, line.Length - 10)).Trim().ToLower();
|
|||
|
Loadouts.Add(new Loadout() { Name = nickName });
|
|||
|
}
|
|||
|
if (line.Contains("archetype ="))
|
|||
|
{
|
|||
|
var arch = (line.Substring(11, line.Length - 11)).Trim().ToLower();
|
|||
|
Loadouts[SurptiseNick_ID - 1].Archetype = arch;
|
|||
|
}
|
|||
|
if (line.Contains("cargo ="))
|
|||
|
{
|
|||
|
var cargoNameCount = (line.Substring(7, line.Length - 7)).Trim().ToLower();
|
|||
|
var name = cargoNameCount.Substring(0, cargoNameCount.IndexOf(','));
|
|||
|
var count = cargoNameCount.Substring(cargoNameCount.IndexOf(',') + 1, cargoNameCount.Length - (cargoNameCount.IndexOf(',') + 1));
|
|||
|
int.TryParse(count, out int res);
|
|||
|
Loadouts[SurptiseNick_ID - 1].Cargo.Add(new Cargo()
|
|||
|
{
|
|||
|
Name = name,
|
|||
|
Count = res
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получение информации о системе
|
|||
|
/// </summary>
|
|||
|
/// <param name="line">строка с данными</param>
|
|||
|
private void GetSystemDataToFile(string line)
|
|||
|
{
|
|||
|
if (line.Contains("nickname"))
|
|||
|
{
|
|||
|
SystemID = (line.Substring(10, line.Length - 10)).Trim().ToLower();
|
|||
|
UniverseSystemsData.Add(SystemID, new UniverseSystem()
|
|||
|
{
|
|||
|
Id = SystemID
|
|||
|
});
|
|||
|
}
|
|||
|
if (line.Contains("strid_name"))
|
|||
|
{
|
|||
|
var dll_name = (line.Substring(12, line.Length - 12)).Trim();
|
|||
|
UniverseSystemsData[SystemID].DLL_Name = dll_name;
|
|||
|
var id = SystemID.ToLower();
|
|||
|
string name = string.Empty;
|
|||
|
if (SystemNamesID.ContainsKey(id)) name = SystemNamesID[id];
|
|||
|
else name = id;
|
|||
|
UniverseSystemsData[SystemID].Name = name;
|
|||
|
}
|
|||
|
if (line.Contains("visit"))
|
|||
|
{
|
|||
|
var visit = (line.Substring(7, line.Length - 7)).Trim();
|
|||
|
UniverseSystemsData[SystemID].Visit = int.Parse(visit);
|
|||
|
}
|
|||
|
if (line.Contains("ids_info"))
|
|||
|
{
|
|||
|
var dll_ids_name = (line.Substring(10, line.Length - 10)).Trim();
|
|||
|
UniverseSystemsData[SystemID].DLL_InfoCard = dll_ids_name;
|
|||
|
}
|
|||
|
if (line.Contains("file"))
|
|||
|
{
|
|||
|
var file = (line.Substring(6, line.Length - 6)).Trim();
|
|||
|
UniverseSystemsData[SystemID].INI = file;
|
|||
|
GetSystemInfo(SystemID);
|
|||
|
}
|
|||
|
if (line.Contains("NavMapScale"))
|
|||
|
{
|
|||
|
var nav = (line.Substring(13, line.Length - 13)).Trim();
|
|||
|
IFormatProvider formatter = new NumberFormatInfo { NumberDecimalSeparator = "." };
|
|||
|
UniverseSystemsData[SystemID].NavMapScale = double.Parse(nav, formatter);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получение списка баз системы
|
|||
|
/// </summary>
|
|||
|
/// <param name="line">строка с информацией</param>
|
|||
|
private void GetBaseDataToFile(string line)
|
|||
|
{
|
|||
|
if (line.Contains("nickname"))
|
|||
|
{
|
|||
|
BaseId = (line.Substring(10, line.Length - 10)).Trim().ToLower();
|
|||
|
UniverseBasesData.Add(BaseId, new UniverseBase()
|
|||
|
{
|
|||
|
Id = BaseId
|
|||
|
});
|
|||
|
}
|
|||
|
if (line.Contains("strid_name"))
|
|||
|
{
|
|||
|
var dll_name = (line.Substring(12, line.Length - 12)).Trim();
|
|||
|
if (dll_name.Contains(";"))
|
|||
|
dll_name = dll_name.Substring(0, dll_name.IndexOf(';'));
|
|||
|
UniverseBasesData[BaseId].DLL_Name = dll_name;
|
|||
|
var names = GetNameSystem(int.Parse(dll_name), BaseId);
|
|||
|
foreach (var name in names)
|
|||
|
{
|
|||
|
UniverseBasesData[BaseId].Name += name + " | ";
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Читает конфигурационный файл системы
|
|||
|
/// </summary>
|
|||
|
/// <param name="systemId">ID системы</param>
|
|||
|
|
|||
|
private void GetSystemInfo(string systemId)
|
|||
|
{
|
|||
|
var sr = new StreamReader(UniverseSystemsData[systemId].INI);
|
|||
|
var data = sr.ReadLine();
|
|||
|
var Object = false;
|
|||
|
var Zone = false;
|
|||
|
while (data != null)
|
|||
|
{
|
|||
|
if (data.Contains("Object"))
|
|||
|
{
|
|||
|
Object = true;
|
|||
|
Zone = false;
|
|||
|
if (UniverseSystemsData[systemId].Objects == null)
|
|||
|
UniverseSystemsData[systemId].Objects = new List<ObjectSystem>();
|
|||
|
}
|
|||
|
if (data.Contains("Zone"))
|
|||
|
{
|
|||
|
Object = false;
|
|||
|
Zone = true;
|
|||
|
}
|
|||
|
if (Object)
|
|||
|
{
|
|||
|
if (data.Contains("nickname"))
|
|||
|
{
|
|||
|
var id_name = (data.Substring(10, data.Length - 10)).Trim();
|
|||
|
UniverseSystemsData[systemId].Objects.Add(new ObjectSystem()
|
|||
|
{
|
|||
|
ID = id_name
|
|||
|
});
|
|||
|
}
|
|||
|
if (data.Contains("pos ="))
|
|||
|
{
|
|||
|
var position = (data.Substring(5, data.Length - 5)).Trim();
|
|||
|
if (position.Contains(";"))
|
|||
|
position = (position.Substring(0, position.IndexOf(';')).Trim());
|
|||
|
int[] pos = position.Split(',').Select(n =>
|
|||
|
{
|
|||
|
int val = 0;
|
|||
|
n = n.Trim();
|
|||
|
var state = int.TryParse(n, out val);
|
|||
|
if (state == false)
|
|||
|
{
|
|||
|
double td = 0;
|
|||
|
if (n.Contains('.'))
|
|||
|
{
|
|||
|
IFormatProvider formatter = new NumberFormatInfo { NumberDecimalSeparator = "." };
|
|||
|
td = double.Parse(n, formatter);
|
|||
|
int i = (int)Math.Round(td, MidpointRounding.AwayFromZero);
|
|||
|
val = i;
|
|||
|
return val;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
File.AppendAllText("log.txt", "Error Parse Position - " + position + " - " + UniverseSystemsData[systemId].INI + "\n");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else return val;
|
|||
|
}).ToArray();
|
|||
|
if(pos == null)
|
|||
|
{
|
|||
|
LogService.ErrorLogEvent(systemId);
|
|||
|
}
|
|||
|
else UniverseSystemsData[systemId].Objects[UniverseSystemsData[systemId].Objects.Count - 1].Pos = pos;
|
|||
|
}
|
|||
|
if (data.Contains("base ="))
|
|||
|
{
|
|||
|
var baseID = (data.Substring(6, data.Length - 6)).Trim();
|
|||
|
UniverseSystemsData[systemId].Objects[UniverseSystemsData[systemId].Objects.Count - 1].BaseID = baseID;
|
|||
|
}
|
|||
|
if (data.Contains("ids_name ="))
|
|||
|
{
|
|||
|
var idsName = (data.Substring(10, data.Length - 10)).Trim();
|
|||
|
UniverseSystemsData[systemId].Objects[UniverseSystemsData[systemId].Objects.Count - 1].IdsName = idsName;
|
|||
|
}
|
|||
|
if (data.Contains("archetype ="))
|
|||
|
{
|
|||
|
var archetype = (data.Substring(11, data.Length - 11)).Trim();
|
|||
|
UniverseSystemsData[systemId].Objects[UniverseSystemsData[systemId].Objects.Count - 1].Archetype = archetype;
|
|||
|
}
|
|||
|
if (data.Contains("loadout ="))
|
|||
|
{
|
|||
|
var loadout = (data.Substring(9, data.Length - 9)).Trim();
|
|||
|
UniverseSystemsData[systemId].Objects[UniverseSystemsData[systemId].Objects.Count - 1].Loadout = loadout;
|
|||
|
}
|
|||
|
if (data.Contains("goto =") && !data.Contains(';'))
|
|||
|
{
|
|||
|
var loadout = (data.Substring(6, data.Length - 6)).Trim().ToLower();
|
|||
|
var idS = loadout.Substring(0, loadout.IndexOf(','));
|
|||
|
var nameS = SystemNamesID[idS];
|
|||
|
UniverseSystemsData[systemId].Objects[UniverseSystemsData[systemId].Objects.Count - 1].Goto = nameS;
|
|||
|
UniverseSystemsData[systemId].Objects[UniverseSystemsData[systemId].Objects.Count - 1].GotoID = idS;
|
|||
|
}
|
|||
|
}
|
|||
|
if(Zone)
|
|||
|
{
|
|||
|
if (data.Contains("nickname ="))
|
|||
|
{
|
|||
|
var id_name = (data.Substring(10, data.Length - 10)).Trim();
|
|||
|
UniverseSystemsData[systemId].Zones.Add(new ZoneSystem()
|
|||
|
{
|
|||
|
ID = id_name
|
|||
|
});
|
|||
|
}
|
|||
|
if (data.Contains("pos ="))
|
|||
|
{
|
|||
|
var position = (data.Substring(5, data.Length - 5)).Trim();
|
|||
|
if (position.Contains(";"))
|
|||
|
position = (position.Substring(0, position.IndexOf(';')).Trim());
|
|||
|
int[] pos = position.Split(',').Select(n =>
|
|||
|
{
|
|||
|
var val = 0;
|
|||
|
n = n.Trim();
|
|||
|
var state = int.TryParse(n, out val);
|
|||
|
if (state == false)
|
|||
|
{
|
|||
|
double td = 0;
|
|||
|
if (n.Contains('.'))
|
|||
|
{
|
|||
|
IFormatProvider formatter = new NumberFormatInfo { NumberDecimalSeparator = "." };
|
|||
|
td = double.Parse(n, formatter);
|
|||
|
int i = (int)Math.Round(td, MidpointRounding.AwayFromZero);
|
|||
|
val = i;
|
|||
|
return val;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
File.AppendAllText("log.txt", "Error Parse Position - " + position + " - " + UniverseSystemsData[systemId].INI + "\n");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else return val;
|
|||
|
}).ToArray();
|
|||
|
if (pos == null)
|
|||
|
{
|
|||
|
LogService.ErrorLogEvent(systemId);
|
|||
|
}
|
|||
|
else UniverseSystemsData[systemId].Zones[UniverseSystemsData[systemId].Zones.Count - 1].Pos = pos;
|
|||
|
}
|
|||
|
}
|
|||
|
data = sr.ReadLine();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получение человекочитаемого наименования
|
|||
|
/// </summary>
|
|||
|
/// <param name="id">идентификатор элемента объекта</param>
|
|||
|
/// <param name="baseId">идентификатор объекта</param>
|
|||
|
/// <returns>список наименований</returns>
|
|||
|
public List<string> GetNameSystem(int id, string baseId)
|
|||
|
{
|
|||
|
string[] dlls = new string[] { "NameResources.dll", "SBM.dll", "SBM2.dll", "SBM3.dll" };
|
|||
|
var names = new List<string>();
|
|||
|
foreach(string dll in dlls)
|
|||
|
{
|
|||
|
string name = ExtractStringFromDLL(dll, id);
|
|||
|
if (!string.IsNullOrEmpty(name))
|
|||
|
{
|
|||
|
if(!names.Contains(name))
|
|||
|
{
|
|||
|
names.Add(name);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if(names.Count == 0)
|
|||
|
{
|
|||
|
names.Add("НЕТ НАЗВАНИЙ");
|
|||
|
LogService.ErrorLogEvent($"[Имя объекта системы][{baseId}] id: " + id + " - не содержит названия");
|
|||
|
}
|
|||
|
return names;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Обновление содержимого ключевых элементов Combobox
|
|||
|
/// </summary>
|
|||
|
private void LoadComboboxData(ComboBox roadStart, ComboBox roadStop, ComboBox systems)
|
|||
|
{
|
|||
|
int resultCountSystem = 0;
|
|||
|
var countCurrSys = 0;
|
|||
|
ArraySystemsCombobox = new string[UniverseSystemsData.Count];
|
|||
|
var dirInfoSystems = new DirectoryInfo("SYSTEMS");
|
|||
|
var dirInfoArray = dirInfoSystems.GetDirectories();
|
|||
|
//формирую список идентификаторов систем
|
|||
|
foreach (var dirInfo in dirInfoArray)
|
|||
|
{
|
|||
|
var dirName = dirInfo.ToString().ToLower();
|
|||
|
if (UniverseSystemsData.ContainsKey(dirName))
|
|||
|
{
|
|||
|
resultCountSystem++;
|
|||
|
var roadStartData = new ComboBoxItem();
|
|||
|
roadStartData.Text = (string.IsNullOrEmpty(UniverseSystemsData[dirName].Name) ? UniverseSystemsData[dirName].Id : UniverseSystemsData[dirName].Name);
|
|||
|
roadStartData.ID = UniverseSystemsData[dirName].Id;
|
|||
|
roadStart.BeginInvoke(new Action(() =>
|
|||
|
{
|
|||
|
roadStart.Items.Add(roadStartData);
|
|||
|
roadStart.SelectedIndex = 0;
|
|||
|
}));
|
|||
|
var roadStopData = new ComboBoxItem();
|
|||
|
roadStopData.Text = (string.IsNullOrEmpty(UniverseSystemsData[dirName].Name) ? UniverseSystemsData[dirName].Id : UniverseSystemsData[dirName].Name);
|
|||
|
roadStopData.ID = UniverseSystemsData[dirName].Id;
|
|||
|
roadStop.BeginInvoke(new Action(() =>
|
|||
|
{
|
|||
|
roadStop.Items.Add(roadStopData);
|
|||
|
if(roadStop.Items.Count >= 2) roadStop.SelectedIndex = 1;
|
|||
|
}));
|
|||
|
|
|||
|
if (UniverseSystemsData[dirName].Name.Length == 0)
|
|||
|
{
|
|||
|
systems.BeginInvoke(new Action(() =>
|
|||
|
{
|
|||
|
systems.Items.Add(UniverseSystemsData[dirName].Id);
|
|||
|
}));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
systems.BeginInvoke(new Action(() =>
|
|||
|
{
|
|||
|
systems.Items.Add(UniverseSystemsData[dirName].Name + " | " + UniverseSystemsData[dirName].Id);
|
|||
|
systems.SelectedIndex = 0;
|
|||
|
}));
|
|||
|
}
|
|||
|
ArraySystemsCombobox[countCurrSys] = dirName;
|
|||
|
countCurrSys++;
|
|||
|
SystemsID.Add(UniverseSystemsData[dirName].Id);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
resultCountSystem++;
|
|||
|
LogService.ErrorWarningEvent("[" + resultCountSystem + "] " + dirName + " - не является системой...");
|
|||
|
}
|
|||
|
}
|
|||
|
ArraySystemsCombobox = ArraySystemsCombobox.Where(x => x != null).ToArray();
|
|||
|
LogService.LogEvent("Обновление данных в интерфейсе о системах завершено");
|
|||
|
|
|||
|
LoadRoute();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Обработка маршрутов между системами (все гиперпереходы)
|
|||
|
/// </summary>
|
|||
|
private void LoadRoute()
|
|||
|
{
|
|||
|
foreach (var sys in ArraySystemsCombobox)
|
|||
|
{
|
|||
|
foreach (var elem in UniverseSystemsData[sys].Objects.FindAll((el) => !el.ID.Contains('=') && el.ID.ToLower().Contains(sys.ToLower() + "_to")))
|
|||
|
{
|
|||
|
var name = elem.ID;
|
|||
|
var destiny = name.Substring(name.IndexOf('_') + 4, name.Length - 4 - sys.Length);
|
|||
|
if (destiny.IndexOf('_') != -1)
|
|||
|
destiny = destiny.Substring(0, destiny.IndexOf('_'));
|
|||
|
//проверяем goto
|
|||
|
if (elem.GotoID == null || elem.GotoID.ToLower().Contains(sys.ToLower())) continue;
|
|||
|
|
|||
|
var res = sys.ToLower() + "=" + elem.GotoID.ToLower();
|
|||
|
if (!res.Contains("police01"))
|
|||
|
HollRoads.Add(res);
|
|||
|
}
|
|||
|
HollRoads.Add("aod01=hu04"); //система ангелов тьмы
|
|||
|
HollRoads.Add("hu04=aod01"); //система ангелов тьмы
|
|||
|
HollRoads.Add("dream_system01=hi03"); //система грёз
|
|||
|
HollRoads.Add("hi03=dream_system01"); //система грёз
|
|||
|
}
|
|||
|
|
|||
|
//формирование словаря для маршрутизации в русском переводе
|
|||
|
for (int i = 0; i < ArraySystemsCombobox.Length; i++)
|
|||
|
{
|
|||
|
if (!SystemsNameId.ContainsKey(UniverseSystemsData[ArraySystemsCombobox[i]].Name))
|
|||
|
SystemsNameId.Add(UniverseSystemsData[ArraySystemsCombobox[i]].Name, ArraySystemsCombobox[i]);
|
|||
|
else
|
|||
|
LogService.LogEvent(UniverseSystemsData[ArraySystemsCombobox[i]].Name);
|
|||
|
}
|
|||
|
|
|||
|
LogService.LogEvent("Список маршрутов определён и обновлён в интерфейсе");
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Чтение списка баз и информации о системе
|
|||
|
/// </summary>
|
|||
|
private void GetAllBases(ComboBox roadStart, ComboBox roadStop, ComboBox systems)
|
|||
|
{
|
|||
|
using (var reader = new StreamReader("universe.ini"))
|
|||
|
{
|
|||
|
var line = string.Empty;
|
|||
|
bool systemState = false, baseState = false;
|
|||
|
while ((line = reader.ReadLine()) != null)
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(line))
|
|||
|
{
|
|||
|
if (line.Contains("[system]"))
|
|||
|
{
|
|||
|
systemState = true;
|
|||
|
baseState = false;
|
|||
|
}
|
|||
|
if (line.Contains("[Base]"))
|
|||
|
{
|
|||
|
systemState = false;
|
|||
|
baseState = true;
|
|||
|
}
|
|||
|
if (systemState)
|
|||
|
GetSystemDataToFile(line);
|
|||
|
if (baseState)
|
|||
|
GetBaseDataToFile(line);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LogService.LogEvent($"Вcя информация о {UniverseSystemsData.Count} системах игры прочитана");
|
|||
|
LogService.LogEvent($"Все базы игры прочитаны: {UniverseBasesData.Count}");
|
|||
|
|
|||
|
LoadComboboxData(roadStart, roadStop, systems);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получает список грузов
|
|||
|
/// </summary>
|
|||
|
private void GetAllLoadouts()
|
|||
|
{
|
|||
|
//получаю список грузов
|
|||
|
using (var reader = new StreamReader("loadouts.ini"))
|
|||
|
{
|
|||
|
var line = string.Empty;
|
|||
|
bool load = false;
|
|||
|
while ((line = reader.ReadLine()) != null)
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(line))
|
|||
|
{
|
|||
|
line = line.ToLower();
|
|||
|
if (line.Contains("[loadout]"))
|
|||
|
load = true;
|
|||
|
if (load) GetLoadout(line);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LogService.LogEvent($"Все грузы игры прочитаны: {Loadouts.Count}");
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получение списка систем
|
|||
|
/// </summary>
|
|||
|
private void GetAllSystems()
|
|||
|
{
|
|||
|
using (var reader = new StreamReader("systems.ini"))
|
|||
|
{
|
|||
|
var line = string.Empty;
|
|||
|
while ((line = reader.ReadLine()) != null)
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(line))
|
|||
|
{
|
|||
|
var idS = line.Substring(0, line.IndexOf('='));
|
|||
|
var nameS = line.Substring(line.IndexOf('=') + 1);
|
|||
|
SystemNamesID.Add(idS, nameS);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LogService.LogEvent($"Все системы игры прочитаны: {SystemNamesID.Count}");
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получаение всех наименований оборудования в игре
|
|||
|
/// </summary>
|
|||
|
private void GetAllEquipments(ComboBox equipments)
|
|||
|
{
|
|||
|
using (var reader = new StreamReader("equipments.ini"))
|
|||
|
{
|
|||
|
var line = string.Empty;
|
|||
|
while ((line = reader.ReadLine()) != null)
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(line))
|
|||
|
{
|
|||
|
var tmp1 = line.Substring(line.IndexOf(',') + 1, line.Length - (line.IndexOf(',') + 1));
|
|||
|
var tmp2 = tmp1.Substring(tmp1.IndexOf(',') + 1, tmp1.Length - (tmp1.IndexOf(',') + 1));
|
|||
|
var tmp3 = tmp2.Substring(tmp2.IndexOf(',') + 1, tmp2.Length - (tmp2.IndexOf(',') + 1));
|
|||
|
var tmp4 = tmp3.Substring(tmp3.IndexOf(',') + 1, tmp3.Length - (tmp3.IndexOf(',') + 1));
|
|||
|
var Id = tmp4.Substring(0, tmp4.IndexOf(',')).Trim();
|
|||
|
var tmp5 = tmp4.Substring(tmp4.IndexOf(',') + 1, tmp4.Length - (tmp4.IndexOf(',') + 1));
|
|||
|
var Name = tmp5.Substring(0, tmp5.IndexOf(',')).Trim();
|
|||
|
Equipments.Add(new Equipment() { Id = Id, Name = Name });
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LogService.LogEvent($"Всё оброрудование игры прочитано: {Equipments.Count}");
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Получаение всех данных по астероидным полям
|
|||
|
/// </summary>
|
|||
|
private void GetAllAsteroids()
|
|||
|
{
|
|||
|
var dirInfoSystems = new DirectoryInfo("ASTEROIDS");
|
|||
|
var files = dirInfoSystems.GetFiles();
|
|||
|
|
|||
|
foreach(var file in files)
|
|||
|
{
|
|||
|
if (!file.Name.Contains('_')) continue;
|
|||
|
|
|||
|
var idSys = file.Name.Substring(0, file.Name.IndexOf('_'));
|
|||
|
var path = Path.Combine("ASTEROIDS", file.Name);
|
|||
|
|
|||
|
//получаю список груза
|
|||
|
using (var reader = new StreamReader(path))
|
|||
|
{
|
|||
|
var line = string.Empty;
|
|||
|
bool loot = false;
|
|||
|
var nameZone = string.Empty;
|
|||
|
while ((line = reader.ReadLine()) != null)
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(line))
|
|||
|
{
|
|||
|
if (line.Contains("[LootableZone]")) loot = true;
|
|||
|
if (line.Contains("[TexturePanels]")) loot = false;
|
|||
|
if (loot)
|
|||
|
{
|
|||
|
//Id зоны
|
|||
|
if(line.Contains("zone ="))
|
|||
|
{
|
|||
|
nameZone = line.Substring(line.IndexOf('=') + 1, line.Length - (line.IndexOf('=') + 1)).Trim();
|
|||
|
}
|
|||
|
//Груз астероида
|
|||
|
if(line.Contains("asteroid_loot_commodity ="))
|
|||
|
{
|
|||
|
var lootes = line.Substring(line.IndexOf('=') + 1, line.Length - (line.IndexOf('=') + 1)).Trim();
|
|||
|
|
|||
|
//Если система с таким ID существует, то заполняем инфу в неё
|
|||
|
if (SysAsteroids.ContainsKey(idSys))
|
|||
|
{
|
|||
|
SysAsteroids[idSys].Add(new LootableZone()
|
|||
|
{
|
|||
|
LootId = lootes.ToLower(),
|
|||
|
ZoneName = nameZone.ToLower()
|
|||
|
});
|
|||
|
}
|
|||
|
else //создаём такую систему со своими зонами астероидов
|
|||
|
{
|
|||
|
|
|||
|
SysAsteroids.Add(idSys, new List<LootableZone>() { new LootableZone()
|
|||
|
{
|
|||
|
LootId = lootes.ToLower(),
|
|||
|
ZoneName = nameZone.ToLower()
|
|||
|
}});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
LogService.LogEvent($"Все астероидные поля прочитаны: {SysAsteroids.Count}");
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Чтение элемента из DLL
|
|||
|
/// </summary>
|
|||
|
/// <param name="file">Адрес до файла</param>
|
|||
|
/// <param name="number">Номер элемента</param>
|
|||
|
/// <returns>строка с данными</returns>
|
|||
|
private string ExtractStringFromDLL(string file, int number)
|
|||
|
{
|
|||
|
var lib = LoadLibrary(file);
|
|||
|
var resultBuilder = new StringBuilder(2048);
|
|||
|
LoadString(lib, number, resultBuilder, resultBuilder.Capacity);
|
|||
|
FreeLibrary(lib);
|
|||
|
return resultBuilder.ToString();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|