diff --git a/FModel/Creator/Bases/FN/BaseMaterialInstance.cs b/FModel/Creator/Bases/FN/BaseMaterialInstance.cs index 37cfd489..8de7f501 100644 --- a/FModel/Creator/Bases/FN/BaseMaterialInstance.cs +++ b/FModel/Creator/Bases/FN/BaseMaterialInstance.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using CUE4Parse.UE4.Assets.Exports; using CUE4Parse.UE4.Assets.Exports.Material; using CUE4Parse.UE4.Assets.Exports.Texture; @@ -84,4 +84,4 @@ namespace FModel.Creator.Bases.FN return SKImage.FromBitmap(ret); } } -} \ No newline at end of file +} diff --git a/FModel/Creator/Bases/FN/BaseOfferDisplayData.cs b/FModel/Creator/Bases/FN/BaseOfferDisplayData.cs new file mode 100644 index 00000000..d750ba67 --- /dev/null +++ b/FModel/Creator/Bases/FN/BaseOfferDisplayData.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; +using CUE4Parse.UE4.Assets.Exports; +using CUE4Parse.UE4.Assets.Exports.Material; +using SkiaSharp; + +namespace FModel.Creator.Bases.FN +{ + public class BaseOfferDisplayData : UCreator + { + private List _offerImages; + + public BaseOfferDisplayData(UObject uObject, EIconStyle style) : base(uObject, style) + { + } + + public override void ParseForInfo() + { + if (Object.ExportType != "AthenaItemShopOfferDisplayData") + return; + + if (!Object.TryGetValue(out UMaterialInterface[] presentations, "Presentations")) + return; + + _offerImages = new List(); + foreach (var p in presentations) + { + var offerImage = new BaseMaterialInstance(p, Style); + offerImage.ParseForInfo(); + _offerImages.Add(offerImage.Draw()); + } + } + + public override SKImage Draw() + { + int imageOrder; + + if (_offerImages.Count < 4) + imageOrder = _offerImages.Count; + else if (_offerImages.Count == 4) + imageOrder = 2; + else if (_offerImages.Count <= 9) + imageOrder = 3; + else imageOrder = 5; + + Width = 512 * imageOrder; + Height = _offerImages.Count / imageOrder; + + if (_offerImages.Count % imageOrder != 0) + Height++; + + Height *= 512; + + using var bitmap = new SKBitmap(Width, Height); + using var canvas = new SKCanvas(bitmap); + var point = new SKPoint(0, 0); + + for (int i = 0, placement = 0; i < _offerImages.Count; i++) + { + if (placement >= imageOrder) + { + placement = 0; + point.Y += 512; + } + point.X = 512 * placement; + + canvas.DrawImage(_offerImages[i], point); + placement++; + } + + return SKImage.FromBitmap(bitmap); + } + } +} diff --git a/FModel/Creator/CreatorPackage.cs b/FModel/Creator/CreatorPackage.cs index 64d2ffdb..33af99cd 100644 --- a/FModel/Creator/CreatorPackage.cs +++ b/FModel/Creator/CreatorPackage.cs @@ -133,6 +133,9 @@ namespace FModel.Creator _object.Owner.Name.EndsWith($"/MI_BPTile/{_object.Name}", StringComparison.OrdinalIgnoreCase)): creator = new BaseMaterialInstance(_object, _style); return true; + case "AthenaItemShopOfferDisplayData": + creator = new BaseOfferDisplayData(_object, _style); + return true; case "FortMtxOfferData": creator = new BaseMtxOffer(_object, _style); return true;