From 6a91e86b07442806a3efe647319a86d07eb6d0b4 Mon Sep 17 00:00:00 2001
From: tresabhi <43380238+tresabhi@users.noreply.github.com>
Date: Wed, 5 Mar 2025 11:52:39 -0600
Subject: [PATCH] feat: handle duplicates
---
.../src/pages/[...locale]/tanks/index.astro | 8 +-
src/BlitzKit.CLI/Functions/Mangler.cs | 93 +++++++++++++++++--
2 files changed, 93 insertions(+), 8 deletions(-)
diff --git a/packages/website/src/pages/[...locale]/tanks/index.astro b/packages/website/src/pages/[...locale]/tanks/index.astro
index f65cd3b39..ca6d6ed01 100644
--- a/packages/website/src/pages/[...locale]/tanks/index.astro
+++ b/packages/website/src/pages/[...locale]/tanks/index.astro
@@ -1,5 +1,5 @@
---
-import { Link } from '@radix-ui/themes';
+import { LinkI18n } from '../../../components/LinkI18n';
import { PageWrapper } from '../../../components/PageWrapper';
import { tanksTool } from '../../../constants/tools';
import { awaitableTanks } from '../../../core/awaitables/tanks';
@@ -7,6 +7,8 @@ import ToolLayout from '../../../layouts/ToolLayout.astro';
export { getStaticPaths } from '../index.astro';
+const locale = Astro.params.locale;
+
const tanks = await awaitableTanks;
---
@@ -14,7 +16,9 @@ const tanks = await awaitableTanks;
{
tanks.tanks.map((tank) => (
- {tank.slug}
+
+ {tank.slug} ({tank.id})
+
))
}
diff --git a/src/BlitzKit.CLI/Functions/Mangler.cs b/src/BlitzKit.CLI/Functions/Mangler.cs
index 5cac506e0..3e2c3bb71 100644
--- a/src/BlitzKit.CLI/Functions/Mangler.cs
+++ b/src/BlitzKit.CLI/Functions/Mangler.cs
@@ -14,6 +14,7 @@ using CUE4Parse.UE4.Assets.Exports.StaticMesh;
using CUE4Parse.UE4.Assets.Objects;
using CUE4Parse.UE4.Objects.UObject;
using CUE4Parse.UE4.Pak.Objects;
+using CUE4Parse.Utils;
using Google.Protobuf;
using Google.Protobuf.Collections;
using Newtonsoft.Json.Linq;
@@ -77,7 +78,7 @@ namespace BlitzKit.CLI.Functions
{
var blitzLocale = locale.Blitz ?? locale.Locale;
var url =
- $"{Unpacker.WG_DLC_DOMAIN}/dlc/{Unpacker.CONTENT_GROUP}/ue_localizations/development/general/{blitzLocale}.yaml";
+ $"{Unpacker.WG_DLC_DOMAIN}/dlc/{Unpacker.CONTENT_GROUP}/ue_localizations/development/stuff/{blitzLocale}.yaml";
var yaml = await client.GetStringAsync(url);
var deserializer = new DeserializerBuilder().Build();
var parsedYaml = deserializer.Deserialize>(yaml);
@@ -89,7 +90,7 @@ namespace BlitzKit.CLI.Functions
void MangleNations()
{
var dirs = provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories;
- Tanks tanks = new();
+ List tanksRaw = [];
foreach (var dir in dirs)
{
@@ -101,15 +102,95 @@ namespace BlitzKit.CLI.Functions
// if (tankDir.Value.Name != "R90_IS_4")
// continue;
- var tank = MangleTank(tankDir.Value);
- TankMeta tankMeta = new() { Id = tank.Id, Slug = tank.Slug };
- tanks.Tanks_.Add(tankMeta);
+ tanksRaw.Add(MangleTank(tankDir.Value));
}
}
+ DeduplicateSlugs(tanksRaw);
+
+ Tanks tanks = new();
+
+ foreach (var tank in tanksRaw)
+ {
+ TankMeta tankMeta = new() { Id = tank.Id, Slug = tank.Slug };
+ tanks.Tanks_.Add(tankMeta);
+ }
+
changes.Add(new("definitions/tanks.pb", tanks.ToByteArray()));
}
+ void DeduplicateSlugs(List tanks)
+ {
+ List checkedSlugs = [];
+ Dictionary> duplicates = [];
+
+ foreach (var tank in tanks)
+ {
+ if (checkedSlugs.Contains(tank.Slug))
+ continue;
+
+ checkedSlugs.Add(tank.Slug);
+
+ foreach (var otherTank in tanks)
+ {
+ if (otherTank.Slug.Equals(tank.Slug) && !otherTank.Id.Equals(tank.Id))
+ {
+ var thisDuplicates = duplicates.GetOrAdd(tank.Slug, () => [tank]);
+ thisDuplicates.Add(otherTank);
+ }
+ }
+ }
+
+ if (duplicates.Count > 0)
+ {
+ PrettyLog.Warn($"{duplicates.Count} duplicate slugs found, attempting strategies...");
+ }
+
+ foreach (var duplicate in duplicates)
+ {
+ Console.WriteLine($"{duplicate.Key}:");
+
+ foreach (var tank in duplicate.Value)
+ {
+ Console.WriteLine($"\t{tank.Id}");
+ }
+
+ if (duplicate.Value.Count != 2)
+ {
+ throw new Exception(
+ $"Found an unsupported {duplicate.Value.Count} duplicates for {duplicate.Key}"
+ );
+ }
+
+ if (duplicate.Value.Any(tank => tank.Id.EndsWith("TU")))
+ {
+ PrettyLog.Success("\tTutorial bot discrimination...");
+
+ var tutorialBot = duplicate.Value.First(tank => tank.Id.EndsWith("TU"));
+ tutorialBot.Slug += "-tu";
+ }
+ else
+ {
+ PrettyLog.Success("\tNation discrimination...");
+
+ foreach (var tank in duplicate.Value)
+ {
+ var match = Regex.Match(tank.Id, @"([a-zA-Z]+)\d+_");
+ var rawNation = match.Groups[1].Value;
+ var slugNation = rawNation.ToLowerInvariant();
+ tank.Slug += $"-{slugNation}";
+ }
+ }
+
+ foreach (var tank in duplicate.Value)
+ {
+ Console.WriteLine($"\t\t{tank.Slug}");
+ }
+
+ Console.WriteLine();
+ }
+ }
+
Tank MangleTank(VFS tankDir)
{
var pdaName = $"PDA_{tankDir.Name}";
@@ -117,7 +198,7 @@ namespace BlitzKit.CLI.Functions
var id = PropertyUtil.Get(pda, "TankId").Text;
- var name = GetString($"{id}_SHORT_NAME");
+ var name = GetString($"TankEntity__{id.ToLowerInvariant()}__Short_Name");
var slug = Diacritics.Remove(name.Locales["en"]).ToLower();
slug = Regex.Replace(slug, "[^a-z0-9]", "-");