mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-22 19:19:52 +02:00
feat: start work on dynamic armor
This commit is contained in:
1 parent
1d301bf2fb
commit
1ee232d104
26 files changed
+296
-583
No files matched your search
@@ -1,51 +0,0 @@
|
||||
using System.Threading.Tasks;
|
||||
using AssetRipper.TextureDecoder.Rgb.Channels;
|
||||
using Blitzkit;
|
||||
using Google.Protobuf;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
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 => await Octet(context, await func()));
|
||||
|
||||
void Map<T>(string path, Func<T> func)
|
||||
where T : IMessage<T> => Map(path, () => Task.FromResult(func()));
|
||||
|
||||
static async Task Octet<T>(HttpContext context, T message)
|
||||
where T : IMessage<T>
|
||||
{
|
||||
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.MapGet(
|
||||
"/tanks/{id}.pb",
|
||||
(HttpContext context, string id) => Octet(context, mangler.Tank(id))
|
||||
);
|
||||
|
||||
app.MapGet(
|
||||
"/tanks/{id}/icons/big.pb",
|
||||
(HttpContext context, string id) => Octet(context, mangler.TankIconBig(id))
|
||||
);
|
||||
|
||||
app.Run();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -49,81 +49,15 @@ namespace BlitzKit.CLI.Functions
|
||||
readonly BlitzProvider provider = new(args.Contains("--depot"));
|
||||
Locales? locales;
|
||||
readonly Dictionary<string, Dictionary<string, string>> strings = [];
|
||||
TanksFull tanksFull = null!;
|
||||
readonly AssetUploader assetUploader = new("mangled ue assets") { enabled = true };
|
||||
|
||||
public async Task Initialize()
|
||||
public async Task Mangle()
|
||||
{
|
||||
await FetchStrings();
|
||||
tanksFull = TanksFull();
|
||||
await MangleNations();
|
||||
await assetUploader.Flush();
|
||||
}
|
||||
|
||||
public TanksFull TanksFull()
|
||||
{
|
||||
if (tanksFull != null)
|
||||
return tanksFull;
|
||||
|
||||
var dirs = provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories;
|
||||
tanksFull = new();
|
||||
|
||||
foreach (var dir in dirs)
|
||||
{
|
||||
if (dir.Key == "TankStub")
|
||||
continue;
|
||||
|
||||
foreach (var tankDir in dir.Value.Directories)
|
||||
{
|
||||
var tank = Tank(tankDir.Value);
|
||||
tanksFull.Tanks.Add(tank);
|
||||
}
|
||||
}
|
||||
|
||||
DeduplicateSlugs(tanksFull);
|
||||
|
||||
return tanksFull;
|
||||
}
|
||||
|
||||
public Tanks Tanks()
|
||||
{
|
||||
var tanksFull = TanksFull();
|
||||
Tanks tanks = new();
|
||||
|
||||
foreach (var tank in tanksFull.Tanks)
|
||||
{
|
||||
tanks.Tanks_.Add(tank.Id);
|
||||
}
|
||||
|
||||
return tanks;
|
||||
}
|
||||
|
||||
public Tank Tank(string id)
|
||||
{
|
||||
return tanksFull.Tanks.First(tank => tank.Id == id);
|
||||
}
|
||||
|
||||
Tank Tank(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;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
I18n GetString(string name)
|
||||
{
|
||||
I18n i18n = new();
|
||||
@@ -175,6 +109,42 @@ 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 = [];
|
||||
@@ -245,6 +215,33 @@ 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;
|
||||
@@ -285,7 +282,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)
|
||||
@@ -295,7 +292,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.webp", smallIcon);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -305,7 +302,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.webp", bigIcon);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -357,9 +354,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
|
||||
{
|
||||
@@ -368,7 +365,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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -87,9 +87,9 @@ namespace BlitzKit.CLI.Models
|
||||
}
|
||||
else
|
||||
{
|
||||
PrettyLog.Background(
|
||||
$"🔵 {blobPath} ({change.Content.Count.ToString("N0", Program.Culture)}B)"
|
||||
);
|
||||
// PrettyLog.Background(
|
||||
// $"🔵 {blobPath} ({change.Content.Count.ToString("N0", Program.Culture)}B)"
|
||||
// );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@ namespace BlitzKit.CLI
|
||||
break;
|
||||
}
|
||||
|
||||
case "api":
|
||||
case "mangle":
|
||||
{
|
||||
Api api = new(args);
|
||||
await api.Run();
|
||||
Mangler mangler = new(args);
|
||||
await mangler.Mangle();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace BlitzKit.CLI.Utils
|
||||
{
|
||||
return texture
|
||||
.Decode(ETexturePlatform.DesktopMobile)!
|
||||
.Encode(SKEncodedImageFormat.Webp, 100)
|
||||
.Encode(SKEncodedImageFormat.Webp, 80)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user