From ad2f275d5e492448f5d4cd2757ba96d24da542f2 Mon Sep 17 00:00:00 2001 From: 4sval Date: Sun, 31 Jul 2022 03:41:41 +0200 Subject: [PATCH] don't mind me, simple CTRL S --- CUE4Parse | 2 +- FModel/Creator/Bases/MV/BaseFighter.cs | 109 +++++++ FModel/Creator/Bases/UCreator.cs | 6 +- FModel/Creator/CreatorPackage.cs | 2 + FModel/Creator/Typefaces.cs | 291 +++++++----------- FModel/Creator/Utils.cs | 6 +- FModel/FModel.csproj | 2 +- FModel/Settings/UserSettings.cs | 4 +- FModel/ViewModels/CUE4ParseViewModel.cs | 2 +- FModel/ViewModels/GameSelectorViewModel.cs | 3 +- .../Converters/StringToGameConverter.cs | 3 +- 11 files changed, 233 insertions(+), 197 deletions(-) create mode 100644 FModel/Creator/Bases/MV/BaseFighter.cs diff --git a/CUE4Parse b/CUE4Parse index d1251ca4..403599b4 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit d1251ca4502cc374e65e8bdd6c920fffce20a6f6 +Subproject commit 403599b4939e81cd7b4f3d3b201cf1018e02ece0 diff --git a/FModel/Creator/Bases/MV/BaseFighter.cs b/FModel/Creator/Bases/MV/BaseFighter.cs new file mode 100644 index 00000000..08463856 --- /dev/null +++ b/FModel/Creator/Bases/MV/BaseFighter.cs @@ -0,0 +1,109 @@ +using System; +using System.Linq; +using CUE4Parse.UE4.Assets.Exports; +using CUE4Parse.UE4.Assets.Exports.Material; +using CUE4Parse.UE4.Objects.Core.i18N; +using CUE4Parse.UE4.Objects.Core.Math; +using CUE4Parse.UE4.Objects.UObject; +using SkiaSharp; + +namespace FModel.Creator.Bases.MV; + +public class BaseFighter : UCreator +{ + private float _xOffset; + private float _yOffset; + private float _zoom; + private SKBitmap _pattern; + + public BaseFighter(UObject uObject, EIconStyle style) : base(uObject, style) + { + // https://cdn.discordapp.com/attachments/715640455068385422/1003052259917168700/unknown.png + Width = 1024; + DisplayNamePaint.TextAlign = SKTextAlign.Left; + DisplayNamePaint.TextSize = 100; + DefaultPreview = Utils.GetBitmap("MultiVersus/Content/Panda_Main/UI/PreMatch/Images/DiamondPortraits/0010_Random.0010_Random"); + _pattern = Utils.GetBitmap("MultiVersus/Content/Panda_Main/UI/Assets/UI_Textures/halftone_jagged.halftone_jagged"); + } + + public override void ParseForInfo() + { + if (Object.TryGetValue(out FLinearColor backgroundColor, "BackgroundColor")) + Background = new[] { SKColor.Parse(backgroundColor.Hex) }; + + if (Object.TryGetValue(out FSoftObjectPath portraitMaterial, "CollectionsPortraitMaterial") && + portraitMaterial.TryLoad(out UMaterialInstanceConstant portrait)) + { + _xOffset = Math.Abs(portrait.ScalarParameterValues.FirstOrDefault(x => x.ParameterInfo.Name.Text == "XOffset")?.ParameterValue ?? 1f); + _yOffset = Math.Abs(portrait.ScalarParameterValues.FirstOrDefault(x => x.ParameterInfo.Name.Text == "YOffset")?.ParameterValue / 10 ?? 1f); + _zoom = Math.Clamp(portrait.ScalarParameterValues.FirstOrDefault(x => x.ParameterInfo.Name.Text == "Zoom")?.ParameterValue ?? 1f, 0, 1); + Preview = Utils.GetBitmap(portrait); + } + + if (Object.TryGetValue(out FText displayName, "DisplayName")) + DisplayName = displayName.Text; + } + + public override SKBitmap[] Draw() + { + var ret = new SKBitmap(Width, Height, SKColorType.Rgba8888, SKAlphaType.Premul); + using var c = new SKCanvas(ret); + + DrawBackground(c); + DrawPreview(c); + DrawDisplayName(c); + + return new[] { ret }; + } + + private new void DrawBackground(SKCanvas c) + { + c.DrawRect(new SKRect(0, 0, Width, Height), + new SKPaint + { + IsAntialias = true, FilterQuality = SKFilterQuality.High, Color = Background[0] + }); + + if (!string.IsNullOrWhiteSpace(DisplayName)) + { + c.DrawText(DisplayName, -50, 125, new() + { + IsAntialias = true, FilterQuality = SKFilterQuality.High, + Typeface = Utils.Typefaces.DisplayName, TextSize = 200, + TextScaleX = .95f, TextSkewX = -0.25f, Color = SKColors.Black.WithAlpha(25) + }); + } + + c.DrawBitmap(_pattern, new SKRect(0, 256, Width, 512), new SKPaint + { + IsAntialias = true, FilterQuality = SKFilterQuality.High, BlendMode = SKBlendMode.SoftLight + }); + + var path = new SKPath { FillType = SKPathFillType.EvenOdd }; + path.MoveTo(0, 512); + path.LineTo(0, 492); + path.LineTo(Width, 452); + path.LineTo(Width, 512); + path.Close(); + c.DrawPath(path, new SKPaint + { + IsAntialias = true, + FilterQuality = SKFilterQuality.High, + Color = SKColor.Parse("#141629") + }); + } + + private new void DrawPreview(SKCanvas c) + { + var img = (Preview ?? DefaultPreview).ResizeWithRatio(_zoom); + var x_offset = img.Width * _xOffset; + var y_offset = img.Height * -_yOffset; + c.DrawBitmap(img, new SKRect(Width + x_offset - img.Width, y_offset, Width + x_offset, img.Height + y_offset), ImagePaint); + } + + private new void DrawDisplayName(SKCanvas c) + { + if (string.IsNullOrWhiteSpace(DisplayName)) return; + c.DrawText(DisplayName.ToUpper(), 50, 100, DisplayNamePaint); + } +} diff --git a/FModel/Creator/Bases/UCreator.cs b/FModel/Creator/Bases/UCreator.cs index 7dbceba6..7295c450 100644 --- a/FModel/Creator/Bases/UCreator.cs +++ b/FModel/Creator/Bases/UCreator.cs @@ -43,13 +43,13 @@ public abstract class UCreator protected readonly SKPaint DisplayNamePaint = new() { IsAntialias = true, FilterQuality = SKFilterQuality.High, - Typeface = Utils.Typefaces.DisplayName ?? Utils.Typefaces.Default, TextSize = _NAME_TEXT_SIZE, + Typeface = Utils.Typefaces.DisplayName, TextSize = _NAME_TEXT_SIZE, Color = SKColors.White, TextAlign = SKTextAlign.Center }; protected readonly SKPaint DescriptionPaint = new() { IsAntialias = true, FilterQuality = SKFilterQuality.High, - Typeface = Utils.Typefaces.Description ?? Utils.Typefaces.Default, TextSize = 13, + Typeface = Utils.Typefaces.Description, TextSize = 13, Color = SKColors.White }; protected readonly SKPaint ImagePaint = new() @@ -214,7 +214,7 @@ public abstract class UCreator switch (side) { case SKTextAlign.Left: - _shortDescriptionPaint.Typeface = Utils.Typefaces.Bottom ?? Utils.Typefaces.DisplayName ?? Utils.Typefaces.Default; + _shortDescriptionPaint.Typeface = Utils.Typefaces.Bottom ?? Utils.Typefaces.DisplayName; var shaper = new CustomSKShaper(_shortDescriptionPaint.Typeface); shaper.Shape(text, _shortDescriptionPaint); diff --git a/FModel/Creator/CreatorPackage.cs b/FModel/Creator/CreatorPackage.cs index 59067ed6..4bf2b4e1 100644 --- a/FModel/Creator/CreatorPackage.cs +++ b/FModel/Creator/CreatorPackage.cs @@ -176,6 +176,8 @@ public class CreatorPackage : IDisposable return true; // Multiversus case "CharacterData": + creator = new BaseFighter(_object, _style); + return true; case "SkinData": creator = new BaseMultiversusIcon(_object, _style); return true; diff --git a/FModel/Creator/Typefaces.cs b/FModel/Creator/Typefaces.cs index cdeb696e..9fbbe021 100644 --- a/FModel/Creator/Typefaces.cs +++ b/FModel/Creator/Typefaces.cs @@ -44,7 +44,7 @@ public class Typefaces // Multiversus private const string _MULTIVERSUS_BASE_PATH = "/Game/Panda_Main/UI/Fonts/"; private const string _MONTSERRAT_BOLD = "Montserrat/Montserrat-Bold"; - private const string _VCCARDINAL_CONDENSED_BOLDITALIC_ITALIC = "VCCardinal/VCCardinalCondensed-BoldItalic"; + private const string _NORMS_STD_CONDENSED_BLACK = "Norms/TT_Norms_Std_Condensed_Black"; // Spellbreak private const string _SPELLBREAK_BASE_PATH = "/Game/UI/Fonts/"; @@ -77,224 +77,145 @@ public class Typefaces public Typefaces(CUE4ParseViewModel viewModel) { - byte[] data; _viewModel = viewModel; var language = UserSettings.Default.AssetLanguage; + Default = SKTypeface.FromStream(Application.GetResourceStream(_BURBANK_BIG_CONDENSED_BOLD)?.Stream); switch (viewModel.Game) { case FGame.FortniteGame: { - var namePath = _FORTNITE_BASE_PATH + - language switch - { - ELanguage.Korean => _ASIA_ERINM, - ELanguage.Russian => _BURBANK_BIG_CONDENSED_BLACK, - ELanguage.Japanese => _NIS_JYAU, - ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, - ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, - ELanguage.Chinese => _NOTO_SANS_SC_BLACK, - _ => string.Empty - }; - if (viewModel.Provider.TrySaveAsset(namePath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - DisplayName = SKTypeface.FromStream(m); - } - else DisplayName = Default; + DisplayName = OnTheFly(_FORTNITE_BASE_PATH + + language switch + { + ELanguage.Korean => _ASIA_ERINM, + ELanguage.Russian => _BURBANK_BIG_CONDENSED_BLACK, + ELanguage.Japanese => _NIS_JYAU, + ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, + ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, + ELanguage.Chinese => _NOTO_SANS_SC_BLACK, + _ => string.Empty + } + _EXT); - var descriptionPath = _FORTNITE_BASE_PATH + - language switch - { - ELanguage.Korean => _NOTO_SANS_KR_REGULAR, - ELanguage.Japanese => _NOTO_SANS_JP_BOLD, - ELanguage.Arabic => _NOTO_SANS_ARABIC_REGULAR, - ELanguage.TraditionalChinese => _NOTO_SANS_TC_REGULAR, - ELanguage.Chinese => _NOTO_SANS_SC_REGULAR, - _ => _NOTO_SANS_REGULAR - }; - if (viewModel.Provider.TrySaveAsset(descriptionPath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - Description = SKTypeface.FromStream(m); - } - else Description = Default; + Description = OnTheFly(_FORTNITE_BASE_PATH + + language switch + { + ELanguage.Korean => _NOTO_SANS_KR_REGULAR, + ELanguage.Japanese => _NOTO_SANS_JP_BOLD, + ELanguage.Arabic => _NOTO_SANS_ARABIC_REGULAR, + ELanguage.TraditionalChinese => _NOTO_SANS_TC_REGULAR, + ELanguage.Chinese => _NOTO_SANS_SC_REGULAR, + _ => _NOTO_SANS_REGULAR + } + _EXT); - var bottomPath = _FORTNITE_BASE_PATH + - language switch - { - ELanguage.Korean => string.Empty, - ELanguage.Japanese => string.Empty, - ELanguage.Arabic => string.Empty, - ELanguage.TraditionalChinese => string.Empty, - ELanguage.Chinese => string.Empty, - _ => _BURBANK_SMALL_BOLD - }; - if (viewModel.Provider.TrySaveAsset(bottomPath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - Bottom = SKTypeface.FromStream(m); - } - // else keep it null + Bottom = OnTheFly(_FORTNITE_BASE_PATH + + language switch + { + ELanguage.Korean => string.Empty, + ELanguage.Japanese => string.Empty, + ELanguage.Arabic => string.Empty, + ELanguage.TraditionalChinese => string.Empty, + ELanguage.Chinese => string.Empty, + _ => _BURBANK_SMALL_BOLD + } + _EXT, true); - if (viewModel.Provider.TrySaveAsset(_FORTNITE_BASE_PATH + _BURBANK_BIG_CONDENSED_BLACK + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - BundleNumber = SKTypeface.FromStream(m); - } - else BundleNumber = Default; + BundleNumber = OnTheFly(_FORTNITE_BASE_PATH + _BURBANK_BIG_CONDENSED_BLACK + _EXT); - var bundleNamePath = _FORTNITE_BASE_PATH + - language switch - { - ELanguage.Korean => _ASIA_ERINM, - ELanguage.Russian => _BURBANK_BIG_CONDENSED_BLACK, - ELanguage.Japanese => _NIS_JYAU, - ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, - ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, - ELanguage.Chinese => _NOTO_SANS_SC_BLACK, - _ => string.Empty - }; - if (viewModel.Provider.TrySaveAsset(bundleNamePath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - Bundle = SKTypeface.FromStream(m); - } - else Bundle = BundleNumber; + Bundle = OnTheFly(_FORTNITE_BASE_PATH + + language switch + { + ELanguage.Korean => _ASIA_ERINM, + ELanguage.Russian => _BURBANK_BIG_CONDENSED_BLACK, + ELanguage.Japanese => _NIS_JYAU, + ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, + ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, + ELanguage.Chinese => _NOTO_SANS_SC_BLACK, + _ => string.Empty + } + _EXT, true) ?? BundleNumber; - var tandemDisplayNamePath = _FORTNITE_BASE_PATH + - language switch - { - ELanguage.Korean => _ASIA_ERINM, - ELanguage.Russian => _BURBANK_BIG_CONDENSED_BLACK, - ELanguage.Japanese => _NIS_JYAU, - ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, - ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, - ELanguage.Chinese => _NOTO_SANS_SC_BLACK, - _ => _BURBANK_BIG_REGULAR_BLACK - }; - if (viewModel.Provider.TrySaveAsset(tandemDisplayNamePath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - TandemDisplayName = SKTypeface.FromStream(m); - } - else TandemDisplayName = Default; + TandemDisplayName = OnTheFly(_FORTNITE_BASE_PATH + + language switch + { + ELanguage.Korean => _ASIA_ERINM, + ELanguage.Russian => _BURBANK_BIG_CONDENSED_BLACK, + ELanguage.Japanese => _NIS_JYAU, + ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, + ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, + ELanguage.Chinese => _NOTO_SANS_SC_BLACK, + _ => _BURBANK_BIG_REGULAR_BLACK + } + _EXT); - var tandemGeneralDescPath = _FORTNITE_BASE_PATH + - language switch - { - ELanguage.Korean => _ASIA_ERINM, - ELanguage.Japanese => _NIS_JYAU, - ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, - ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, - ELanguage.Chinese => _NOTO_SANS_SC_BLACK, - _ => _BURBANK_SMALL_BLACK - }; - if (viewModel.Provider.TrySaveAsset(tandemGeneralDescPath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - TandemGenDescription = SKTypeface.FromStream(m); - } - else TandemGenDescription = Default; - - var tandemAdditionalDescPath = _FORTNITE_BASE_PATH + - language switch - { - ELanguage.Korean => _ASIA_ERINM, - ELanguage.Japanese => _NIS_JYAU, - ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, - ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, - ELanguage.Chinese => _NOTO_SANS_SC_BLACK, - _ => _BURBANK_SMALL_BOLD - }; - if (viewModel.Provider.TrySaveAsset(tandemAdditionalDescPath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - TandemAddDescription = SKTypeface.FromStream(m); - } - else TandemAddDescription = Default; + TandemGenDescription = OnTheFly(_FORTNITE_BASE_PATH + + language switch + { + ELanguage.Korean => _ASIA_ERINM, + ELanguage.Japanese => _NIS_JYAU, + ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, + ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, + ELanguage.Chinese => _NOTO_SANS_SC_BLACK, + _ => _BURBANK_SMALL_BLACK + } + _EXT); + TandemAddDescription = OnTheFly(_FORTNITE_BASE_PATH + + language switch + { + ELanguage.Korean => _ASIA_ERINM, + ELanguage.Japanese => _NIS_JYAU, + ELanguage.Arabic => _NOTO_SANS_ARABIC_BLACK, + ELanguage.TraditionalChinese => _NOTO_SANS_TC_BLACK, + ELanguage.Chinese => _NOTO_SANS_SC_BLACK, + _ => _BURBANK_SMALL_BOLD + } + _EXT); break; } case FGame.WorldExplorers: { - var namePath = _BATTLE_BREAKERS_BASE_PATH + - language switch - { - ELanguage.Korean => _NOTO_SANS_KR_REGULAR, - ELanguage.Russian => _LATO_BLACK, - ELanguage.Japanese => _NOTO_SANS_JP_REGULAR, - ELanguage.Chinese => _NOTO_SANS_SC_REGULAR, - _ => _HEMIHEAD426 - }; - if (viewModel.Provider.TrySaveAsset(namePath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - DisplayName = SKTypeface.FromStream(m); - } - else DisplayName = Default; - - var descriptionPath = _BATTLE_BREAKERS_BASE_PATH + - language switch - { - ELanguage.Korean => _NOTO_SANS_KR_REGULAR, - ELanguage.Russian => _LATO_BLACK, - ELanguage.Japanese => _NOTO_SANS_JP_REGULAR, - ELanguage.Chinese => _NOTO_SANS_SC_REGULAR, - _ => _HEMIHEAD426 - }; - if (viewModel.Provider.TrySaveAsset(descriptionPath + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - Description = SKTypeface.FromStream(m); - } - else Description = Default; + DisplayName = OnTheFly(_BATTLE_BREAKERS_BASE_PATH + + language switch + { + ELanguage.Korean => _NOTO_SANS_KR_REGULAR, + ELanguage.Russian => _LATO_BLACK, + ELanguage.Japanese => _NOTO_SANS_JP_REGULAR, + ELanguage.Chinese => _NOTO_SANS_SC_REGULAR, + _ => _HEMIHEAD426 + } + _EXT); + Description = OnTheFly(_BATTLE_BREAKERS_BASE_PATH + + language switch + { + ELanguage.Korean => _NOTO_SANS_KR_REGULAR, + ELanguage.Russian => _LATO_BLACK, + ELanguage.Japanese => _NOTO_SANS_JP_REGULAR, + ELanguage.Chinese => _NOTO_SANS_SC_REGULAR, + _ => _HEMIHEAD426 + } + _EXT); break; } case FGame.g3: { - if (viewModel.Provider.TrySaveAsset(_SPELLBREAK_BASE_PATH + _QUADRAT_BOLD + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - DisplayName = SKTypeface.FromStream(m); - } - else DisplayName = Default; - - if (viewModel.Provider.TrySaveAsset(_SPELLBREAK_BASE_PATH + _MONTSERRAT_SEMIBOLD + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - Description = SKTypeface.FromStream(m); - } - else Description = Default; - + DisplayName = OnTheFly(_SPELLBREAK_BASE_PATH + _QUADRAT_BOLD + _EXT); + Description = OnTheFly(_SPELLBREAK_BASE_PATH + _MONTSERRAT_SEMIBOLD + _EXT); break; } case FGame.Multiversus: { - if (viewModel.Provider.TrySaveAsset(_MULTIVERSUS_BASE_PATH + _VCCARDINAL_CONDENSED_BOLDITALIC_ITALIC + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - DisplayName = SKTypeface.FromStream(m); - } - else DisplayName = Default; - - if (viewModel.Provider.TrySaveAsset(_MULTIVERSUS_BASE_PATH + _MONTSERRAT_BOLD + _EXT, out data)) - { - var m = new MemoryStream(data) { Position = 0 }; - Description = SKTypeface.FromStream(m); - } - else Description = Default; - + DisplayName = OnTheFly(_MULTIVERSUS_BASE_PATH + _NORMS_STD_CONDENSED_BLACK + _EXT); + Description = OnTheFly(_MULTIVERSUS_BASE_PATH + _MONTSERRAT_BOLD + _EXT); + break; + } + default: + { + DisplayName = Default; + Description = Default; break; } } } - public SKTypeface OnTheFly(string path) + public SKTypeface OnTheFly(string path, bool fallback = false) { - if (!_viewModel.Provider.TrySaveAsset(path, out var data)) return Default; + if (!_viewModel.Provider.TrySaveAsset(path, out var data)) return fallback ? null : Default; var m = new MemoryStream(data) { Position = 0 }; return SKTypeface.FromStream(m); } diff --git a/FModel/Creator/Utils.cs b/FModel/Creator/Utils.cs index 73c84c97..216d7a02 100644 --- a/FModel/Creator/Utils.cs +++ b/FModel/Creator/Utils.cs @@ -118,12 +118,14 @@ public static class Utils { var ratioX = width / me.Width; var ratioY = height / me.Height; - var ratio = ratioX < ratioY ? ratioX : ratioY; + return ResizeWithRatio(me, ratioX < ratioY ? ratioX : ratioY); + } + public static SKBitmap ResizeWithRatio(this SKBitmap me, double ratio) + { return me.Resize(Convert.ToInt32(me.Width * ratio), Convert.ToInt32(me.Height * ratio)); } public static SKBitmap Resize(this SKBitmap me, int size) => me.Resize(size, size); - public static SKBitmap Resize(this SKBitmap me, int width, int height) { var bmp = new SKBitmap(new SKImageInfo(width, height), SKBitmapAllocFlags.ZeroPixels); diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index 5a2ca7dd..d44cd668 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -11,7 +11,7 @@ false true win-x64 - false + true true FModel.App diff --git a/FModel/Settings/UserSettings.cs b/FModel/Settings/UserSettings.cs index 2d67c5eb..b84b34e5 100644 --- a/FModel/Settings/UserSettings.cs +++ b/FModel/Settings/UserSettings.cs @@ -316,7 +316,7 @@ namespace FModel.Settings {FGame.PortalWars, EGame.GAME_UE4_LATEST}, {FGame.Gameface, EGame.GAME_GTATheTrilogyDefinitiveEdition}, {FGame.Athena, EGame.GAME_SeaOfThieves}, - {FGame.Multiversus, EGame.GAME_UE4_LATEST} + {FGame.Multiversus, EGame.GAME_UE4_26} }; public IDictionary OverridedGame { @@ -654,7 +654,7 @@ namespace FModel.Settings } } - private bool _saveAnimations; + private bool _saveAnimations = true; public bool SaveAnimations { get => _saveAnimations; diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index acb1fb3c..ed4ea96c 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -370,6 +370,7 @@ public class CUE4ParseViewModel : ViewModel { await LoadGameLocalizedResources(); await LoadHotfixedLocalizedResources(); + await _threadWorkerView.Begin(_ => Utils.Typefaces = new Typefaces(this)); if (LocalizedResourcesCount > 0) { FLogger.AppendInformation(); @@ -388,7 +389,6 @@ public class CUE4ParseViewModel : ViewModel await _threadWorkerView.Begin(cancellationToken => { LocalizedResourcesCount = Provider.LoadLocalization(UserSettings.Default.AssetLanguage, cancellationToken); - Utils.Typefaces = new Typefaces(this); }); } diff --git a/FModel/ViewModels/GameSelectorViewModel.cs b/FModel/ViewModels/GameSelectorViewModel.cs index b8840bde..966c14d1 100644 --- a/FModel/ViewModels/GameSelectorViewModel.cs +++ b/FModel/ViewModels/GameSelectorViewModel.cs @@ -109,6 +109,7 @@ public class GameSelectorViewModel : ViewModel yield return GetUnrealEngineGame("Snoek", "\\StateOfDecay2\\Content\\Paks"); yield return GetUnrealEngineGame("a99769d95d8f400baad1f67ab5dfe508", "\\Core\\Platform\\Content\\Paks"); yield return GetUnrealEngineGame("Nebula", "\\BendGame\\Content"); + yield return GetUnrealEngineGame("711c5e95dc094ca58e5f16bd48e751d6", "\\MultiVersus\\Content"); yield return GetRiotGame("VALORANT", "ShooterGame\\Content\\Paks"); yield return new DetectedGame { GameName = "Valorant [LIVE]", GameDirectory = Constants._VAL_LIVE_TRIGGER }; yield return GetMojangGame("MinecraftDungeons", "\\dungeons\\dungeons\\Dungeons\\Content\\Paks"); @@ -365,4 +366,4 @@ public class GameSelectorViewModel : ViewModel } } } -} \ No newline at end of file +} diff --git a/FModel/Views/Resources/Converters/StringToGameConverter.cs b/FModel/Views/Resources/Converters/StringToGameConverter.cs index 05fac32f..bc856ef6 100644 --- a/FModel/Views/Resources/Converters/StringToGameConverter.cs +++ b/FModel/Views/Resources/Converters/StringToGameConverter.cs @@ -25,6 +25,7 @@ public class StringToGameConverter : IValueConverter "MinecraftDungeons" => "Minecraft Dungeons", "shoebill" => "Star Wars: Jedi Fallen Order", "a99769d95d8f400baad1f67ab5dfe508" => "Core", + "711c5e95dc094ca58e5f16bd48e751d6" => "MultiVersus", 381210 => "Dead By Daylight", 578080 => "PLAYERUNKNOWN'S BATTLEGROUNDS", 677620 => "Splitgate", @@ -37,4 +38,4 @@ public class StringToGameConverter : IValueConverter { throw new NotImplementedException(); } -} \ No newline at end of file +}