2026-06-09 01:46:57 +03:00
|
|
|
using System.Text;
|
2026-06-02 01:49:46 +03:00
|
|
|
using System.Text.Json;
|
2026-05-13 02:53:42 +03:00
|
|
|
using Common;
|
2026-06-02 01:49:46 +03:00
|
|
|
using ControlLib;
|
2026-05-17 15:40:16 +03:00
|
|
|
using MshLib;
|
2026-06-09 01:46:57 +03:00
|
|
|
using NResLib;
|
|
|
|
|
using WeaLib;
|
2025-12-09 02:32:32 +03:00
|
|
|
|
2026-02-15 23:44:20 +03:00
|
|
|
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
|
2026-06-02 01:49:46 +03:00
|
|
|
//
|
2026-06-09 01:46:57 +03:00
|
|
|
// var ctl = ControlResourceReader.ReadCtlFile("E:\\ParkanUnpacked\\bases.rlb\\2_CTLD_r_l_03.ctl");
|
|
|
|
|
// var cpt = ControlResourceReader.ReadCptFile("E:\\ParkanUnpacked\\bases.rlb\\18_CTPT_R_L_03.CPT");
|
|
|
|
|
// var ndp = ControlResourceReader.ReadNdpFile("E:\\ParkanUnpacked\\bases.rlb\\14_NDPR_r_l_03.ndp");
|
2026-05-17 02:31:11 +03:00
|
|
|
|
2026-06-02 01:49:46 +03:00
|
|
|
// var ctl = ControlResourceReader.ReadCtlFile("E:\\ParkanUnpacked\\turrets.rlb\\30_CTLD_o_tur_lt_02.ctl");
|
|
|
|
|
// var cpt = ControlResourceReader.ReadCptFile("E:\\ParkanUnpacked\\turrets.rlb\\162_CTPT_o_tur_lt_02.cpt");
|
|
|
|
|
// var ndp = ControlResourceReader.ReadNdpFile("E:\\ParkanUnpacked\\turrets.rlb\\119_NDPR_o_tur_la_02.ndp");
|
2026-05-17 02:31:11 +03:00
|
|
|
|
2026-06-02 01:49:46 +03:00
|
|
|
// var ctl = ControlResourceReader.ReadCtlFile("E:\\ParkanUnpacked\\guns.rlb\\86_CTLD_o_gun_la_01.ctl");
|
|
|
|
|
// var cpt = ControlResourceReader.ReadCptFile("E:\\ParkanUnpacked\\guns.rlb\\364_CTPT_o_gun_la_01.cpt");
|
|
|
|
|
// var ndp = ControlResourceReader.ReadNdpFile("E:\\ParkanUnpacked\\guns.rlb\\309_NDPR_o_gun_la_01.ndp");
|
|
|
|
|
|
2026-06-09 01:46:57 +03:00
|
|
|
// ControlResourceDump.DumpAll(ctl, cpt, ndp, Console.Out);
|
2026-06-10 01:38:44 +03:00
|
|
|
var materialLib = "Material.lib";
|
2026-06-09 01:46:57 +03:00
|
|
|
|
|
|
|
|
List<string> allNres =
|
|
|
|
|
[
|
|
|
|
|
"animals.rlb",
|
|
|
|
|
"bases.rlb",
|
|
|
|
|
"behpsp.res",
|
|
|
|
|
"effects.rlb",
|
|
|
|
|
"fortif.rlb",
|
|
|
|
|
// "gamefont.rlb", // NL
|
|
|
|
|
"guns.rlb",
|
|
|
|
|
"intsys.rlb",
|
|
|
|
|
"lightmap.lib",
|
|
|
|
|
"Material.lib",
|
|
|
|
|
"objects.dlb",
|
|
|
|
|
"objects.rlb",
|
|
|
|
|
"Palettes.lib",
|
|
|
|
|
"parts.rlb",
|
|
|
|
|
"static.rlb",
|
|
|
|
|
"sys.lib",
|
|
|
|
|
"system.rlb",
|
|
|
|
|
"Textures.lib",
|
|
|
|
|
"turrets.rlb",
|
|
|
|
|
"voices.lib",
|
|
|
|
|
"weapon.rlb"
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// CONFIRMED:
|
|
|
|
|
// all .msh have .wea in the same archive with the same name, so no cross-referencing
|
|
|
|
|
|
|
|
|
|
foreach (var nres in allNres)
|
|
|
|
|
{
|
|
|
|
|
var path = Path.Combine("C:\\IronStrategy", nres);
|
|
|
|
|
|
|
|
|
|
using var nResFs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
|
|
|
var archive = NResParser.ReadFile(nResFs).Archive!;
|
|
|
|
|
|
|
|
|
|
foreach (var archiveFile in archive.Files)
|
|
|
|
|
{
|
|
|
|
|
if (archiveFile.FileType != "MESH") continue;
|
|
|
|
|
|
|
|
|
|
// Console.WriteLine($"Found mesh {archiveFile.FileName} in {nres}");
|
|
|
|
|
|
|
|
|
|
var entry = Path.GetFileNameWithoutExtension(archiveFile.FileName);
|
|
|
|
|
var weaEntry = archive.Files.FirstOrDefault(x => x.FileType == "WEAR" &&
|
|
|
|
|
string.Equals(x.FileName, $"{entry}.wea",
|
|
|
|
|
StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
if (weaEntry is null)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine($"Mesh {archiveFile.FileName} in {nres} has no WEA");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Console.WriteLine($"Has matching wear {weaEntry.FileName}");
|
|
|
|
|
|
|
|
|
|
var weaData = new byte[weaEntry.FileLength];
|
|
|
|
|
|
|
|
|
|
nResFs.Seek(weaEntry.OffsetInFile, SeekOrigin.Begin);
|
|
|
|
|
nResFs.ReadExactly(weaData, 0, weaData.Length);
|
|
|
|
|
|
|
|
|
|
var weaContent = Encoding.UTF8.GetString(weaData);
|
|
|
|
|
var wea = WeaParser.ReadText(weaContent);
|
|
|
|
|
|
|
|
|
|
_ = 5;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-06-02 01:49:46 +03:00
|
|
|
|
|
|
|
|
// foreach (var item in ctl.ItemRecords)
|
|
|
|
|
// {
|
|
|
|
|
// Console.WriteLine(
|
|
|
|
|
// $"0x{item.Offset:X4}-0x{item.EndOffset:X4} " +
|
|
|
|
|
// $"type={item.ItemType:X} piece={item.LocalPieceIndex} " +
|
|
|
|
|
// $"name='{item.ItemName}' bindings=[{string.Join(", ", item.PieceBindingIndices)}]");
|
2026-06-09 01:46:57 +03:00
|
|
|
// }
|