diff --git a/src/SerialLoops/ViewModels/Editors/PlaceEditorViewModel.cs b/src/SerialLoops/ViewModels/Editors/PlaceEditorViewModel.cs new file mode 100644 index 00000000..3e540001 --- /dev/null +++ b/src/SerialLoops/ViewModels/Editors/PlaceEditorViewModel.cs @@ -0,0 +1,48 @@ +using System.IO; +using Avalonia.Platform; +using HaruhiChokuretsuLib.Util; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using SerialLoops.Lib.Items; +using SkiaSharp; + +namespace SerialLoops.ViewModels.Editors; + +public class PlaceEditorViewModel : EditorViewModel +{ + private PlaceItem _place; + private SKTypeface _msGothicHaruhi; + + [Reactive] + public SKBitmap Preview { get; set; } + + public string PlaceName + { + get => _place.PlaceName; + set + { + _place.PlaceName = value; + this.RaisePropertyChanged(); + Preview = _place.GetNewPlaceGraphic(_msGothicHaruhi); + _place.PlaceGraphic.SetImage(Preview); + _place.UnsavedChanges = true; + } + } + + public PlaceEditorViewModel(PlaceItem place, MainWindowViewModel window, ILogger log) : base(place, window, log) + { + _place = place; + if (string.IsNullOrEmpty(_place.PlaceName)) + { + _place.PlaceName = _place.DisplayName[4..]; + } + Preview = _place.GetPreview(window.OpenProject); + + using Stream typefaceStream = AssetLoader.Open(new("avares://SerialLoops/Assets/Graphics/MS-Gothic-Haruhi.ttf")); + _msGothicHaruhi = SKTypeface.FromStream(typefaceStream); + if (!PlaceItem.CustomFontMapper.HasFont()) + { + PlaceItem.CustomFontMapper.AddFont(_msGothicHaruhi); + } + } +} diff --git a/src/SerialLoops/ViewModels/MainWindowViewModel.cs b/src/SerialLoops/ViewModels/MainWindowViewModel.cs index 22cf5a7f..07c1774b 100644 --- a/src/SerialLoops/ViewModels/MainWindowViewModel.cs +++ b/src/SerialLoops/ViewModels/MainWindowViewModel.cs @@ -835,6 +835,23 @@ public void SaveProject_Executed() OpenProject.Scenario.Selects[groupSelectionItem.Index] = groupSelectionItem.Selection; changedScenario = true; break; + case ItemDescription.ItemType.Place: + PlaceItem placeItem = (PlaceItem)item; + if (placeItem.PlaceName != item.DisplayName[4..]) + { + placeItem.Rename($"PLC_{placeItem.PlaceName}", OpenProject); + } + + MemoryStream placeStream = new(); + SKBitmap newPlaceImage = + PlaceItem.Unscramble(PlaceItem.Unscramble(placeItem.GetNewPlaceGraphic(_msGothicHaruhi))); + placeItem.PlaceGraphic.SetImage(newPlaceImage); + newPlaceImage.Encode(placeStream, SKEncodedImageFormat.Png, 1); + IO.WriteBinaryFile(Path.Combine("assets", "graphics", $"{placeItem.PlaceGraphic.Index:X3}.png"), + placeStream.ToArray(), OpenProject, Log); + IO.WriteStringFile(Path.Combine("assets", "graphics", $"{placeItem.PlaceGraphic.Index:X3}.gi"), + placeItem.PlaceGraphic.GetGraphicInfoFile(), OpenProject, Log); + break; case ItemDescription.ItemType.Item: ((ItemItem)item).Write(OpenProject, Log); break; diff --git a/src/SerialLoops/ViewModels/Panels/EditorTabsPanelViewModel.cs b/src/SerialLoops/ViewModels/Panels/EditorTabsPanelViewModel.cs index 7467a7ac..e8db8830 100644 --- a/src/SerialLoops/ViewModels/Panels/EditorTabsPanelViewModel.cs +++ b/src/SerialLoops/ViewModels/Panels/EditorTabsPanelViewModel.cs @@ -77,6 +77,8 @@ private EditorViewModel CreateTab(ItemDescription item) return new LayoutEditorViewModel((LayoutItem)item, MainWindow, _log); case ItemDescription.ItemType.Map: return new MapEditorViewModel((MapItem)item, MainWindow, _log); + case ItemDescription.ItemType.Place: + return new PlaceEditorViewModel((PlaceItem)item, MainWindow, _log); case ItemDescription.ItemType.Puzzle: return new PuzzleEditorViewModel((PuzzleItem)item, MainWindow, _log); case ItemDescription.ItemType.Scenario: diff --git a/src/SerialLoops/Views/Editors/PlaceEditorView.axaml b/src/SerialLoops/Views/Editors/PlaceEditorView.axaml new file mode 100644 index 00000000..c80ca9ef --- /dev/null +++ b/src/SerialLoops/Views/Editors/PlaceEditorView.axaml @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/src/SerialLoops/Views/Editors/PlaceEditorView.axaml.cs b/src/SerialLoops/Views/Editors/PlaceEditorView.axaml.cs new file mode 100644 index 00000000..8d2fa282 --- /dev/null +++ b/src/SerialLoops/Views/Editors/PlaceEditorView.axaml.cs @@ -0,0 +1,12 @@ +using Avalonia.Controls; + +namespace SerialLoops.Views.Editors; + +public partial class PlaceEditorView : UserControl +{ + public PlaceEditorView() + { + InitializeComponent(); + } +} +