diff --git a/NHSE.Core/Save/Files/MainSave.cs b/NHSE.Core/Save/Files/MainSave.cs index a6d0b19..0be9eaa 100644 --- a/NHSE.Core/Save/Files/MainSave.cs +++ b/NHSE.Core/Save/Files/MainSave.cs @@ -35,14 +35,14 @@ public void SetVillagers(IReadOnlyList villagers) public IReadOnlyList RecycleBin { - get => Item.GetArray(Data.Slice(Offsets.RecycleBin, MainSaveOffsets.RecycleBinCount * Item.SIZE)); - set => Item.SetArray(value).CopyTo(Data, Offsets.RecycleBin); + get => Item.GetArray(Data.Slice(Offsets.LostItemBox, MainSaveOffsets.RecycleBinCount * Item.SIZE)); + set => Item.SetArray(value).CopyTo(Data, Offsets.LostItemBox); } public IReadOnlyList Buildings { - get => Building.GetArray(Data.Slice(Offsets.Buildings, MainSaveOffsets.BuildingCount * Building.SIZE)); - set => Building.SetArray(value).CopyTo(Data, Offsets.Buildings); + get => Building.GetArray(Data.Slice(Offsets.MainFieldStructure, MainSaveOffsets.BuildingCount * Building.SIZE)); + set => Building.SetArray(value).CopyTo(Data, Offsets.MainFieldStructure); } public PlayerHouse GetPlayerHouse(int index) @@ -147,8 +147,8 @@ public void SetEventFlagLand(short[] value) public TurnipStonk Turnips { - get => Data.Slice(Offsets.TurnipExchange, TurnipStonk.SIZE).ToClass(); - set => value.ToBytesClass().CopyTo(Data, Offsets.TurnipExchange); + get => Data.Slice(Offsets.ShopKabu, TurnipStonk.SIZE).ToClass(); + set => value.ToBytesClass().CopyTo(Data, Offsets.ShopKabu); } public const int AcreWidth = 7 + (2 * 1); // 1 on each side cannot be traversed @@ -160,53 +160,53 @@ public ushort GetAcre(int index) { if ((uint)index > AcreMax) throw new ArgumentOutOfRangeException(nameof(index)); - return BitConverter.ToUInt16(Data, Offsets.Acres + (index * 2)); + return BitConverter.ToUInt16(Data, Offsets.OutsideField + (index * 2)); } public void SetAcre(int index, ushort value) { if ((uint)index > AcreMax) throw new ArgumentOutOfRangeException(nameof(index)); - BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + (index * 2)); + BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + (index * 2)); } - public byte[] GetAcreBytes() => Data.Slice(Offsets.Acres, AcreSizeAll); + public byte[] GetAcreBytes() => Data.Slice(Offsets.OutsideField, AcreSizeAll); public void SetAcreBytes(byte[] data) { if (data.Length != AcreSizeAll) throw new ArgumentOutOfRangeException(nameof(data.Length)); - data.CopyTo(Data, Offsets.Acres); + data.CopyTo(Data, Offsets.OutsideField); } - public TerrainTile[] GetTerrain() => TerrainTile.GetArray(Data.Slice(Offsets.Terrain, MapGrid.MapTileCount16x16 * TerrainTile.SIZE)); - public void SetTerrain(IReadOnlyList array) => TerrainTile.SetArray(array).CopyTo(Data, Offsets.Terrain); + public TerrainTile[] GetTerrain() => TerrainTile.GetArray(Data.Slice(Offsets.LandMakingMap, MapGrid.MapTileCount16x16 * TerrainTile.SIZE)); + public void SetTerrain(IReadOnlyList array) => TerrainTile.SetArray(array).CopyTo(Data, Offsets.LandMakingMap); public FieldItem[] GetFieldItems() => FieldItem.GetArray(Data.Slice(Offsets.FieldItem, MapGrid.MapTileCount32x32 * FieldItem.SIZE * 2)); public void SetFieldItems(IReadOnlyList array) => FieldItem.SetArray(array).CopyTo(Data, Offsets.FieldItem); public ushort OutsideFieldTemplateUniqueId { - get => BitConverter.ToUInt16(Data, Offsets.Acres + AcreSizeAll); - set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + AcreSizeAll); + get => BitConverter.ToUInt16(Data, Offsets.OutsideField + AcreSizeAll); + set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll); } public ushort MainFieldParamUniqueID { - get => BitConverter.ToUInt16(Data, Offsets.Acres + AcreSizeAll + 2); - set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + AcreSizeAll + 2); + get => BitConverter.ToUInt16(Data, Offsets.OutsideField + AcreSizeAll + 2); + set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll + 2); } public uint PlazaX { - get => BitConverter.ToUInt32(Data, Offsets.Acres + AcreSizeAll + 4); - set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + AcreSizeAll + 4); + get => BitConverter.ToUInt32(Data, Offsets.OutsideField + AcreSizeAll + 4); + set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll + 4); } public uint PlazaY { - get => BitConverter.ToUInt32(Data, Offsets.Acres + AcreSizeAll + 8); - set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.Acres + AcreSizeAll + 8); + get => BitConverter.ToUInt32(Data, Offsets.OutsideField + AcreSizeAll + 8); + set => BitConverter.GetBytes(value).CopyTo(Data, Offsets.OutsideField + AcreSizeAll + 8); } public GSaveTime LastSaved => Data.Slice(Offsets.LastSavedTime, GSaveTime.SIZE).ToStructure(); diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets.cs index cd0a0f0..b6ce0f5 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets.cs @@ -8,32 +8,35 @@ namespace NHSE.Core public abstract class MainSaveOffsets { public const int PlayerCount = 8; - - public abstract int Villager { get; } - public const int VillagerSize = 0x12AB0; public const int VillagerCount = 10; - - public abstract int Patterns { get; } public const int PatternCount = 50; + public const int BuildingCount = 46; + public const int RecycleBinCount = 40; + + public abstract int Animal { get; } + + public abstract int LandMyDesign { get; } public abstract int PatternsPRO { get; } public abstract int PatternFlag { get; } - public abstract int Buildings { get; } - public const int BuildingCount = 46; - - public abstract int RecycleBin { get; } - public const int RecycleBinCount = 40; - - public abstract int TurnipExchange { get; } + public abstract int MainFieldStructure { get; } public abstract int EventFlagLand { get; } public abstract int FieldItem { get; } - public abstract int Acres { get; } - public abstract int Terrain { get; } + public abstract int OutsideField { get; } + public abstract int LandMakingMap { get; } public abstract int PlayerHouseList { get; } public abstract int NpcHouseList { get; } public abstract int LastSavedTime { get; } + public abstract int BulletinBoard { get; } + + /// + /// Turnip Stalk Market + /// + public abstract int ShopKabu { get; } + + public abstract int LostItemBox { get; } public static MainSaveOffsets GetOffsets(FileHeaderInfo Info) { @@ -55,7 +58,7 @@ public DesignPattern ReadPattern(byte[] data, int index) { if ((uint)index >= PatternCount) throw new ArgumentOutOfRangeException(nameof(index)); - var v = data.Slice(Patterns + (index * DesignPattern.SIZE), DesignPattern.SIZE); + var v = data.Slice(LandMyDesign + (index * DesignPattern.SIZE), DesignPattern.SIZE); return new DesignPattern(v); } @@ -63,7 +66,7 @@ public void WritePattern(DesignPattern p, byte[] data, int index) { if ((uint)index >= PatternCount) throw new ArgumentOutOfRangeException(nameof(index)); - p.Data.CopyTo(data, Patterns + (index * DesignPattern.SIZE)); + p.Data.CopyTo(data, LandMyDesign + (index * DesignPattern.SIZE)); } public DesignPatternPRO ReadPatternPRO(byte[] data, int index) @@ -85,7 +88,7 @@ public Villager ReadVillager(byte[] data, int index) { if ((uint)index >= VillagerCount) throw new ArgumentOutOfRangeException(nameof(index)); - var v = data.Slice(Villager + (index * VillagerSize), VillagerSize); + var v = data.Slice(Animal + (index * Villager.SIZE), Villager.SIZE); return new Villager(v); } @@ -93,7 +96,7 @@ public void WriteVillager(Villager v, byte[] data, int index) { if ((uint)index >= VillagerCount) throw new ArgumentOutOfRangeException(nameof(index)); - v.Data.CopyTo(data, Villager + (index * VillagerSize)); + v.Data.CopyTo(data, Animal + (index * Villager.SIZE)); } } } \ No newline at end of file diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs index a460d2f..c7e362c 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets10.cs @@ -5,22 +5,36 @@ /// public class MainSaveOffsets10 : MainSaveOffsets { - public override int Villager => 0x110; - public override int Patterns => 0x1D72F0; - public override int PatternsPRO => Patterns + (PatternCount * DesignPattern.SIZE); + #region GSaveLand + public const int GSaveLandStart = 0x108; + public override int Animal => GSaveLandStart + 0x08; + + public override int LandMyDesign => GSaveLandStart + 0x1D71E8; + public override int PatternsPRO => LandMyDesign + (PatternCount * DesignPattern.SIZE); public override int PatternFlag => PatternsPRO + (PatternCount * DesignPatternPRO.SIZE); - public override int EventFlagLand => FieldItem - 0x800; - public override int FieldItem => 0x2018FC; - public override int Terrain => Buildings - 0x24C00; - public override int Buildings => 0x2D0EFC; - public override int Acres => 0x2D1294; + public override int EventFlagLand => GSaveLandStart + 0x200FF4; - public override int PlayerHouseList => FieldItem + 0xDAA2C; - public override int NpcHouseList => PlayerHouseList + (PlayerCount * PlayerHouse.SIZE); + // GSaveMainField + public const int GSaveMainFieldStart = GSaveLandStart + 0x2017F4; + public override int FieldItem => GSaveMainFieldStart + 0x00000; + public override int LandMakingMap => GSaveMainFieldStart + 0xAAA00; + public override int MainFieldStructure => GSaveMainFieldStart + 0xCF600; + public override int OutsideField => GSaveMainFieldStart + 0xCF998; - public override int TurnipExchange => 0x4118C0; - public override int RecycleBin => 0xABC000; // yep. - public override int LastSavedTime => RecycleBin + 0x4928; + public override int PlayerHouseList => GSaveLandStart + 0x2DBAA0; + public override int NpcHouseList => GSaveLandStart + 0x40DAA0; + public override int BulletinBoard => GSaveLandStart + 0x4159F8; + + public const int GSaveShop = GSaveLandStart + 0x40ECE8; + public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop + #endregion + + #region GSaveLandOther + public const int GSaveLandOtherStart = 0x4FA1E0; + + public override int LostItemBox => GSaveLandOtherStart + 0x5C1E20; + public override int LastSavedTime => GSaveLandOtherStart + 0x5C6748; + #endregion } } \ No newline at end of file diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs index 16ad764..d1f90a0 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets11.cs @@ -5,24 +5,36 @@ /// public class MainSaveOffsets11 : MainSaveOffsets { - public override int Villager => 0x120; - public override int Patterns => 0x1D7310; // +0x20 from v1.0 - public override int PatternsPRO => Patterns + (PatternCount * DesignPattern.SIZE); + #region GSaveLand + public const int GSaveLandStart = 0x110; + public override int Animal => GSaveLandStart + 0x10; + + public override int LandMyDesign => GSaveLandStart + 0x1D7200; + public override int PatternsPRO => LandMyDesign + (PatternCount * DesignPattern.SIZE); public override int PatternFlag => PatternsPRO + (PatternCount * DesignPatternPRO.SIZE); - public override int EventFlagLand => FieldItem - 0x800; + public override int EventFlagLand => GSaveLandStart + 0x20100C; // GSaveMainField - public override int FieldItem => 0x20191C; // +0x20 from v1.0 // Layer 1&2, and 2*0x1500 - public override int Terrain => Buildings - 0x24C00;// +0x20 from v1.0 // LandMakingMap - public override int Buildings => 0x2D0F1C; // +0x20 from v1.0 - public override int Acres => 0x2D12B4; // +0x20 from v1.0 + public const int GSaveMainFieldStart = GSaveLandStart + 0x20180C; + public override int FieldItem => GSaveMainFieldStart + 0x00000; + public override int LandMakingMap => GSaveMainFieldStart + 0xAAA00; + public override int MainFieldStructure => GSaveMainFieldStart + 0xCF600; + public override int OutsideField => GSaveMainFieldStart + 0xCF998; - public override int PlayerHouseList => FieldItem + 0xDAA2C; - public override int NpcHouseList => PlayerHouseList + (PlayerCount * PlayerHouse.SIZE); + public override int PlayerHouseList => GSaveLandStart + 0x2DC238; + public override int NpcHouseList => GSaveLandStart + 0x40E238; + public override int BulletinBoard => GSaveLandStart + 0x416190; - public override int TurnipExchange => 0x412060; // +0x7A0 from v1.0 - public override int RecycleBin => 0xABDE70; // +0x1E70 from v1.0 - public override int LastSavedTime => RecycleBin + 0x4958; + public const int GSaveShop = GSaveLandStart + 0x40F480; + public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop + #endregion + + #region GSaveLandOther + public const int GSaveLandOtherStart = 0x4FAA80; + + public override int LostItemBox => GSaveLandOtherStart + 0x5C33F0; + public override int LastSavedTime => GSaveLandOtherStart + 0x5C7D48; + #endregion } } diff --git a/NHSE.Core/Save/Offsets/MainSaveOffsets12.cs b/NHSE.Core/Save/Offsets/MainSaveOffsets12.cs index 1566ad9..5febfbc 100644 --- a/NHSE.Core/Save/Offsets/MainSaveOffsets12.cs +++ b/NHSE.Core/Save/Offsets/MainSaveOffsets12.cs @@ -5,24 +5,36 @@ /// public class MainSaveOffsets12 : MainSaveOffsets { - public override int Villager => 0x120; - public override int Patterns => 0x1D7310; - public override int PatternsPRO => Patterns + (PatternCount * DesignPattern.SIZE); + #region GSaveLand + public const int GSaveLandStart = 0x110; + public override int Animal => GSaveLandStart + 0x10; + + public override int LandMyDesign => GSaveLandStart + 0x1D7200; + public override int PatternsPRO => LandMyDesign + (PatternCount * DesignPattern.SIZE); public override int PatternFlag => PatternsPRO + (PatternCount * DesignPatternPRO.SIZE); - public override int EventFlagLand => FieldItem - 0x800; + public override int EventFlagLand => GSaveLandStart + 0x20100C; // GSaveMainField - public override int FieldItem => 0x20191C; - public override int Terrain => Buildings - 0x24C00; - public override int Buildings => 0x2D0F1C; - public override int Acres => 0x2D12B4; + public const int GSaveMainFieldStart = GSaveLandStart + 0x20180C; + public override int FieldItem => GSaveMainFieldStart + 0x00000; + public override int LandMakingMap => GSaveMainFieldStart + 0xAAA00; + public override int MainFieldStructure => GSaveMainFieldStart + 0xCF600; + public override int OutsideField => GSaveMainFieldStart + 0xCF998; - public override int PlayerHouseList => FieldItem + 0xDAA2C; - public override int NpcHouseList => PlayerHouseList + (PlayerCount * PlayerHouse.SIZE); + public override int PlayerHouseList => GSaveLandStart + 0x2DC238; + public override int NpcHouseList => GSaveLandStart + 0x40E238; + public override int BulletinBoard => GSaveLandStart + 0x416440; - public override int TurnipExchange => 0x412060; - public override int RecycleBin => 0xACA0A0; // +0xC230 from v1.1 - public override int LastSavedTime => RecycleBin + 0x4958; + public const int GSaveShop = GSaveLandStart + 0x40F480; + public override int ShopKabu => GSaveShop + 0x2AD0; // part of shop + #endregion + + #region GSaveLandOther + public const int GSaveLandOtherStart = 0x4FAD30; + + public override int LostItemBox => GSaveLandOtherStart + 0x5CF370; + public override int LastSavedTime => GSaveLandOtherStart + 0x5D3CC8; + #endregion } } diff --git a/NHSE.Core/Structures/Villager/Villager.cs b/NHSE.Core/Structures/Villager/Villager.cs index 721d102..5e0acbb 100644 --- a/NHSE.Core/Structures/Villager/Villager.cs +++ b/NHSE.Core/Structures/Villager/Villager.cs @@ -6,6 +6,8 @@ namespace NHSE.Core { public class Villager : IVillagerOrigin { + public const int SIZE = 0x12AB0; + public readonly byte[] Data; public Villager(byte[] data) => Data = data;