diff --git a/KHSave.Lib1/ISaveKh1.cs b/KHSave.Lib1/ISaveKh1.cs
index 7d5ad1ea..99cbee97 100644
--- a/KHSave.Lib1/ISaveKh1.cs
+++ b/KHSave.Lib1/ISaveKh1.cs
@@ -24,6 +24,7 @@ public interface ISaveKh1
WorldType World { get; set; }
uint Room { get; set; }
uint SpawnLocation { get; set; }
+ Gummiship[] Gummiships { get; set; }
void Write(Stream stream);
}
diff --git a/KHSave.Lib1/Models/Gummiship.cs b/KHSave.Lib1/Models/Gummiship.cs
index 6983378f..87254c72 100644
--- a/KHSave.Lib1/Models/Gummiship.cs
+++ b/KHSave.Lib1/Models/Gummiship.cs
@@ -12,6 +12,6 @@ public class Gummiship
[Data(Count = 10)] public byte[] ShipName { get; set; }
[Data(Count = 22)] public byte[] Unk02 { get; set; }
[Data(Count = 200)] public GummiBlock[] GummiBlocks { get; set; }
- [Data(Count = 1466)] public byte[] Unk03 { get; set; }
+ [Data(Count = 1444)] public byte[] Unk03 { get; set; }
}
}
diff --git a/KHSave.Lib1/SaveKh1.FinalMix.cs b/KHSave.Lib1/SaveKh1.FinalMix.cs
index 336597b2..6f72ee32 100644
--- a/KHSave.Lib1/SaveKh1.FinalMix.cs
+++ b/KHSave.Lib1/SaveKh1.FinalMix.cs
@@ -33,6 +33,9 @@ public class SaveFinalMix : ISaveKh1
[Data(0x2044)] public uint Room { get; set; }
[Data(0x2048)] public uint SpawnLocation { get; set; }
+ //Gummiships
+ [Data(0x241C, Count = 10)] public Gummiship[] Gummiships { get; set; }
+
[Data(0x16400)] public int AutoLock { get; set; }
[Data(0x16404)] public int TargetLock { get; set; }
[Data(0x16408)] public int Camera { get; set; }
diff --git a/KHSave.SaveEditor.Kh1/MainView.xaml b/KHSave.SaveEditor.Kh1/MainView.xaml
index 3e5aecd8..e970b9a5 100644
--- a/KHSave.SaveEditor.Kh1/MainView.xaml
+++ b/KHSave.SaveEditor.Kh1/MainView.xaml
@@ -17,5 +17,8 @@
+
+
+
diff --git a/KHSave.SaveEditor.Kh1/ViewModels/GummiBlockViewModel.cs b/KHSave.SaveEditor.Kh1/ViewModels/GummiBlockViewModel.cs
new file mode 100644
index 00000000..4159e366
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/ViewModels/GummiBlockViewModel.cs
@@ -0,0 +1,36 @@
+using KHSave.Lib1.Models;
+using KHSave.Lib1.Types;
+using KHSave.SaveEditor.Common.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xe.Tools;
+
+namespace KHSave.SaveEditor.Kh1.ViewModels
+{
+ public class GummiBlockViewModel : BaseNotifyPropertyChanged
+ {
+ private readonly GummiBlock gummiblock;
+ public GummiBlockViewModel(GummiBlock gummiBlock)
+ {
+ this.gummiblock = gummiBlock;
+ GummiBlockTypes = new KhEnumListModel();
+ }
+ public KhEnumListModel GummiBlockTypes { get; set; }
+
+ public byte BlockPositionYX { get => gummiblock.BlockPositionYX; set => gummiblock.BlockPositionYX = value; }
+ public byte BlockPositionZ { get => gummiblock.BlockPositionZ; set => gummiblock.BlockPositionZ = value; }
+ public byte Unknown2 { get => gummiblock.Unknown2; set => gummiblock.Unknown2 = value; }
+ public byte Unknown3 { get => gummiblock.Unknown3; set => gummiblock.Unknown3 = value; }
+ public GummiBlocksType BlockID { get => gummiblock.BlockID; set => gummiblock.BlockID = value; }
+ public byte Unknown4 { get => gummiblock.Unknown4; set => gummiblock.Unknown4 = value; }
+ public byte Unknown5 { get => gummiblock.Unknown5; set => gummiblock.Unknown5 = value; }
+ public byte Unknown6 { get => gummiblock.Unknown6; set => gummiblock.Unknown6 = value; }
+ public byte ColorID { get => gummiblock.ColorID; set => gummiblock.ColorID = value; }
+ public byte Unknown7 { get => gummiblock.Unknown7; set => gummiblock.Unknown7 = value; }
+ public byte Unknown8 { get => gummiblock.Unknown8; set => gummiblock.Unknown8 = value; }
+ public byte Unknown9 { get => gummiblock.Unknown9; set => gummiblock.Unknown9 = value; }
+ }
+}
diff --git a/KHSave.SaveEditor.Kh1/ViewModels/GummiBlocksViewModel.cs b/KHSave.SaveEditor.Kh1/ViewModels/GummiBlocksViewModel.cs
new file mode 100644
index 00000000..031469eb
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/ViewModels/GummiBlocksViewModel.cs
@@ -0,0 +1,19 @@
+using KHSave.Lib1.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xe.Tools.Wpf.Models;
+
+namespace KHSave.SaveEditor.Kh1.ViewModels
+{
+ public class GummiBlocksViewModel : GenericListModel
+ {
+ public GummiBlocksViewModel(GummiBlock[] gummiBlocks) :
+ base(gummiBlocks.Select(x => new GummiBlockViewModel(x)))
+ {
+
+ }
+ }
+}
diff --git a/KHSave.SaveEditor.Kh1/ViewModels/GummiShipViewModel.cs b/KHSave.SaveEditor.Kh1/ViewModels/GummiShipViewModel.cs
new file mode 100644
index 00000000..589e1064
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/ViewModels/GummiShipViewModel.cs
@@ -0,0 +1,28 @@
+using KHSave.Lib1;
+using KHSave.Lib1.Models;
+using KHSave.Lib1.Types;
+using KHSave.SaveEditor.Common.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xe.Tools;
+
+namespace KHSave.SaveEditor.Kh1.ViewModels
+{
+ public class GummiShipViewModel : BaseNotifyPropertyChanged
+ {
+ private readonly Gummiship gummiship;
+
+ public GummiShipViewModel(Gummiship gummiship)
+ {
+ this.gummiship = gummiship;
+ new GummiBlocksViewModel(gummiship.GummiBlocks);
+ }
+
+ public byte[] Name { get => gummiship.ShipName; set => gummiship.ShipName = value; }
+ public byte BlocksUsed { get => gummiship.BlocksUsed; set => gummiship.BlocksUsed = value; }
+
+ }
+}
diff --git a/KHSave.SaveEditor.Kh1/ViewModels/GummiShipsViewModel.cs b/KHSave.SaveEditor.Kh1/ViewModels/GummiShipsViewModel.cs
new file mode 100644
index 00000000..ee15b5c4
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/ViewModels/GummiShipsViewModel.cs
@@ -0,0 +1,18 @@
+using KHSave.Lib1;
+using KHSave.Lib1.Models;
+using System.Collections.Generic;
+using System.Linq;
+using Xe.Tools.Wpf.Commands;
+using Xe.Tools.Wpf.Models;
+
+namespace KHSave.SaveEditor.Kh1.ViewModels
+{
+ public class GummiShipsViewModel : GenericListModel
+ {
+ public GummiShipsViewModel(Gummiship[] gummiships) :
+ base(gummiships.Select(x => new GummiShipViewModel(x)))
+ {
+
+ }
+ }
+}
diff --git a/KHSave.SaveEditor.Kh1/ViewModels/Kh1ViewModel.cs b/KHSave.SaveEditor.Kh1/ViewModels/Kh1ViewModel.cs
index 9f01579e..545841a0 100644
--- a/KHSave.SaveEditor.Kh1/ViewModels/Kh1ViewModel.cs
+++ b/KHSave.SaveEditor.Kh1/ViewModels/Kh1ViewModel.cs
@@ -27,16 +27,19 @@ public Kh1ViewModel()
public InventoryViewModel Inventory { get; private set; }
public PlayersViewModel Players { get; private set; }
public KhEnumListModel Abilities { get; }
+ public GummiShipsViewModel GummiShips { get; private set; }
public void RefreshUi()
{
System = new SystemViewModel(Save, this);
Inventory = new InventoryViewModel(Save);
Players = new PlayersViewModel(Save, this);
+ GummiShips = new GummiShipsViewModel(Save.Gummiships);
OnPropertyChanged(nameof(System));
OnPropertyChanged(nameof(Inventory));
OnPropertyChanged(nameof(Players));
+ OnPropertyChanged(nameof(GummiShips));
}
public void OpenStream(Stream stream)
diff --git a/KHSave.SaveEditor.Kh1/Views/GummiBlockView.xaml b/KHSave.SaveEditor.Kh1/Views/GummiBlockView.xaml
new file mode 100644
index 00000000..f608227f
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/Views/GummiBlockView.xaml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/KHSave.SaveEditor.Kh1/Views/GummiBlockView.xaml.cs b/KHSave.SaveEditor.Kh1/Views/GummiBlockView.xaml.cs
new file mode 100644
index 00000000..ba0b3ca5
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/Views/GummiBlockView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace KHSave.SaveEditor.Kh1.Views
+{
+ ///
+ /// Interaction logic for GummiBlockView.xaml
+ ///
+ public partial class GummiBlockView : UserControl
+ {
+ public GummiBlockView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/KHSave.SaveEditor.Kh1/Views/GummiBlocksView.xaml b/KHSave.SaveEditor.Kh1/Views/GummiBlocksView.xaml
new file mode 100644
index 00000000..e2c309e7
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/Views/GummiBlocksView.xaml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/KHSave.SaveEditor.Kh1/Views/GummiBlocksView.xaml.cs b/KHSave.SaveEditor.Kh1/Views/GummiBlocksView.xaml.cs
new file mode 100644
index 00000000..6906a83f
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/Views/GummiBlocksView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace KHSave.SaveEditor.Kh1.Views
+{
+ ///
+ /// Interaction logic for GummiBlocksView.xaml
+ ///
+ public partial class GummiBlocksView : UserControl
+ {
+ public GummiBlocksView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/KHSave.SaveEditor.Kh1/Views/GummiShipView.xaml b/KHSave.SaveEditor.Kh1/Views/GummiShipView.xaml
new file mode 100644
index 00000000..f0dfcf44
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/Views/GummiShipView.xaml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/KHSave.SaveEditor.Kh1/Views/GummiShipView.xaml.cs b/KHSave.SaveEditor.Kh1/Views/GummiShipView.xaml.cs
new file mode 100644
index 00000000..f835a4fc
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/Views/GummiShipView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace KHSave.SaveEditor.Kh1.Views
+{
+ ///
+ /// Interaction logic for GummiShipView.xaml
+ ///
+ public partial class GummiShipView : UserControl
+ {
+ public GummiShipView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/KHSave.SaveEditor.Kh1/Views/GummiShipsView.xaml b/KHSave.SaveEditor.Kh1/Views/GummiShipsView.xaml
new file mode 100644
index 00000000..c43a8ad9
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/Views/GummiShipsView.xaml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/KHSave.SaveEditor.Kh1/Views/GummiShipsView.xaml.cs b/KHSave.SaveEditor.Kh1/Views/GummiShipsView.xaml.cs
new file mode 100644
index 00000000..9af58292
--- /dev/null
+++ b/KHSave.SaveEditor.Kh1/Views/GummiShipsView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace KHSave.SaveEditor.Kh1.Views
+{
+ ///
+ /// Interaction logic for GummiShipsView.xaml
+ ///
+ public partial class GummiShipsView : UserControl
+ {
+ public GummiShipsView()
+ {
+ InitializeComponent();
+ }
+ }
+}