feat: mirros

This commit is contained in:
tresabhi committed 2025-04-01 15:32:37 -05:00
1 parent cb03a86cce
commit 8087752172
11 files changed
+193 -93

No files matched your search

+1
View File
@@ -15,6 +15,7 @@
<PackageReference Include="DotNet.Glob" Version="3.1.3" />
<PackageReference Include="DotNetEnv" Version="3.1.1" />
<PackageReference Include="Google.Protobuf" Version="3.29.3" />
<FrameworkReference Include="Microsoft.AspNetCore.App" Version="2.2.8" />
<PackageReference Include="Octokit" Version="14.0.0" />
<PackageReference Include="YamlDotNet" Version="16.3.0" />
</ItemGroup>
+37
View File
@@ -0,0 +1,37 @@
using Google.Protobuf;
using Microsoft.AspNetCore.Builder;
namespace BlitzKit.CLI.Functions
{
public class Api(string[] args)
{
readonly WebApplication app = WebApplication.Create();
readonly Mangler mangler = new(args);
void Map<T>(string path, Func<Task<T>> func)
where T : IMessage<T>
{
app.MapGet(
path,
async (context) =>
{
var message = await func();
var bytes = message.ToByteArray();
context.Response.ContentType = "application/octet-stream";
await context.Response.Body.WriteAsync(bytes);
}
);
}
public async Task Run()
{
await mangler.Initialize();
Map("/tanks/full.pb", mangler.TanksFull);
Map("/tanks/list.pb", mangler.Tanks);
app.Run();
}
}
}
+67 -74
View File
@@ -49,15 +49,71 @@ namespace BlitzKit.CLI.Functions
readonly BlitzProvider provider = new(args.Contains("--depot"));
Locales? locales;
readonly Dictionary<string, Dictionary<string, string>> strings = [];
readonly AssetUploader assetUploader = new("mangled ue assets") { enabled = true };
public async Task Mangle()
public async Task<TanksFull> TanksFull()
{
var dirs = provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories;
TanksFull tanksFull = new();
foreach (var dir in dirs)
{
if (dir.Key == "TankStub")
continue;
foreach (var tankDir in dir.Value.Directories)
{
var tank = MangleTank(tankDir.Value);
tanksFull.Tanks.Add(tank);
}
}
DeduplicateSlugs(tanksFull);
return tanksFull;
}
Tank MangleTank(VFS tankDir)
{
var pdaName = $"PDA_{tankDir.Name}";
var pda = provider.LoadObject($"{tankDir.Path}/{pdaName}.{pdaName}");
var id = pda.Get<FName>("TankId").Text;
var name = GetString($"TankEntity__{id.ToLowerInvariant()}__Short_Name");
var slug = Diacritics.Remove(name.Locales["en"]).ToLower();
slug = NonAlphanumericRegex().Replace(slug, "-");
slug = MultipleDashesRegex().Replace(slug, "-");
slug = TrailingDashRegex().Replace(slug, "");
Tank tank = new()
{
Id = id,
Name = name,
Slug = slug,
};
return tank;
}
public async Task<Tanks> Tanks()
{
var tanksFull = await TanksFull();
Tanks tanks = new();
foreach (var tank in tanksFull.Tanks)
{
tanks.Tanks_.Add(tank.Id);
}
return tanks;
}
public async Task Initialize()
{
await FetchStrings();
await MangleNations();
await assetUploader.Flush();
}
///////////////////////////////////////////////////////////////////////////
I18n GetString(string name)
{
I18n i18n = new();
@@ -109,42 +165,6 @@ namespace BlitzKit.CLI.Functions
}
}
async Task MangleNations()
{
var dirs = provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories;
TanksFull tanksFull = new();
foreach (var dir in dirs)
{
if (dir.Key == "TankStub")
continue;
foreach (var tankDir in dir.Value.Directories)
{
// if (tankDir.Value.Name != "R90_IS_4")
// continue;
// if (tankDir.Value.Name != "R81_IS_8")
// continue;
var tank = await MangleTank(tankDir.Value);
tanksFull.Tanks.Add(tank);
}
}
DeduplicateSlugs(tanksFull);
Tanks tanks = new();
foreach (var tank in tanksFull.Tanks)
{
tanks.Tanks_.Add(tank.Id);
await assetUploader.Add($"tanks/{tank.Id}/meta.pb", tank.ToByteArray());
}
await assetUploader.Add("definitions/tanks.pb", tanks.ToByteArray());
await assetUploader.Add("definitions/tanks-full.pb", tanksFull.ToByteArray());
}
void DeduplicateSlugs(TanksFull tanksFull)
{
List<string> checkedSlugs = [];
@@ -215,33 +235,6 @@ namespace BlitzKit.CLI.Functions
}
}
async Task<Tank> MangleTank(VFS tankDir)
{
var pdaName = $"PDA_{tankDir.Name}";
var pda = provider.LoadObject($"{tankDir.Path}/{pdaName}.{pdaName}");
var id = pda.Get<FName>("TankId").Text;
var name = GetString($"TankEntity__{id.ToLowerInvariant()}__Short_Name");
var slug = Diacritics.Remove(name.Locales["en"]).ToLower();
slug = NonAlphanumericRegex().Replace(slug, "-");
slug = MultipleDashesRegex().Replace(slug, "-");
slug = TrailingDashRegex().Replace(slug, "");
await MangleIcon(pda);
await MangleArmor(pda);
Tank tank = new()
{
Id = id,
Name = name,
Slug = slug,
};
await MangleModules(tank, pda);
return tank;
}
async Task MangleArmor(UObject pda)
{
var id = pda.Get<FName>("TankId").Text;
@@ -282,7 +275,7 @@ namespace BlitzKit.CLI.Functions
PrettyLog.Warn($"Penetration groups missing for {id}; creating empty list");
}
await assetUploader.Add($"tanks/{id}/armor.pb", tankArmor.ToByteArray());
// await assetUploader.Add($"tanks/{id}/armor.pb", tankArmor.ToByteArray());
}
async Task MangleIcon(UObject pda)
@@ -292,7 +285,7 @@ namespace BlitzKit.CLI.Functions
if (pda.TryGet<UTexture2D>("SmallIcon", out var smallIconTexture))
{
var smallIcon = BlitzKitExporter.Texture2D(smallIconTexture);
await assetUploader.Add($"tanks/{id}/icons/small.png", smallIcon);
// await assetUploader.Add($"tanks/{id}/icons/small.png", smallIcon);
}
else
{
@@ -302,7 +295,7 @@ namespace BlitzKit.CLI.Functions
if (pda.TryGet<UTexture2D>("BigIcon", out var bigIconTexture))
{
var bigIcon = BlitzKitExporter.Texture2D(bigIconTexture);
await assetUploader.Add($"tanks/{id}/icons/big.png", bigIcon);
// await assetUploader.Add($"tanks/{id}/icons/big.png", bigIcon);
}
else
{
@@ -354,9 +347,9 @@ namespace BlitzKit.CLI.Functions
{
MonoGltf gltf = new(collision);
await assetUploader.Add(
new($"tanks/{tank.Id}/collision/{moduleName}.glb", gltf.Write())
);
// await assetUploader.Add(
// new($"tanks/{tank.Id}/collision/{moduleName}.glb", gltf.Write())
// );
}
else
{
@@ -365,7 +358,7 @@ namespace BlitzKit.CLI.Functions
}
}
await assetUploader.Add($"tanks/{tank.Id}/model.pb", tankModel.ToByteArray());
// await assetUploader.Add($"tanks/{tank.Id}/model.pb", tankModel.ToByteArray());
}
}
}
+3 -3
View File
@@ -22,10 +22,10 @@ namespace BlitzKit.CLI
break;
}
case "mangle":
case "api":
{
Mangler mangler = new(args);
await mangler.Mangle();
Api api = new(args);
await api.Run();
break;
}