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
+}